我正在尝试调试一个有点复杂和非规范的NN架构.计算前向传递很好,并且给我预期的结果,但是当我尝试使用Adam或任何标准优化器进行优化时,即使在一次学习率非常小的迭代之后,我也无处不在.我正试图将它们本地化,并且想知道是否有办法捕获第一次出现的纳米并检测它出现在哪个操作中?我试过tf.add_check_numerics_ops()但它似乎没有做任何事情,或者我可能错误地使用它.
我想到的用例是在经过预先训练的网络中添加更多层,我想调整整个网络。但是,我希望新添加的层比现有的层具有更高的学习率。在TensorFlow中可以这样做吗?
在通常的TensorFlow训练循环中,例如
train_op = tf.train.AdamOptimizer().minimize(cross_entropy)
with tf.Session() as sess:
for i in range(num_steps):
# ...
train_op.run(feed_dict = feed_dict)
Run Code Online (Sandbox Code Playgroud)
train_op.run回报None.
但是,有时收集中间结果很有用,例如目标值或准确度.
添加额外的sess.run调用需要再次进行前向传播,从而增加运行时间:
train_op = tf.train.AdamOptimizer().minimize(cross_entropy)
with tf.Session() as sess:
for i in range(num_steps):
# ...
o, a = sess.run([objective, accuracy], feed_dict = feed_dict)
train_op.run(feed_dict = feed_dict)
Run Code Online (Sandbox Code Playgroud)
是否可以一次性在TensorFlow中执行此操作?
编辑:
人们建议
sess.run([objective, accuracy, train_op], feed_dict = feed_dict)
Run Code Online (Sandbox Code Playgroud)
但结果取决于列表元素的执行顺序:
[objective, accuracy, train_op]
Run Code Online (Sandbox Code Playgroud)
这似乎是未定义的 - 根据是否使用CUDA,您会得到不同的结果.