写之前吐个槽,我又把tf.nn.softmax_cross_entropy_with_logits的参数赋反了,折腾了一晚上。。。这篇文章主要讨论TensorFlow中训练指定变量的问题。这篇博客给了个非常巧妙的方法,简单记录一下。

1. 查看可训练的参数及其index

tf.trainiable_variables里存储了可以用于训练的变量,利用如下方法可以打印出它们的信息,

1
2
3
4
5
6
7
variables_names = [v.name for v in tf.trainable_variables()]
values = sess.run(variables_names)
i = 0
for k, v in zip(variables_names, values):
print(i, "Variable: ", k)
print("Shape: ", v.shape)
i += 1

2. 建立train options,并为其提供不同的trainable lists

假设有两个loss function,分别对应网络中不同区域的变量,为了实现梯度的有效传递,可以利用如下方法,

1
2
3
4
5
6
loss1 = ...
loss2 = ...
var_list1 = tf.trainable_variables()[0:10]
var_list2 = tf.trainable_variables()[10:]
train_op1 = tf.train.AdamOptimizer(learning_rate).minimize(loss1, var_list=var_list1)
train_op2 = tf.train.AdamOptimizer(learning_rate).minimize(lose2, var_list=var_list2)

reference

[1] [tensorflow] 在不同层上设置不同的学习率,fine-tuning