首页 > 代码库 > TensorFlow调试之一种很笨但行之有效的调试方案

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给正好吧==

<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

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