TensorFlow调试之一种很笨但行之有效的调试方案

Posted liuchongee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TensorFlow调试之一种很笨但行之有效的调试方案相关的知识,希望对你有一定的参考价值。

说道tensorflow调试,想必大家都是深受其扰,特别是对于新手而言。主要是因为其分为模型搭建和图运行两个阶段,而我们在使用一般的IDE进行调试时只能调试前半部分,即模型搭建环节。在这一环节中,往往我们所能看到的信息是有限的,比如只能看到Tensor的shape却看不到其具体值等等,但是这样的话我们就不知道模型搭建的是否完全正确(譬如仅shape对应的话,很多时候并不能表征模型正确无误)。
所以这两天我一直在寻找一种可行的调试方案,首先当然是官网首推的tfdbg,但是不知道是我环境有问题还是怎么回事,当配置好tfdbg运行的时候程序就会报出下面所示的错误:

File "/home/liuchong/.local/lib/python2.7/site-packages/tensorflow/python/debug/cli/curses_ui.py", line 244, in _screen_launch
    curses.cbreak()
_curses.error: cbreak() returned ERR

不过现在我还没有找到解决办法。所以只能暂时搁置,不过不得不说官网提供的tfdbg调试功能是很强大的,如果可以建议还是配置该环境。那么我们就退而求其次得来说一下我想出来得笨方法:
首先我们知道eval方法是可以在sess运行的时候将变量的值打印出来的。譬如这样:

a = tf.constant(5.0)  
b = tf.constant(6.0)  
c = a * b  
with tf.Session():
  print(c.eval())  

但是往往我们程序运行过程中变量通过placeholder或者variable函数定义,只有在op运行之后才会有值。所以我们应该在sess.run(train_op, feed_dict={…})之后再通过sess.run()函数将我们关心的值取出来。比如想下面这样:

embed_dim = 50
ws = [4, 5]
top_k = 4
k1 = 5
num_filters = [3, 14]
batch_size = 2
num_hidden = 100
sentence_length = 10
num_class = 6
lr = 0.01


def init_weights(shape, name):
    return tf.Variable(tf.truncated_normal(shape, stddev=0.01), name=name)

glove = emb.GloVe(N=embed_dim)

with tf.Session() as sess:
    sent = tf.placeholder(tf.int32, [batch_size, sentence_length])

    sent_embed = tf.nn.embedding_lookup(glove.g, sent)
    input_x = tf.reshape(sent_embed, [batch_size, sentence_length, embed_dim, 1])

    W1 = init_weights([ws[0], embed_dim, 1, num_filters[0]], "W1")
    b1 = tf.Variable(tf.constant(0.1, shape=[num_filters[0], embed_dim]), "b1")
    init = tf.global_variables_initializer().run()
    #赋值之后,我们可以使用eval()函数,将变量的值打印出来
    print W1.eval(), b1.eval()

    input_unstack = tf.unstack(input_x, axis=2)
    w_unstack = tf.unstack(W1, axis=1)
    b_unstack = tf.unstack(b1, axis=1)
    convs = []

    conv = tf.nn.relu(tf.nn.conv1d(input_unstack[0], w_unstack[0], stride=1, padding="SAME") + b_unstack[0])
    conv1 = tf.reshape(conv, [batch_size, num_filters[0], sentence_length])
    values, indices = tf.nn.top_k(conv1, k1, sorted=False)
    values1 = tf.reshape(values, [batch_size, k1, num_filters[0]])
    # k_max pooling in axis=1
    convs.append(values1)
    conv2 = tf.stack(convs, axis=2)
#通过sess.run()函数将想要的变量值取出,注意这里一定要记得使用feed_dict将相应的参数传递进去
    a, b, c ,d, e = sess.run([input_x, conv, conv1, values, indices], feed_dict={sent:[[1,2,3,4,5,6,7,8,9,10],[11,12,13,14,15,16,17,18,19,20]]})
    print a,b,c,d,e

但是,这样我们仅能实现通过传入简单的例子来测试程序模型输出是否满足我们的预期,但是无法做到真正意义上的调试。所以还是抽时间把tfdbg给正好吧==

以上是关于TensorFlow调试之一种很笨但行之有效的调试方案的主要内容,如果未能解决你的问题,请参考以下文章

你真的会正确地调试TensorFlow代码吗?

是否必须以调试方式编译 Tensorflow C++ DLL 才能根据它调试/运行代码?

tensorflow 确定性探针(又名调试工具)

tensorflow 调试

tensorflow 调试

如何在 TensorFlow 中调试 NaN 值?