本文翻译自: 《Debugging TensorFlow models》, 如有侵权请联系删除,仅限于学术交流,请勿商用。如有谬误,请联系指出。

与常规python代码相比,TensorFlow的符号特性使的TensorFlow的代码调试变得相对困难。这里我介绍一些TensorFlow附带的工具,使调试更容易。

使用TensorFlow时最常见的错误可能是传递形状错误的张量。许多TensorFlow操作可以在不同秩(rank)和形状(shape)的张量上操作。这在使用API时很方便,但在出现问题时可能会导致额外的麻烦。

例如,考虑下面这个tf.matmul操作,它可以使两个矩阵相乘:

a = tf.random_uniform([2, 3])
b = tf.random_uniform([3, 4])
c = tf.matmul(a, b)  # c is a tensor of shape [2, 4]
复制代码

但是下面这个函数也可以实现矩阵乘法:

a = tf.random_uniform([10, 2, 3])
b = tf.random_uniform([10, 3, 4])
tf.matmul(a, b)  # c is a tensor of shape [10, 2, 4]
复制代码

下面是我们之前在广播部分谈到的一个支持广播的添加操作的例子:

a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
c = a + b  # c is a tensor of shape [2, 2]
复制代码

使用tf.assert * 操作验证您的张量

减少不必要行为可能性的一种方法是使用tf.assert *操作验证中间张量的秩(rank)或形状(shape)。

a = tf.constant([[1.], [2.]])
b = tf.constant([1., 2.])
check_a = tf.assert_rank(a, 1)  # This will raise an InvalidArgumentError exception
check_b = tf.assert_rank(b, 1)
with tf.control_dependencies([check_a, check_b]):c = a + b  # c is a tensor of shape [2, 2]
复制代码

请记住,断言节点和其他操作一样都属于TensorFlow中图(Graph)的一部分,如果不进行评估,则会在执行Session.run()期间进行剔除。因此,请确保为断言操作创建显式依赖项,以强制TensorFlow执行它们。

你还可以在运行时使用断言验证张量的值:

check_pos = tf.assert_positive(a)
复制代码

有关断言操作的详细信息,请参阅官方文档。

使用tf.Print打印张量值

另一个对调试有帮助的内置函数是tf.Print,它可以将给定的张量记录到标准错误堆栈中:

input_copy = tf.Print(input, tensors_to_print_list)
复制代码

注意一下,tf.Print函数将其第一个参数的副本作为返回值输出。一种让tf.Print强制运行的方式是将其输出传递给另一个操作去执行。例如,如果我们想在添加它们之前就打印张量a和b的值,我们可以这样做:

a = ...
b = ...
a = tf.Print(a, [a, b])
c = a + b
复制代码

或者,我们可以手动定义控件依赖项。

利用tf.compute_gradient_error检查梯度变化的值

并不是TensorFlow中的所有操作都有梯度变化,并且很容易在无意中构建出TensorFlow无法计算梯度变化的图。

让我们来看个例子:

import tensorflow as tfdef non_differentiable_softmax_entropy(logits):probs = tf.nn.softmax(logits)return tf.nn.softmax_cross_entropy_with_logits(labels=probs, logits=logits)w = tf.get_variable("w", shape=[5])
y = -non_differentiable_softmax_entropy(w)opt = tf.train.AdamOptimizer()
train_op = opt.minimize(y)sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10000):sess.run(train_op)print(sess.run(tf.nn.softmax(w)))
复制代码

我们正在使用tf.nn.softmax_cross_entropy_with_logits定义一个分类分布上的熵。然后我们使用Adam优化器来找到具有最大熵的权重。如果你通过了信息论的课程,你就会知道均匀分布包含最大熵。所以你预计他的结果应该会是[0.2, 0.2, 0.2, 0.2, 0.2]。但是你执行这段代码的话会得到一个你意想不到的结果:

[ 0.34081486  0.24287023  0.23465775  0.08935683  0.09230034]复制代码

事实证明,tf.nn.softmax_cross_entropy_with_logits对标签有未定义的梯度变化!但是,如果我们不知道这个现象,我们又怎么能发现这个问题呢?

幸运的是,TensorFlow带有一个数值微分器,可用于查找符号梯度误差。让我们看看我们如何使用它:

with tf.Session():diff = tf.test.compute_gradient_error(w, [5], y, [])print(diff)复制代码

如果你运行它,你会发现数值和符号之间的差异非常大(我试了下大约为0.06 - 0.1)。

现在让我们更改下我们的函数并再次执行下:

import tensorflow as tf
import numpy as npdef softmax_entropy(logits, dim=-1):plogp = tf.nn.softmax(logits, dim) * tf.nn.log_softmax(logits, dim)return -tf.reduce_sum(plogp, dim)w = tf.get_variable("w", shape=[5])
y = -softmax_entropy(w)print(w.get_shape())
print(y.get_shape())with tf.Session() as sess:diff = tf.test.compute_gradient_error(w, [5], y, [])print(diff)复制代码

差异应该在0.0001左右,这个结果看起来好多了。

现在,如果再次使用正确的版本运行优化器,你可以看到最终权重为:

[ 0.2  0.2  0.2  0.2  0.2]复制代码

这就是我们想要的答案。

TensorFlow summaries和tfdbg(TensorFlow Debugger)是另外两个用于调试的工具,请参阅官方文档以了解更多信息。

【译】Effective TensorFlow Chapter11——在TensorFlow中调试模型相关推荐

  1. [译]Effective Kotlin系列之探索高阶函数中inline修饰符(三)

    简述: 不知道是否有小伙伴还记得我们之前的Effective Kotlin翻译系列,之前一直忙于赶时髦研究Kotlin 1.3中的新特性.把此系列耽搁了,赶完时髦了还是得踏实探究本质和基础,从今天开始 ...

  2. Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化

    Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化 目录 在Tensorflow的不同版本中实现Xavier参数权重初始化 Tensorflow1版本中实现

  3. 狗和披萨:使用TensorFlow.js在浏览器中实现计算机视觉

    目录 起点 托管说明 MobileNet v1 运行物体识别 终点线 下一步是什么?绒毛动物? 下载TensorFlowJS示例-6.1 MB TensorFlow + JavaScript.现在,最 ...

  4. 使用TensorFlow.js在浏览器中进行深度学习入门

    目录 设置TensorFlow.js 创建训练数据 检查点 定义神经网络模型 训练AI 测试结果 终点线 内存使用注意事项 下一步是什么?狗和披萨? 下载TensorFlowJS示例-6.1 MB T ...

  5. 使用face-api和Tensorflow.js在浏览器中进行AI年龄估计

    目录 性别和年龄检测 下一步是什么? 下载源-10.6 MB 在上一篇文章中,我们学习了如何使用face-api.js和Tensorflow.js在浏览器中对人的情绪进行分类. 如果您尚未阅读该文章, ...

  6. 安装自带python3.6的Anaconda3,并安装tensorflow,导入Pycharm中使用

    @实验笔记--记录实验中遇到的问题 直接安装自带python3.6的Anaconda3,并安装tensorflow,导入Pycharm中使用 之前看了很多博客中的教程,讲解如何在anaconda中安装 ...

  7. TensorFlow实战:TensorFlow中的CNN

    这里按照官方api介绍官方api点这里 卷积 不同的ops下使用的卷积操作总结如下: conv2d:Arbitrary filters that can mix channels together(通 ...

  8. 图像迁移风格保存模型_用TensorFlow.js在浏览器中部署可进行任意图像风格迁移的模型...

    风格迁移一直是很多读者感兴趣的内容之一,近日,网友ReiichiroNakano公开了自己的一个实现:用TensorFlow.js在浏览器中部署可进行任意图像风格迁移的模型.让我们一起去看看吧! Gi ...

  9. 用TensorFlow.js在浏览器中进行实时语义分割 | MixLab算法系列

    语义分割是监测和描绘图像中每个感兴趣对象的问题 当前,有几种方法可以解决此问题并输出结果 如下图示: 语义分割示例 这种分割是对图像中的每个像素进行预测,也称为密集预测. 十分重要且要注意的是,同一类 ...

最新文章

  1. css和js实现3d图片,JavaScript_纯JS实现旋转图片3D展示效果,CSS:style type=text/cssgt - phpStudy...
  2. Java 读写Properties配置文件(转)
  3. day1---python的基础特性
  4. Linux下的程序调试——GDB
  5. 验证集准确率上不去_Python机器学习之“模型验证”
  6. 对于怎么理解js中Event Loop,你可以看这篇文章
  7. rust显卡要求 steam_Steam夏促游戏销量排行,Epic称暂时不要买地平线黎明时分,虚幻5引擎配置要求不高,热血无赖电影开拍,Steam夏促育碧专区...
  8. 批量数据替换助手V2.0版发布,欢迎使用
  9. 最新聚合支付四方系统完整源码+修复大量BUG/新UI
  10. 多种方法破解Windows 系统密码
  11. Scala安装教程(windows和linux)
  12. 联想微型计算机m8000u配置,联想的产品介绍-20210412075714.pdf-原创力文档
  13. 2019 计蒜之道 初赛 第三场 - 淘宝商品价格大PK
  14. Euclid最大公因数算法及其扩展求逆元
  15. 详解磁盘配额的设置方法
  16. str.substring(0,str.length() -1)用法
  17. BUAACTF 2021校赛
  18. Charles抓包工具安装教程
  19. 物联网平台常见问题与答案汇总
  20. she was A Phantom Of Delight

热门文章

  1. Windows2008r2如何关闭防火墙
  2. 网络工程师应该掌握的知识要点
  3. 如何在DOS下用TCP/IP协议进行登录Windows 2K?
  4. 图片轮播器(swift)
  5. dev.c drv.c bus.c
  6. BOOST 线程完全攻略 - 扩展 - 可被关闭的线程类
  7. 深入理解VMware虚拟网络
  8. JavaFX 已从 JDK 中独立拆分,早期预览版开放下载
  9. SparkSQL简介
  10. 以太坊是什么鬼?!媲美比特币的加密币大揭秘