【译】Effective TensorFlow Chapter13——在TensorFlow中利用learn API构建神经网络框架

本文翻译自: 《Building a neural network training framework with learn API》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 为了简单起见, 在之前的大多数示例中, 我们都是手动创建一个会话(session), 并不关心保存和加载检查点, 但在实践中通常不是这样做的。 在这我推荐你使用 learn API 来进行会话管理和日志记录(session management and logging)。 我们使用 TensorFlow 提供了一个简单而实用的框架来训练神经网络。 在这一节中, 我们将解释这个框架是如何工作的。 当利用神经网络训练模型进行实验时, 通常需要分割训练集和测试集。 你需要利用训练集训练你的模型, 并在测试集中计算一些指标来评估模型的好坏。 你还需要将模型参数存储为一个检查点(checkpoint), 因为你需要可以随时停止并重启训练过程。 TensorFlow 的 learn API 旨在简化这项工作, 使我们能够专注于开发实际模型。 使用 tf.learn API 的最简单的方式是直接使用 tf.Estimator 对象。 你需要定义一个模型函数, 该模型函数包含一个损失函数(loss function)、 一个训练操作(train op)、 一个或一组预测, 以及一组可选的用于评估的度量操作: import tensorflow as tf def model_fn(features, labels, mode, params): predictions = ....

【译】Effective TensorFlow Chapter12——TensorFlow中的数值稳定性

本文翻译自: 《Numerical stability in TensorFlow》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 当使用任何数值计算库(如 NumPy 或 TensorFlow)时, 值得注意的是, 编写出正确的数学计算代码对于计算出正确结果并不是必须的。 你同样需要确保整个计算过程是稳定的。 让我们从一个例子入手。 小学的时候我们就知道, 对于任意一个非 0 的数 x, 都有 x*y/y=x 。 但是让我们在实践中看看是否如此: import numpy as np x = np.float32(1) y = np.float32(1e-50) # y would be stored as zero z = x * y / y print(z) # prints nan 错误的原因是: y 是 float32 类型的数字, 所能表示的数值太小。 当 y 太大时会出现类似的问题: y = np.float32(1e39) # y would be stored as inf z = x * y / y print(z) # prints 0 float32 类型可以表示的最小正值是 1....

【译】Effective TensorFlow Chapter11——在TensorFlow中调试模型

本文翻译自: 《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....

【译】Effective TensorFlow Chapter10——在TensorFlow中利用多GPU处理并行数据

本文翻译自: 《Multi-GPU processing with data parallelism》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 如果你使用类似 C++这样的语言在单核 CPU 上编写你的软件, 为使其能够在多个 GPU 上并行运行, 你可能需要从头开始重写你的软件。 但是在 TensorFlow 中并非如此。 由于其符号性质, tensorflow 可以隐藏所有这些复杂的过程, 使你无需在多个 CPU 和 GPU 上扩展程序。 让我们从在 CPU 上添加两个向量开始: import tensorflow as tf with tf.device(tf.DeviceSpec(device_type="CPU", device_index=0)): a = tf.random_uniform([1000, 100]) b = tf.random_uniform([1000, 100]) c = a + b tf.Session().run(c) 同样的事情在 GPU 上也可以简单地完成: with tf.device(tf.DeviceSpec(device_type="GPU", device_index=0)): a = tf.random_uniform([1000, 100]) b = tf.random_uniform([1000, 100]) c = a + b 但是, 如果我们有两个 GPU 并希望同时使用它们呢? 为此, 我们可以把数据分成两份, 并让每个 GPU 单独处理一个部分:...

【译】Effective TensorFlow Chapter9——使用Python ops进行原型内核和高级可视化

本文翻译自: 《Prototyping kernels and advanced visualization with Python ops》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 TensorFlow 中的内核操作完全用 C ++编写, 以提高效率。 但是用 C++编写 TensorFlow 内核的话可能会非常痛苦。 因此, 在花费数小时实现属于自己的内核之前, 你也许需要先实现一个操作的原型, 尽管这样的效率会很低。 通过 tf.py_func() 你可以将任何一个 python 源代码转换为 TensorFlow 的操作。 举个例子而言, 这里有一个用 python 自己实现的 ReLU 非线性激活函数, 通过 tf.py_func() 转换为 TensorFlow 操作的例子: import numpy as np import tensorflow as tf import uuid def relu(inputs): # Define the op in python def _relu(x): return np.maximum(x, 0....

【译】Effective TensorFlow Chapter8——控制流操作: 条件和循环

本文翻译自: 《Control flow operations: conditionals and loops》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 当我们在构建一个复杂模型如 RNN(循环神经网络)的时候, 你可能需要通过条件和循环来控制操作流程。 在这一节, 我们介绍一些在 TensorFlow 中常用的控制流。 假设我们现在需要通过一个条件判断来决定我们是否相加还是相乘两个变量。 这个可以通过调用 tf.cond() 简单实现, 它表现出像 python 中 if...else... 相似的功能。 a = tf.constant(1) b = tf.constant(2) p = tf.constant(True) x = tf.cond(p, lambda: a + b, lambda: a * b) print(tf.Session().run(x)) 因为这个条件判断为 True, 所以这个输出应该是加法输出, 也就是输出 3。 在使用 TensorFlow 的过程中, 大部分时间你都会使用大型的张量, 并且在一个批次(a batch)中进行操作。 一个与之相关的条件操作符是 tf.where() , 它需要提供一个条件判断, 就和 tf.cond() 一样, 但是 tf....

【译】Effective TensorFlow Chapter7——理解执行顺序和控制依赖

本文翻译自: 《Understanding order of execution and control dependencies》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 正如我们刚开始提到的, TensorFlow 不会立刻运行定义了的操作, 而是在计算图中创造一个相关的节点, 这个节点可以用 Session.run() 进行执行。 这个使得 TensorFlow 可以在运行时进行优化, 以此确定最佳执行顺序, 并且在运算中剔除一些不需要使用的节点。 如果你只是在计算图中使用 tf.Tensors , 你就不需要担心依赖问题, 但是你更可能会使用 tf.Variable() , 这个操作使得问题变得更加困难。 我的建议是如果张量不能满足这个工作需求, 那么仅仅使用 Variables 就足够了。 这个可能不够直观, 我们不妨先观察一个例子: import tensorflow as tf a = tf.constant(1) b = tf.constant(2) a = a + b tf.Session().run(a) 正如我们期待的那样, “a”的计算结果是 3。 注意下, 我们创建了 3 个张量, 其中包含两个常数张量和一个储存加法结果的张量。 务必注意我们不能重写一个张量的值, 如果我们想要改变张量的值, 我们就必须要创建一个新的张量, 就像我们刚才做的那样。...

【译】Effective TensorFlow Chapter6——在TensorFlow中, 利用运算符重载

本文翻译自: 《Take advantage of the overloaded operators》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 和 Numpy 一样, 为了使代码可读性更强, 更容易绘制一个计算图, TensorFlow 重载了很多 python 中的运算符。 **切片(slice)**操作是众多重载运算符中的一个, 它可以使得索引张量变得很容易: z = x[begin:end] # z = tf.slice(x, [begin], [end-begin]) 但是在使用的时候还是需要注意。 切片操作的效率非常低, 因此最好避免使用, 特别是在切片的数量很大的时候。 为了更好地理解这个操作符有多么地低效, 我们先观察一个例子。 我们想要人工实现一个对矩阵的行进行 reduce 操作的代码: import tensorflow as tf import time x = tf.random_uniform([500, 10]) z = tf.zeros([10]) for i in range(500): z += x[i] sess = tf.Session() start = time.time() sess....

【译】Effective TensorFlow Chapter5——在TensorFlow中, 给模型“喂”数据

本文翻译自: 《Feeding data to TensorFlow》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 TensorFlow 被设计用于高效地处理大量数据。 所以你需要记住的是, 千万不要“饿着”你的 TF 模型, 这样才能得到最好的表现。 一般来说, 有三种方法可以给你的模型“喂”数据。 常量方式(Constants) 最简单的方式莫过于直接将数据当成常量嵌入你的计算图中, 如: import tensorflow as tf import numpy as np actual_data = np.random.normal(size=[100]) data = tf.constant(actual_data)12345 这个方式非常高效, 但并不灵活。 一个很大的问题就是为了在其他数据集上复用你的模型, 你必须要重写你的计算图, 而且你必须同时加载所有数据, 并且一直保存在内存里, 这意味着这个方式仅仅适用于小数剧集的情况。 占位符方式(Placeholders) 可以通过占位符(placeholder)的方式解决刚才常数喂养网络的问题, 如: import tensorflow as tf import numpy as np data = tf.placeholder(tf.float32) prediction = tf.square(data) + 1 actual_data = np.random.normal(size=[100]) tf.Session().run(prediction, feed_dict={data: actual_data})1234567 占位符操作符返回一个张量, 他的值在会话中通过人工指定的 feed_dict 参数得到(fetch)。...

【译】Effective TensorFlow Chapter3——理解变量域Scope以及何时应该使用它们

本文翻译自: 《Scopes and when to use them》, 如有侵权请联系删除, 仅限于学术交流, 请勿商用。 如有谬误, 请联系指出。 在 TensorFlow 中, 变量(Variables)和张量(tensors)有一个名字(name)属性, 用于在符号图中标识它们。 如果在创建变量或张量时未指定名称, TensorFlow 会自动为您指定名称: a = tf.constant(1) print(a.name) # prints "Const:0" b = tf.Variable(1) print(b.name) # prints "Variable:0" 您可以通过显式指定来覆盖默认名称: a = tf.constant(1, name = "a") print(a.name)# prints "a:0" b = tf.Variable(1, name = "b") print(b.name)# prints "b:0" ...