我正在接受有关如何调试Tensorflow在挂起时遇到的问题的建议。
我有一个挂在global_variables_initializer()上的多层CNN在会话中运行。我在控制台输出上没有收到任何错误或消息。
是否有一种智能方式可以调试Tensorflow在挂起时遇到的问题,而不是反复注释掉生成图表的代码行,并重新运行以查看它挂起的位置。 TensorFlow调试器(tfdbg)会有帮助吗?我有什么选择?
理想情况下,仅仅打破当前执行并查看某些堆栈或类似内容以查看init期间执行挂起的位置会很棒。
我目前正在Jupiter笔记本中使用Python 3运行Tensorflow 0.12.1。
答案 0 :(得分:1)
我设法解决了这个问题。来自@ amo-ej1的提示在常规文件中运行是朝着正确方向迈出的一步。这揭示了张量流程正在用SIGKILL自杀,并返回错误代码137.
我尝试了Tensorflow Debugger tfdbg 虽然这没有提供任何进一步的细节,因为问题是图形没有初始化。我开始认为图形结构不正确,所以我使用以下方法抛出图形结构:
tf.summary.FileWriter('./logs/traing_graph', graph)
然后我用Tensorboard检查从目录中转出的结果汇总图结构数据,发现完全连接层的张量尺寸错误,宽度为1500万!! !! (错)
事实证明,图表的其中一个可配置参数不正确。它正在从错误的寻址前一个tf.shape类型属性中错误地选择第2层张量形状的尺寸,并且它展开了图形的尺寸。
/var/log/system.log中没有OOM错误消息,所以我不确定为什么图初始化导致python tensorflow脚本进程死亡。
我修复了图形的尺寸,图形初始化工作正常!
我的顶级提示是在初始化和训练之前使用Tensorboard可视化您的图形,以快速检查您编码的结果图形结构,使其符合您的预期。你可能会节省很多时间! : - )
答案 1 :(得分:0)
调试张量流的常用方法是用numpy数组替换占位符和/或变量,并将它们放在tf.const中。执行此操作时,您可以通过设置断点并查看“pythoninc”中的数字而不仅仅是张量来检查代码的逻辑。如果你在这里发布你的代码会更容易帮助你,但这是一个虚拟的例子:
with tf.name_scope('scope_name'):
### This block is for debug only
import numpy as np
batch_size = 20
sess = tf.Session()
sess.run(tf.tables_initializer())
init_op = tf.global_variables_initializer()
sess.run(init_op)
### End of first debug block
## Replacing Placeholders for debug - uncomment the placehlolders and comment the numpy arrays to producation mode
const_a = tf.constant((np.random.rand(batch_size, 26) > 0.85).astype(int), dtype=tf.float32)
const_b = tf.constant(np.random.randint(0, 20, batch_size * 26).reshape((batch_size, 26)), dtype=tf.float32)
# real_a_placeholder = tf.log(input_placeholder_dict[A_DATA])
# real_b_placeholder = tf.log(input_placeholder_dict[B_DATA])
# dummy opreation
c = a - b
# selecting top k - in the sanity check you can see here that you actullay get the top items and top values
top_k = 5
top_k_values, top_k_indices = tf.nn.top_k(c,
k=top_k, sorted=True,
name="top_k")
## Replacing Variable for debug - uncomment the variables and comment the numpy arrays to producation mode
现在,使用断点运行代码,您有2个选项可以在调试器中查看值: 1.的 sess.run( palceholder_name )强> 2.你可以使用eval - varaible_name.eval(sessnio = sess)