Keras中含共享层模型的Model.fit行为探究
多输入多输出模型调用
model.fit([data1, data2], [labels1, labels2])的训练行为详解 嘿,这个问题问到点子上了!很多刚接触多任务/多输入输出模型的同学都会有这个疑惑,我来给你讲明白到底是怎么回事:
这种调用方式既不是交替训练两个神经网络,也不是先完整训完一个再训另一个,而是在每一个训练批次(batch)里,同步处理所有输入、计算所有输出的损失,合并总损失后一次完成反向传播更新参数。
具体来说,它的运作流程是这样的:
- 首先你的模型结构肯定对应了两个输入节点(分别接收
data1和data2),以及两个输出节点(分别对应labels1和labels2)——不管这两个分支是共享部分参数的多任务模型,还是完全独立的两个网络打包在一起。 - 每一轮(epoch)训练时,每个批次的
data1和data2会同时被喂进模型的对应输入分支,模型会同时生成两个输出结果。 - 接下来,模型会用你在
compile阶段为每个输出指定的损失函数,分别计算输出与labels1、labels2之间的损失值。 - 这两个损失会被合并成一个总损失(默认是直接相加,你也可以通过
compile的loss_weights参数给不同损失设置权重,比如让某个任务的损失占比更高)。 - 最后,基于这个总损失计算梯度,一次性更新模型中所有可训练的参数——如果是共享参数的多任务模型,共享层的参数会同时受到两个任务损失的影响;如果是完全独立的两个网络,梯度只会更新各自网络的参数,但这一步也是在同一个批次里同步完成的。
举个实际例子:假设你做一个多任务模型,一个分支处理用户的行为数据(data1)预测购买意愿(labels1),另一个分支处理用户的文本评论(data2)预测满意度评分(labels2),中间还有一个共享的用户特征提取层。那每一次批次训练,都是同时输入行为数据和评论数据,同时计算购买意愿的损失和满意度的损失,加起来之后反向传播,同时更新共享特征层和两个任务分支的所有参数。
简单总结:它是同步多任务训练,每一步都同时兼顾所有输入和输出任务的损失,而不是分开训练不同的网络。
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

