【问题标题】:Specify multiple loss function for model compilation in Keras为 Keras 中的模型编译指定多重损失函数
【发布时间】:2018-12-16 13:58:17
【问题描述】:

我想为交叉熵的对象类指定 2 个损失函数,另一个为均方误差的边界框指定。如何在model.compile中指定每个输出对应的损失函数?

model = Sequential()

model.add(Dense(128, activation='relu'))
out_last_dense = model.add(Dense(128, activation='relu'))
object_type = model.add(Dense(1, activation='softmax'))(out_last_dense)
object_coordinates = model.add(Dense(4, activation='softmax'))(out_last_dense)

/// here is the problem i want to specify loss function for object type and coordinates
model.compile(loss= keras.losses.categorical_crossentropy,
   optimizer= 'sgd', metrics=['accuracy'])

【问题讨论】:

    标签: python tensorflow keras deep-learning


    【解决方案1】:

    首先,你不能在这里使用 Sequential API,因为你的模型有两个输出层(即你写的都是错误的并且会引发错误)。相反,您必须使用Keras Functional API:

    inp = Input(shape=...)
    x = Dense(128, activation='relu')(inp)
    x = Dense(128, activation='relu')(x)
    object_type = Dense(1, activation='sigmoid', name='type')(x)
    object_coordinates = Dense(4, activation='linear', name='coord')(x)
    

    现在,您可以根据上面给出的名称并使用字典为每个输出层指定损失函数(以及指标):

    model.compile(loss={'type': 'binary_crossentropy', 'coord': 'mse'}, 
                  optimizer='sgd', metrics={'type': 'accuracy', 'coord': 'mae'})
    

    此外,请注意,您使用的是 softmax 作为激活函数,我已将其更改为上面的 sigomidlinear。这是因为:1)在具有一个单元的层上使用 softmax 没有意义(如果有超过 2 个类,那么您应该使用 softmax),以及 2)另一层预测坐标,因此使用 softmax 根本不适合(除非问题表述允许您这样做)。

    【讨论】:

      猜你喜欢
      • 2020-09-07
      • 2020-02-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2019-06-17
      • 1970-01-01
      • 2018-03-19
      相关资源
      最近更新 更多