在Keras中为模型编译指定多重损失函数

时间:2018-12-16 13:58:17

标签: python tensorflow keras deep-learning

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

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'])

1 个答案:

答案 0 :(得分:2)

首先,由于模型具有两个输出层(即,您编写的内容都是错误的,会引发错误),因此您不能在此处使用顺序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没有意义(如果有两个以上的类,则应使用softmax),并且2)另一层预测坐标,因此使用softmax根本不适合(除非问题表述允许您这样做。