【问题标题】:CNN loss with multiple outputs?具有多个输出的 CNN 损失?
【发布时间】:2020-12-28 00:05:24
【问题描述】:

我有以下型号

def get_model():
epochs = 100
learning_rate = 0.1
decay_rate = learning_rate / epochs

inp = keras.Input(shape=(64, 101, 1), name="inputs")
x = layers.Conv2D(128, kernel_size=(3, 3), strides=(3, 3), padding="same")(inp)
x = layers.Conv2D(256, kernel_size=(3, 3), strides=(3, 3), padding="same")(x)
x = layers.Flatten()(x)
x = layers.Dense(150)(x)
x = layers.Dense(150)(x)
out1 = layers.Dense(40000, name="sf_vec")(x)
out2 = layers.Dense(128, name="ls_weights")(x)

model = keras.Model(inp, [out1, out2], name="2_out_model")

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=decay_rate),  # in caso rimettere 0.001
              loss="mean_squared_error")

keras.utils.plot_model(model, to_file='model.png', show_shapes=True, show_layer_names=True)
model.summary()

return model

也就是说,我想根据第一个输出的损失和第二个输出的损失的“混合”来训练我的神经网络。 我以这种方式训练我的神经网络:

model.fit(x_train, [sf_train, ls_filters_train], epochs=10)

例如,在训练期间,如下所示: 纪元 10/10 -> 损失:0.0702 - sf_vec_loss:0.0666 - ls_weights_loss:0.0035

我想知道“损失”是否几乎是 sf_vec_loss 和 ls_weights_loss 之间的总和,或者 keras 是否真的以这种方式推理。 此外,网络是否仅针对“损失”进行训练? 提前谢谢你:)

【问题讨论】:

    标签: python tensorflow keras neural-network conv-neural-network


    【解决方案1】:

    遵循 Tensorflow Documentation...

    来自loss 参数:

    如果模型有多个输出,您可以使用不同的损失 每个输出通过传递字典或损失列表。亏损 将被模型最小化的值将是所有的 sum 个人损失

    还请记住,您还可以加权不同模型输出的损失贡献

    来自loss_weights 参数:

    模型将最小化的损失值将是 所有单个损失的加权总和,由 loss_weights 系数加权

    【讨论】:

      猜你喜欢
      • 2019-05-19
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-20
      • 2020-02-29
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      相关资源
      最近更新 更多