【发布时间】:2018-09-10 01:10:13
【问题描述】:
我正在尝试制作一个分别输出深度图和语义分割数据的网络。
为了训练网络,我想对分割分支使用分类交叉熵,对输出深度图的分支使用均方误差。
我在功能 API 的 Keras 文档中找不到任何有关为每个分支实现两个损失函数的信息。
我是否可以在训练期间同时使用这些损失函数,或者我最好分别训练不同的分支?
【问题讨论】:
标签: machine-learning neural-network computer-vision keras
我正在尝试制作一个分别输出深度图和语义分割数据的网络。
为了训练网络,我想对分割分支使用分类交叉熵,对输出深度图的分支使用均方误差。
我在功能 API 的 Keras 文档中找不到任何有关为每个分支实现两个损失函数的信息。
我是否可以在训练期间同时使用这些损失函数,或者我最好分别训练不同的分支?
【问题讨论】:
标签: machine-learning neural-network computer-vision keras
来自Model.compile的documentation:
loss: 字符串(目标函数的名称)或目标函数。看 losses。如果模型有多个输出,您可以使用不同的 通过传递字典或损失列表来对每个输出进行损失。这 模型将最小化的损失值将是 所有个人损失。
如果您的输出被命名,您可以使用字典将名称映射到相应的损失:
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')
【讨论】:
class_weight只适用于训练集。
class_weight 参数或样本权重,那么是的,您的验证损失由与训练损失相同的函数计算。也许您可以在自定义损失中使用K.in_train_phase() 函数。