TensorFlow从诞生以来就一直在深度学习框架中稳居老大的位置,虽然自从2018年12月PyTorch 1.0 stable版本正式发布以来,很快减小了差距,但是也难以超越。

TensorFlow的强项在于部署(包括TensorFlow Lite在移动端部署)和运行效率,另外对各种operation的支持特别齐全,基本上你能想到的算子都已经实现好了,直接调用就好。除此之外,Google Brain的各项前沿研究,以及现在DeepMind的很多研究,开源代码肯定都是基于TensorFlow,比如现在很火的AutoML技术等等,所以成为No.1也是自然而然。

但是又不得不吐槽其调试功能,真是太难用了。这也直接导致了TensorFlow的学习曲线异常之陡,和vim的类似,学起来很难很痛苦,但是学好之后,那是相当地爽。

那么,TensorFlow怎么调试呢?使用断点还是print?亦或是高大上的tfdbg?都不是。

由于TensorFlow静态图的设计(eager模式除外,这个后面单独讨论),设置断点根本无法获取实际tensor的值,具体取值都在后台以C++的方式执行。那print呢?也只能打印出tensor的shape信息。tfdbg,这个官方开发的专用工具该行了吧?不过我建议还是不要尝试了,不仅要一点一点敲命令,我在debug大型程序的时候,直接卡死。

对了,还有一种暴力方法,我最开始的时候在使用,就是把tensor拉出来sess.run一把,这样的确可以得到tensor运行的具体值,但是每次要手动改,很麻烦。

好了,神器要出来了:tf.Print. 在老版本的TensorFlow中可以这么用,非常方便:

x = tf.Print(x, [x, x,shape, x[0], …], message=“x debug info”, summarize=100)

其中,x是需要打印的tensor,注意第一个输入是x和输出相同,但其实也可以不同,做一些操作,但一般debug不需要,所以等式左边的输出也是x.

第二个输入在方括号内表示需要打印的东西,可以是tensor x的具体值,或者是其shape,slice,甚至是函数。

第三个输入message用来标识这一处打印,可以自定义字符串。

最后的summarize控制输出元素的数量,比如100就输出x的前100个元素。

对于新版的TensorFlow,使用tf.print,语法如下:

print_op = tf.print(x)

with tf.control_dependencies([print_op]):

out = tf.add(x, x)

sess.run(out)

很方便吧?

虽然不如直接在PyCharm中设置断点方便,但能把tensor打印出来定位问题也就容易多了。当然,如果是学习代码,想单步跟踪,建议使用eager模式,这就和PyTorch的方式非常相近了,当然,牺牲的是运行效率。

联系我:

邮箱guanxs_ai@126.com

微信公众号:AI人工智能与大数据

TensorFlow调试技巧相关推荐

  1. 转:Python 代码调试技巧

    Python 代码调试技巧 转载于:https://www.cnblogs.com/kira2will/p/4254754.html

  2. 你可能不知道的 IDEA 高级调试技巧

    作者:十光年 www.cnblogs.com/jun1019/p/9741224.html 一.条件断点 循环中经常用到这个技巧,比如:遍历1个大List的过程中,想让断点停在某个特定值. 参考上图, ...

  3. Javascript调试技巧整理

    整理一下网上看到的实用调试技巧! 1. 不要使用alert 首先,alert只能打印出字符串,如果打印的对象不是String,则会调用toString()方法将该对象转成字符串(比如转成[object ...

  4. iphone XCode调试技巧之EXC_BAD_ACCESS中BUG解决

    http://mobile.51cto.com/iphone-279455.htm XCode调试技巧之EXC_BAD_ACCESS中BUG解决是本文要介绍的内容,在iphone开发的时候EXC_BA ...

  5. Flutter调试技巧总结——高效开发的秘密

    刚开始学前端的时候看到大家都是用的console.log()作为调试的手段,也可以说,很多人只会用console.log().在学习Flutter开发app的时候,我就在思考,除了使用print()来 ...

  6. [Cocoa]XCode的一些调试技巧

    XCode的一些调试技巧 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 XCode 内置GDB,我 ...

  7. 你所不知道的 Android Studio 调试技巧

    Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样, ...

  8. Postman 调试技巧

    Postman 调试技巧 最为一个最基础的猿,我相信你已经掌握的一般接口使用Postman请求了. 如果你还在为下面问题发愁,你可以读下去. 1.后台验证通过请求header中的动态token. 2. ...

  9. 反调试技巧总结-原理和实现(1)(2)(3)(4)(5)(6)......

    反调试技巧总结-原理和实现 -------------------------------------------------------------------------------------- ...

最新文章

  1. 制作rhel的yum仓库
  2. linux问题排查常用命令详解
  3. pythonrequest得替代_Python爬虫通过替换http request header来欺骗浏览器实现登录功能...
  4. Google Guava库必需品
  5. 针对IE的CSS hack 全面 实用
  6. scrum项目协作是什么_什么是小型Scrum?
  7. Linux学习笔记(七)Linux常用命令:挂载命令
  8. Axure RP 9基础教程(3)——添加图标元件
  9. 网页设计软件列表HTML,【网站设计用什么软件】网页设计软件具体有哪些,常见的十种网页设计软件介绍!...
  10. Windows官方镜像大全---【内附网盘链接】
  11. CImageList用法介绍
  12. 多语言国家与缩写映射表
  13. 使用js实现百度地图与高德地图经纬度的转换
  14. 计算思维不是计算机科学的核心素养,信息技术学科核心素养
  15. Revealing the Invisible with Model and Data Shrinking for Composite-database Micro-expression Recogn
  16. 记一次线上OOM问题分析与解决,涨知识了!
  17. linux mysql 登录报1045_【mysql】linux登录MySQL_报错ERROR_1045_(28000)解决办法
  18. C语言-函数-学会方程你的数学能力会乘风破浪突飞猛进-学会函数你的编程能力将百尺竿头更进一步
  19. Altium Designer 导入PCB库
  20. Java鸡兔同笼问题

热门文章

  1. WPF限制TextBox只能输入数字
  2. Python爬虫获取简书的用户、文章、评论、图片等数据,并存入数据库
  3. 【wpf】DataGrid的使用
  4. 将课程表导入日历,实现电脑手机日程同步
  5. 如何在虚拟机Ubuntu下使用主机网络
  6. sql sever 2012express安装教程
  7. Dapp及相关开发工具介绍
  8. DNT论坛整合笔记二
  9. 手机二要素api接口是什么?有哪些使用场景?一文带你搞清楚
  10. 第一个算法项目 | JS实现并查集迷宫算法Demo学习