我正在尝试建立一个分别输出深度图和语义分割数据的网络。
为了训练网络,我想对分割分支使用分类交叉熵,并为输出深度图的分支使用均方误差。
我找不到有关在Functional API的Keras文档中为每个分支实现两个损失函数的任何信息。
我是否有可能在训练期间同时使用这些损失功能,或者我可以更好地分别训练不同的分支?
答案 0 :(得分:6)
来自Model.compile
的{{3}}:
损失:字符串(目标函数的名称)或目标函数。看到 documentation。如果模型有多个输出,则可以使用不同的输出 通过字典或损失列表输出每个输出。该 然后,模型将最小化的损失值将是总和 所有个人损失。
如果您的输出已命名,则可以使用将名称映射到相应损失的字典:
x = Input((10,))
out1 = Dense(10, activation='softmax', name='segmentation')(x)
out2 = Dense(10, name='depth')(x)
model = Model(x, [out1, out2])
model.compile(loss={'segmentation': 'categorical_crossentropy', 'depth': 'mse'},
optimizer='adam')
否则,使用损失列表(与相应的模型输出的顺序相同)。
x = Input((10,))
out1 = Dense(10, activation='softmax')(x)
out2 = Dense(10)(x)
model = Model(x, [out1, out2])
model.compile(loss=['categorical_crossentropy', 'mse'], optimizer='adam')