这两天使用TensorFlow训练一个多个损失函数的网络模型,自己搭建网络,调参训练,由于网络是一个两阶段的网络,具有三个损失函数,其中两个损失函数监督第一个阶段,一个损失函数家督第二个阶段,而且损失函数监督的并不全是最后一层,还有中间层,这需要调整我的训练方式。

训练方式

  1. 先分别训练第一阶段的两个损失函数
  2. 固定住第一阶段的网络的参数,只训练第二阶段网络参数
  3. 调整三个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,
                                scope="block15|block16|block17|block18|block19|block20|block21|block22|block23|block24")
self.train_op3 = optimizer.minimize(self.loss3, var_list=update_ops3)

也就是在tf.get_collection()的变量中scope赋予需要更新的值,当不指定时默认值为none,这时网络会更新全部的参数。这里需要注意的是:

  1. 原来的tf.GraphKeys.UPDATE_OPS已经修改为tf.GraphKeys.TRAINABLE_VARIABLES,实践证明不修改会报错,我不太清楚两者的本质区别,需要后续学习
  2. 这里的block*是我封装好的层
  3. 多个封装的scope之间用‘|’上述的scope=“block15|block16|block17|block18|block19|block20|block21|block22|block23|block24” 应该还有更简便的写法,不过这样也可以达到目的

tensorboard可视化结果

上述操作后依然不放心,不知道是不是整的达到了目的,我使用了两种方法进行验证,第一种是训练一下,使用tensorboard的distributions或者histograms模块看看除了指定的层之外其他的层有没有改变,事实证明没有改变。
除此之外,还发现了另外一种方式就是看GRAPHS,如下图所示,我使用了四次不同了优化,因此图中有四个不同的优化器和梯度,其中gradient_2就是我优化self.loss的梯度,可以从图的右边看出,梯度是传播到了每一个block的。
TensorFlow 训练多个loss函数技巧: 训练步骤,冻结部分层(freeze some scopes),从tensorboard检查问题

而下图是我固定了低层的参数只是训练后面层的参数时的梯度gradient_3,显然图的右边可以看出只在局部指定的层传播,这回放心了。
TensorFlow 训练多个loss函数技巧: 训练步骤,冻结部分层(freeze some scopes),从tensorboard检查问题

以上是自己的学习结果,如有错误请大家不吝赐教。

相关文章:

  • 2022-12-23
  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
  • 2022-01-21
  • 2021-09-27
  • 2022-01-18
猜你喜欢
  • 2022-12-23
  • 2021-10-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-30
相关资源
相似解决方案