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

时间: 2024-10-07 20:50:28

TensorFlow调试之一种很笨但行之有效的调试方案的相关文章

一个很笨的方法,写脚本来实现自动调dmp,找有用的数据

很久很久以前用到的方法, 方法挺笨的,但是算是比较实用吧. 全自动的调试dmp,最后只要结果. 谁用得着就给谁看吧. 这里需要两个脚本 1:启动脚本,是一个批处理文件,用来启动调试器,来加载dmp和调试脚本. 2:调试脚本,是一个windbg脚本文件,用来操作调试器,是真正工作的脚本. 现在开始说明脚本内容. 1:启动脚本模板 for /f %%i in ('dir "要获取的dmp文件,可以加通配符* "  /s /b') do (cd /d "调试器路径"cdb

一种基于TLS的高级反调试技术

盗版行为日益猖獗,严重影响到软件开发者和开发商的知识产权及利益,反盗版技术的重要性也越来越引起人们的重视.在反盗版技术中,起最大作用的当属反调试技术.然而传统的反调试技术都存在一个弱点:他们都在程序真正开始执行之后才采取反调试手段.实际上在反调试代码被执行前,调试器有大量的时间来影响程序的执行,甚至可以在程序入口处插入断点命令来调试程序.对于使用C/C++语言编译的程序来说,问题通常会更严重,在执行到main()函数之前,会执行C/C++编译器插入的很大一段代码,这也给调试器带来影响程序执行的机

根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐

1 background_image_filename = 'blackground.png' 2 black_mouse_image_filename = 'black.png' 3 white_mouse_image_filename = 'white.png' 4 restart_icon_filename='restart.png' 5 pingju_icon_filename='pingju.jpg' 6 win_icon_filename='win.jpg' 7 lose_icon_

反调试技术- IsDebuggerPresent,原理 与 反反调试

IsDebuggerPresent 这个函数可以用在程序中,检测当前程序是否正在被调试,从而执行退出等行为,达到反调试的作用. 1.IsDebuggerPresent 这个函数从汇编的角度看,就是一下三句代码.下面依次来分析这三句代码的原理. 75593789 K> 64:A1 18000000 mov eax, dword ptr fs:[18] 7559378F 8B40 30 mov eax, dword ptr [eax+30] 75593792 0FB640 02 movzx eax,

调试,高级--step into my code ,只调试自己写的代码,shux,各种step操作debug

调试,高级--step into my code ,只调试自己写的代码,shux,各种step操作debug debug调试IDEA step into mycode fram drop 可以扔掉栈帧,从新开始,但是有全局变量观察变化必须重头开始 step out 结束当前方法的调试调到这个方法所在代码行的下一行 step in /force in 可以调试源代码 step over 如果代码片段有方法,跳过方法的执行过程,也就是不调试方法的执行过程 step over 和 step in 联合

unity5打包机制下,一种资源打ab和资源管理的方案

unity5打包机制下,一种资源打ab和资源管理的方案.1.打ab: 1.设置平台 2.清楚所有资源的assetbundlename: string[] abNameArr = AssetDatabase.GetAllAssetBundleNames(); AssetDatabase.RemoveAssetBundleName(abNameArr[i],true); 3.创建ab目录 4.根据配置把需要打包的资源找出来,对每一个setAbName 5.调用BuildPipeline.BuildA

Linux下adb驱动问题Linux下使用手机USB调试模式连接ADB进行Android程序的调试

Linux 下adb 驱动问题 Linux下使用手机USB调试模式连接ADB进行Android程序的调试,配置驱动没有Windows来的直观. 具体步骤首先确认手机连接上电脑,lsusb查看下设备记录. [email protected]:~$ lsusb Bus 007 Device 009: ID 18d1:4e12 Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 006 Device 001: ID 1d

VS code 进行 flutter 调试时启动后就停止,无法调试的问题

在编写flutter时,更新需要按 r 或着 R,这就有点麻烦,当然强大的VS code给我们提供了自动更新的功能,那就是调试功能. 在VS code的左边图标中有一个小虫子的图标,点击即可进行调试,如果我们直接点击调试的绿色开始按钮,调试会启动几秒就自动停止,调试控制台也会报错,这是需要进行配置. 如上图,点击有绿色启动按钮旁的选择框,会弹出配置选项,一开始,我们flutter应用所在文件夹不再配置中,就要点击最下面的添加配置(工作区),进行添加配置.点击后会出现一个wokespace.jso

雷观(八):等我有钱了再付费,是一种很扯淡很没有远见的想法

在从事软件互联网相关行业6年多以来,很少发现有人有"付费"的意识,虽然他们是IT相关产业的劳动者. 在我的一些QQ好友和很多潜在客户中,有些人持有这样一种观点:"等我有钱了,再付费". 对于这种观点,我想认真地吐槽几句: 1. 很多人说这种话,想表达的意思是,"我非常想支持你,但不是现在".    这种人生活中真的是太多了,更通俗一点就是,"我精神上支持你,行动上不支持你". 2. 等我有钱了.    这句话,是对未来的一种美