使用tf.train.optimizer后,如何在列车步骤后捕获重量更新?
可以获得渐变,但除了找到之前副本的权重差异之外,我找不到任何有效的方法。由于我将权重存储为字典的一部分,密钥是隐藏层,值是权重列表,因此变得乏味。
weights = {
'h1': tf.Variable(tf.random_normal([n_input, n_hidden_1], 0, 0.1)),
'h2': tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2], 0, 0.1)),
'out': tf.Variable(tf.random_normal([n_hidden_2, n_classes], 0, 0.1))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1], 0, 0.1)),
'b2': tf.Variable(tf.random_normal([n_hidden_2], 0, 0.1)),
'out': tf.Variable(tf.random_normal([n_classes], 0, 0.1))
}
答案 0 :(得分:0)
print(sess.run(weights['h1']))
在每个时代的循环结束时。
答案 1 :(得分:0)
我认为最简单的方法是在训练步骤之前和之后捕捉所有可训练变量的快照并获得差异:
with tf.Session() as session:
...
def get_snapshot():
return {var: value for var, value in zip(tf.trainable_variables(), session.run(tf.trainable_variables()))}
...
snapshot_before = get_snapshot()
session.run([optimizer], feed_dict={x: train_x, y: train_y})
snapshot_after = get_snapshot()
for var in tf.trainable_variables():
print var.name, ' -> ', (snapshot_after[var] - snapshot_before[var])
如果通过context manager实现,这看起来会更好。
在效率方面,这需要两次额外的session.run()
次调用,但这比逐个评估每个变量要好得多。