TensorFlow 是 Google 创建并发布的一个用于快速数值计算的 Python 库。
它是一个基础库,可以直接用于创建深度学习模型,也可以通过在其之上构建的简化流程的包装库来创建 TensorFlow 模型。
在这篇文章中,您将了解用于深度学习的 TensorFlow 库。
- 2022 年 6 月更新:更新到 TensorFlow 2.x
通过我的新书 《Python 深度学习》启动您的项目,其中包括逐步教程和所有示例的 Python 源代码文件。
让我们开始吧。

Python 深度学习库 TensorFlow 简介
图片来源:Nicolas Raymond,保留部分权利。
什么是 TensorFlow?
TensorFlow 是一个用于快速数值计算的开源库。
它由 Google 创建和维护,并根据 Apache 2.0 开源许可证发布。该 API 名义上是为 Python 编程语言设计的,尽管也可以访问底层 C++ API。
与用于深度学习的其他数值库(如 Theano)不同,TensorFlow 旨在用于研究开发和生产系统,其中最重要的莫过于 Google 搜索中的 RankBrain 和有趣的 DeepDream 项目。
它可以在单个 CPU 系统和 GPU 上运行,也可以在移动设备和由数百台机器组成的大规模分布式系统上运行。
如何安装 TensorFlow
如果您已经拥有 Python SciPy 环境,TensorFlow 的安装非常简单。
TensorFlow 适用于 Python 3.3+。您可以按照 TensorFlow 网站上的下载和设置说明进行操作。通过 PyPI 安装可能最简单,用于您的 Linux 或 Mac OS X 平台的 pip 命令的具体说明在下载和设置网页上。最简单的情况下,您只需在命令行中输入以下内容
1 |
pip install tensorflow |
例外情况是配备 Apple Silicon CPU 的新款 Mac。此特定架构的包名为 tensorflow-macos
1 |
pip install tensorflow-macos |
如果您愿意,还可以使用 virtualenv 和 docker 镜像。
要使用 GPU,您还需要安装 Cuda 工具包。
TensorFlow 中的第一个示例
计算以有向图的结构来描述数据流和操作。
- 节点:节点执行计算,具有零个或多个输入和输出。在节点之间移动的数据称为张量,它们是实值多维数组。
- 边:图定义了数据流、分支、循环和状态更新。特殊的边可用于同步图中的行为,例如,等待对多个输入的计算完成。
- 操作:操作是一个命名的抽象计算,可以接受输入属性并生成输出属性。例如,您可以定义一个加法或乘法操作。
使用 TensorFlow 进行计算
这个第一个示例是 TensorFlow 网站上示例的修改版本。它展示了如何将值定义为张量并执行操作。
1 2 3 4 |
import tensorflow as tf a = tf.constant(10) b = tf.constant(32) print(a+b) |
运行此示例将显示
1 |
tf.Tensor(42, shape=(), dtype=int32) |
使用 TensorFlow 进行线性回归
下一个示例来自 TensorFlow 教程的介绍。
此示例展示了如何定义变量(例如 W 和 b)以及作为计算结果的变量(y)。
我们感觉到 TensorFlow 分离了计算的定义和声明。下面,有自动微分的幕后操作。当我们使用函数 mse_loss()
计算 y
和 y_data
之间的差异时,会创建一个图,将函数产生的值连接到 TensorFlow 变量 W
和 b
。TensorFlow 使用此图来推断如何在 minimize()
函数中更新变量。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import tensorflow as tf import numpy as np # 在 NumPy 中创建 100 个虚构的 x, y 数据点,y = x * 0.1 + 0.3 x_data = np.random.rand(100).astype(np.float32) y_data = x_data * 0.1 + 0.3 # 尝试找到 W 和 b 的值,计算 y_data = W * x_data + b # (我们知道 W 应该是 0.1,b 应该是 0.3,但 TensorFlow 会 # 为我们找出这些值。) W = tf.Variable(tf.random.normal([1])) b = tf.Variable(tf.zeros([1])) # 计算 y_data 和计算出的 y 之间的均方误差的函数 def mse_loss(): y = W * x_data + b loss = tf.reduce_mean(tf.square(y - y_data)) return loss # 最小化均方误差。 optimizer = tf.keras.optimizers.Adam() for step in range(5000): optimizer.minimize(mse_loss, var_list=[W,b]) if step % 500 == 0: print(step, W.numpy(), b.numpy()) # 学习到最佳拟合是 W: [0.1], b: [0.3] |
运行此示例将打印以下输出
1 2 3 4 5 6 7 8 9 10 |
0 [-0.35913563] [0.001] 500 [-0.04056413] [0.3131764] 1000 [0.01548613] [0.3467598] 1500 [0.03492216] [0.3369852] 2000 [0.05408324] [0.32609695] 2500 [0.07121297] [0.316361] 3000 [0.08443557] [0.30884594] 3500 [0.09302785] [0.3039626] 4000 [0.09754606] [0.3013947] 4500 [0.09936733] [0.3003596] |
您可以在基本使用指南中了解有关 TensorFlow 机制的更多信息。
更多深度学习模型
您的 TensorFlow 安装附带了许多深度学习模型,您可以直接使用和试验它们。
首先,您需要找出 TensorFlow 在您的系统上安装在哪里。例如,您可以使用以下 Python 脚本
1 |
python -c 'import os; import inspect; import tensorflow; print(os.path.dirname(inspect.getfile(tensorflow)))' |
例如,这可能是
1 |
/usr/lib/python3.9/site-packages/tensorflow |
切换到此目录并注意 models 子目录。其中包含许多带有类似教程注释的深度学习模型,例如
- 多线程 word2vec 小批量 skip-gram 模型
- 多线程 word2vec 未批量 skip-gram 模型
- 用于 CIFAR-10 网络的 CNN
- 简单、端到端、类似 LeNet-5 的卷积 MNIST 模型示例
- 带有注意力机制的序列到序列模型
此外,请查看 examples 目录,其中包含一个使用 MNIST 数据集的示例。
TensorFlow 主网站上还有一份优秀的教程列表。它们展示了如何使用不同的网络类型和不同的数据集,以及如何以各种方式使用该框架。
最后,还有 TensorFlow playground,您可以在网络浏览器中直接尝试小型网络。
Python 深度学习需要帮助吗?
参加我的免费为期两周的电子邮件课程,发现 MLP、CNN 和 LSTM(附代码)。
立即点击注册,还将免费获得本课程的 PDF 电子书版本。
TensorFlow 资源
更多资源
总结
在这篇文章中,您了解了用于深度学习的 TensorFlow Python 库。
您了解到它是一个用于快速数值计算的库,专门为开发和评估大型深度学习模型所需的各种操作而设计。
您对 TensorFlow 或本文有任何疑问吗?请在评论中提出您的问题,我将尽力回答。
这很有帮助。
你能发布更多使用 TensorFlow 的教程吗?
谢谢。
我很快就会的,谢谢 Jatin。
print sess.run(a+b) 这一行语法不正确。print 是一个方法,所以应该有开括号和闭括号。
谢谢 Amit,已修复。
如果是 Python 2.7 呢?不带括号的 print 语句不是有效吗?
括号会被忽略/不起作用,这使得相同的代码在 Python3 中也能工作。
嗨 Jason
我在 TensorFlow 安装中找不到 models 文件夹。
您能帮忙吗?
我想它们在最新版本中已被移除。
嗨 Jason
本页写着“要使用 GPU,只支持 Linux 并且需要 Cuda 工具包。”然而,我认为如果安装了 Cuda 工具包和 cudNN,Windows 也支持。不是吗?
谢谢。
可能吧,在撰写本文时似乎并非如此。
在开始机器学习时,您会建议暂时忽略 TensorFlow,坚持您的入门方案吗?
是的,实际上,对于深度学习,我建议使用 Keras,它封装了 TensorFlow 库。
在这里了解更多
https://machinelearning.org.cn/faq/single-faq/what-deep-learning-library-do-you-recommend
嗨 Jason,我有一个关于 TensorFlow 的问题。我正在尝试使用 TensorFlow 实现神经风格迁移。不知道您对如何纠正下面的错误有什么建议。非常感谢。
tf.reset_default_graph()
sess = tf.InteractiveSession()
sess.run(tf.initialize_all_variables())
sess.run(model[‘input’].assign(content_image))
回溯(最近一次调用)
File “”, line 1, in
sess.run(model[‘input’].assign(content_image))
文件 “/Users/sherrymukim/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 889 行,在 run 中
run_metadata_ptr)
文件 “/Users/sherrymukim/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 1105 行,在 _run 中
self._graph, fetches, feed_dict_tensor, feed_handles=feed_handles)
文件 “/Users/sherrymukim/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 414 行,在 __init__ 中
self._fetch_mapper = _FetchMapper.for_fetch(fetches)
文件 “/Users/sherrymukim/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 242 行,在 for_fetch 中
return _ElementFetchMapper(fetches, contraction_fn)
文件 “/Users/sherrymukim/anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py”,第 278 行,在 __init__ 中
‘Tensor. (%s)’ % (fetch, str(e)))
ValueError: Fetch 参数无法解释为张量。(Tensor Tensor(“Assign_5:0”, shape=(1, 300, 400, 3), dtype=float32_ref) 不是此图的元素。)
抱歉,我没有 TensorFlow 或风格迁移的示例。我无法给您好的建议。
也许可以发布到 stackoverflow?
你好,
那么,我是否需要明确指出程序应该在支持 CPU 的 TensorFlow 上运行,还是在我没有 GPU 时是隐式的?
另外,我是深度学习新手,所有这些 API、CUDA、KERAS 等都让我感到困惑。这些都是什么?
此致
不,Keras 将根据其配置使用 TensorFlow。TensorFlow 必须配置为使用 GPU,抱歉我不会介绍如何做到这一点。
嗨,Jason!
一如既往,感谢您在这个精彩的网站上花费的时间和精力!!!
来自您的线性回归示例的这一部分
我收到以下错误:
NameError Traceback (最近一次调用)
in
27
28 # 拟合直线。
—> 29 for step in xrange(201)
30 sess.run(train)
31 if step % 20 == 0
NameError: name 'xrange' is not defined
或许确认您安装的是 Python 2.7 或 3.5+?
Jose……去掉“x”……直接使用 range(201)……
我尝试了很多次,但仍然是同样的问题,之前我还在同一台电脑上使用 TensorFlow。只是我安装了 Windows 并尝试再次安装 TensorFlow,但出现了错误。
ImportError 回溯 (最近一次调用)
~\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow.py 在
57
—> 58 from tensorflow.python.pywrap_tensorflow_internal import *
59 from tensorflow.python.pywrap_tensorflow_internal import __version__
~\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py 在
27 return _mod
—> 28 _pywrap_tensorflow_internal = swig_import_helper()
29 del swig_import_helper
~\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py 在 swig_import_helper()
23 try
—> 24 _mod = imp.load_module(‘_pywrap_tensorflow_internal’, fp, pathname, description)
25 finally
~\Miniconda3\lib\imp.py 在 load_module(name, file, filename, details) 中
241 else
–> 242 return load_dynamic(name, filename, file)
243 elif type_ == PKG_DIRECTORY
~\Miniconda3\lib\imp.py 在 load_dynamic(name, path, file) 中
341 name=name, loader=loader, origin=path)
–> 342 return _load(spec)
343
ImportError: DLL 加载失败:动态链接库 (DLL) 初始化例程失败。
处理上述异常时,发生了另一个异常
ImportError 回溯 (最近一次调用)
in
—-> 1 import tensorflow as tf
~\Miniconda3\lib\site-packages\tensorflow\__init__.py 在
26
27 # pylint: disable=g-bad-import-order
—> 28 from tensorflow.python import pywrap_tensorflow # pylint: disable=unused-import
29 from tensorflow.python.tools import module_util as _module_util
30
~\Miniconda3\lib\site-packages\tensorflow\python\__init__.py 在
47 import numpy as np
48
—> 49 from tensorflow.python import pywrap_tensorflow
50
51 # 协议缓冲区
~\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow.py 在
72 对于一些常见的原因和解决方案。请在寻求帮助时包含此错误消息上方的完整堆栈跟踪。””” % traceback.format_exc()
73
—> 74 raise ImportError(msg)
75
76 # pylint: enable=wildcard-import,g-import-not-at-top,unused-import,line-too-long
ImportError: 回溯(最近一次调用)
文件 “C:\Users\Khalil\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow.py”,第 58 行,在
from tensorflow.python.pywrap_tensorflow_internal import *
文件 “C:\Users\Khalil\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py”,第 28 行,在
_pywrap_tensorflow_internal = swig_import_helper()
文件 “C:\Users\Khalil\Miniconda3\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py”,第 24 行,在 swig_import_helper 中
_mod = imp.load_module(‘_pywrap_tensorflow_internal’, fp, pathname, description)
文件 “C:\Users\Khalil\Miniconda3\lib\imp.py”,第 242 行,在 load_module 中
返回 load_dynamic(name, filename, file)
文件 “C:\Users\Khalil\Miniconda3\lib\imp.py”,第 342 行,在 load_dynamic 中
返回 _load(spec)
ImportError: DLL 加载失败:动态链接库 (DLL) 初始化例程失败。
未能加载原生 TensorFlow 运行时。
请参阅 https://tensorflowcn.cn/install/errors
了解一些常见原因和解决方案。寻求帮助时请包含整个堆栈跟踪
此错误消息上方。
抱歉,我不熟悉这个错误。
或许尝试使用 Anaconda 重新安装
https://machinelearning.org.cn/setup-python-environment-machine-learning-deep-learning-anaconda/
嗨,Jason,
我尝试遵循这个 tensorflow 教程来记住 tensorflow 的“复杂结构”如何工作(tf 1.x 版本与 Keras),以下是我发现问题的主要结论
1) 由于当前的 tensorflow 版本是 2.x,它是“急切执行”的,因此 sessio() 和 run() 等方法不可直接使用,您为 tensorflow 1.x 编写的线性回归案例研究必须通过以下方式进行升级
1.1) 或在 tf 2.x“急切执行”下实现,我得出结论,您所有的旧代码行都必须放在一个嵌套中,例如
with tf.compat.v1.Session() as sess
…
此外,还要更新一些张量的方法:“tf.compat.v1”,对于 v2 中的张量,例如
tf.compat.v1.Session()
f.compat.v1.train.GradientDescentOptimizer(0.5)
tf.compat.v1.global_variables_initializer()
1.2) 或通过在旧代码开头添加初始语句来禁用“急切执行”来实现 tf 2.x
tf.compat.v1.disable_eager_execution()
在两种情况下我都得到了相同的结果
1.3) 我还尝试直接使用 tf 2.x 版本的“急切训练”的新方法,将旧代码翻译成
with tf.GradientTape() as tape
…
但应用于更“复杂”的结构,例如新的损失和 grad = tape.gradient(loss, w)……所以我放弃了 🙂
1.4) 我还看到新 tensorflow 2.x 中的概念正试图应用 keras(例如 tf.keras…)的新简单想法并实现“急切执行”,……但现在它与 tf 1.x 版本令人困惑……所以我现在不知道在这种当前状态下谁会直接应用 tensorflow……:-)
此致,
JG
本教程有些过时,我推荐这个教程
https://machinelearning.org.cn/tensorflow-tutorial-deep-learning-with-tf-keras/
好的,我会去做的。
无论如何,我指的是将纯粹的 Tensorflow 应用于机器学习代码的研发……但可能没有多少优势,如果有的话,而不是使用友好的 keras 包装器。
将其升级到 TensorFlow 2.0
谢谢。
成为 TensorFlow 专家的最佳途径是什么?
多加练习!
这个示例不需要更新到 TF2.0 吗?我尝试运行它,但只有在删除了 .Session() 调用之后才运行?
嗨 Indronel……我感谢您的反馈和建议!以下内容将对 TF2.0 有所帮助
https://machinelearning.org.cn/tensorflow-tutorial-deep-learning-with-tf-keras/
你能告诉我关于 tensorflow 和 keras 的教程吗
嗨 Ahmed……以下内容可能对您有兴趣
https://machinelearning.org.cn/tensorflow-tutorial-deep-learning-with-tf-keras/
你好,我可以在没有 Python 编程知识的情况下开始这门课程吗
嗨 Salami……您当然可以开始这门课程!您将在深度学习的应用中学习实用的 Python。