概述
代码样例
第一种情况
final_loss = tf.reduce_mean(loss1+loss2)
train_op = tf.train.AdamOptimizer().minimize(final_loss)
第二种情况
train_op1 = tf.train.AdamOptimizer().minimize(loss1)
train_op2 = tf.train.AdamOptimizer().minimize(loss2)
final_train_op = tf.group(train_op1 train_op2)
上述两种情况的差别分析
第一种情况是一种混合训练(joint training),这种方式是统一同时考虑多个loss的影响;这种方式常用在使用同一数据集进行训练,使用同一feature但是不同输出任务的模型训练过程中,比如目标检测领域的分类与回归任务要求采用同样的feature [1]。
第二种情况是一种选择性学习(alternative training),这并不是同时考虑两种loss的约束,而是试图在两种任务中取得某种平衡,一般而言会使用在模型有多个输出,但是这多个输出并不使用同样的feature;比如在指引第一个op时可能使用某些feature导致的结果,而在使用第二个op时可能使用的是另外一些featrue的结果。
上述两种情况可用下图进行归纳:
上图是 Alternative training,可见使用了不同的layer导出的结果
上图是 Joint training ,可见使用的是同样的feature进行的判断
如何选择上述两种方法
第二种方法常用于这样的场合: 你具有两种不同的数据集,并且需要执行不同的任务,但是网络设计的feature 提取部分确需要是相同的,比如你需要将英文转变为法文,与此同时你也需要模型能将同样的英文输入转为德文;但是这种方法的使用往往取决于你的样本数量,如果样本数量严重不匹配,比如法文数据集远大于德文数据集,那么训练时很容易造成同法文翻译相关的某些bias 难以适应德文,因而造成训练困难。
第一种方法适合于处理上述第二种方法的缺陷,这相当于是迫使loss做困难样本的在线挖掘并加强处理;另外采用第一种方法需要注意的是,如果存在有的loss 的返回值远小于其他loss的情况,如果在送入优化器之前直接相加这会导致这些loss的信息被忽略;一个有效的办法是采用第二种办法进行训练,同时采用Adam优化器,因为Adam优化器在loss输入后会进行normalize处理,同具体的loss值大小关系不大。
总的来说,我个人比较倾向于采用第二种方案来进行训练,因为大体上来讲可以将不同种类的loss设置不同的优化方案,并且在大多数情况下第二种和第一种的差距十分小。
参考文献
[1] https://jg8610.github.io/Multi-Task/
最后
以上就是耍酷纸飞机为你收集整理的Tensorflow 多个损失函数合成与多个损失函数多次操作的区别(Tensorflow: Multiple loss functions vs Multiple training ops)代码样例上述两种情况的差别分析如何选择上述两种方法参考文献的全部内容,希望文章能够帮你解决Tensorflow 多个损失函数合成与多个损失函数多次操作的区别(Tensorflow: Multiple loss functions vs Multiple training ops)代码样例上述两种情况的差别分析如何选择上述两种方法参考文献所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复