这两天使用TensorFlow训练一个多个损失函数的网络模型,自己搭建网络,调参训练,由于网络是一个两阶段的网络,具有三个损失函数,其中两个损失函数监督第一个阶段,一个损失函数家督第二个阶段,而且损失函数监督的并不全是最后一层,还有中间层,这需要调整我的训练方式。
训练方式
- 先分别训练第一阶段的两个损失函数
- 固定住第一阶段的网络的参数,只训练第二阶段网络参数
- 调整三个loss函数的正则化参数,减小学习率同时训练三个loss函数进行精调
冻结部分层(固定低层参数)
第一步和最后一步都好说,假设定义好了三个loss函数分别为self.loss1,self.loss2,self.loss3和加入正则化后的整个网络的损失函数self.loss,那么第一步和第三步的实现实例为
optimizer = tf.train.AdamOptimizer(self.lr, beta=0.9, beta=0.999, name='AdamOptimizer')
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_denpendencies(update_ops):
self.train_op = optimizer.minimize(self.loss)
这是我们常用的整个网络的参数都进行训练的方式,当需要固定低层的参数时,例如我有一个24层的网络,我需要固定1-14层,只更新15-24层,也就是上面的第二个步骤,则代码如下:
optimizer = tf.train.AdamOptimizer(self.lr, beta=0.9, beta=0.999, name='AdamOptimizer')
update_ops3 = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,

本文介绍了使用TensorFlow训练具有多个损失函数的深度学习模型时,如何训练不同阶段和部分层的方法。首先,分别训练第一阶段的两个损失函数,然后固定第一阶段参数训练第二阶段,最后进行整体精调。通过设置scope来冻结部分层,如1-14层,并使用TensorBoard的distributions和histograms模块验证参数是否更新。此外,通过查看GRAPHS模块的梯度传播情况来确认训练效果。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



