foolyc

tensorflow variable

tensorflow模型参数的赋值问题一直困扰很久,当我们不是从tensorflow 的saver恢复训练,而是其他框架的训练结果转化为numpy数组之后如何加载到tensorflow模型中呢?
最开始找到的不够灵活的初始化时更改的方式,但是不够灵活,今晚在剖析keras源码时终于找到了tensorflow给variable预留的底层api。

初始化时给定

这种是我最开始使用的,在创建变量时直接从目标数据h5f[‘model_weights’][‘convolution2d_1’][‘convolution2d_1_b:0’].value构建Variable,然后执行初始化OP即可。

1
2
3
4
tf.Variable(tf.convert_to_tensor(h5f['model_weights']['convolution2d_1']['convolution2d_1_b:0'].value))
# ...
sess = tf.Session()
sess.run(tf.initialize_all_variables())

assign修改

这种修改方式是新建一个placeholder,建立与placeholder关联的assign OP。

1
2
3
4
5
6
7
8
9
10
11
b=np.random.random([1,2,3,4])
a=tf.Variable(tf.zeros([1,2,3,4]), name="input")
sess.run(tf.initialize_all_variables())
print sess.run(a)
assign_placeholder = tf.placeholder(tf.float32, shape=[1,2,3,4])
assign_op = a.assign(assign_placeholder)
a._assign_placeholder = assign_placeholder
a._assign_op = assign_op
sess.run(assign_op, feed_dict={assign_placeholder: b})
print sess.run(a)

初始化后输出结果:

1
2
3
4
5
6
7
8
In [39]: print sess.run(a)
[[[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]]]

执行修改OP之后输出结果:

1
2
3
4
5
6
7
8
In [54]: print sess.run(a)
[[[[ 0.04836414 0.97368759 0.97675014 0.00999434]
[ 0.90186042 0.84165597 0.64201409 0.33373833]
[ 0.81753367 0.35324672 0.25877687 0.89179784]]
[[ 0.13113362 0.06181497 0.325885 0.96992481]
[ 0.42986828 0.14656019 0.81349605 0.40112963]
[ 0.13286915 0.0393969 0.86780035 0.37475502]]]]
本文由foolyc创作和发表,采用BY-NC-SA国际许可协议进行许可
转载请注明作者及出处,本文作者为foolyc
本文标题为tensorflow variable
本文链接为http://foolyc.com//2017/02/02/tensorflow-variable/.