《TensorFlow官方文档》快速入门
本指南指引你在TensorFlow上面编程。在使用本指南前,先安装TensorFlow。为了最有效使用该指南,你需要先了解一下内容:
怎样用Python来编程。
至少对数组有一点了解。
最好对机器学习有一些了解。但是如果你只是了解一点点甚至还没有了解过机器学习,这依然是你第一篇需要阅读的指南。
TensoFlow提供了多样API。 最低级别API –TensorFlow Core– 提供给你完整的编程控制。我们推荐机器学习研究者和其他需要对模型进行良好控制的人使用TensorFlow Core。较高级别的API构建在TensorFlow Core之上。这些更高级的API通常比TensorFlow Core更容易学习和使用。另外,较高级别的API使重复任务更容易,并且在不同用户之间更一致。像tf.estimator这样的高级API可以帮助你管理数据集,估计器,训练和推理。
本指南从TensorFlow Core教程开始。然后我们将演示如何在tf.estimator中实现相同的模型。了解TensorFlow Core原理,在你使用高级API时理解它们的内部工作会很有帮助。
Tensors(张量)
TensorFlow中的数据中心单位是张量。张量由一组任意数量的阵列的原始值组成。张量的阶(rank)是其维数。以下是张量的一些例子:
3 # a rank 0 tensor; this is a scalar with shape [][1., 2., 3.] # a rank 1 tensor; this is a vector with shape [3][[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3][[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]TensorFlow核心教程导入TensorFlow
TensorFlow程序的规范导入声明如下:
import tensorflow as tf
这让Python可以访问TensorFlow的所有类,方法和符号。大多数文档假设您已经完成了。
计算图
你可能会认为TensorFlow 核心程序由两个不同的部分组成:
1.构建计算图。
2.运行计算图。
一个计算图是一系列TensorFlow操作排列成节点的图。我们来构建一个简单的计算图。每个节点采用零个或多个张量作为输入,并产生一个张量作为输出。一种类型的节点是一个常数。像所有TensorFlow常量一样,它不需要任何输入,它输出一个内部存储的值。我们可以创建两个浮点式张量node1 ,node2如下所示:
node1 = tf.constant(3.0, dtype=tf.float32)node2 = tf.constant(4.0) # also tf.float32 implicitlyprint(node1, node2)
最后的打印语句输出
Tensor("Const:0", shape=(), dtype=float32) Tensor("Const_1:0", shape=(), dtype=float32)
注意,打印节点不会如你所期望的那样输出值3.0,4.0。相反,它们是在评估时分别产生3.0和4.0的节点。要实际评估节点,我们必须在会话中运行计算图。会话封装了TensorFlow运行时的控制和状态。
下面的代码创建一个Session对象,然后调用其run方法运行足够的计算图来评估node1和node2。通过在会话中运行计算图如下:
sess = tf.Session()print(sess.run([node1, node2]))
我们看到3.0和4.0的预期值:
[3.0, 4.0]
我们可以通过将Tensor节点与操作相结合来构建更复杂的计算(操作也是节点)。例如,我们可以添加我们的两个常量节点并生成一个新的图,如下所示:
node3 = tf.add(node1, node2)print("node3:", node3)print("sess.run(node3):", sess.run(node3))
最后两个print语句生成
node3: Tensor("Add:0", shape=(), dtype=float32)sess.run(node3): 7.0
TensorFlow提供了一个名为TensorBoard的实用工具,可以显示计算图的图片。这是一个屏幕截图,显示TensorBoard如何可视化图形:
就像这样,这个图并不是特别有趣,因为它总是产生一个常量结果。可以将图形参数化为接受外部输入,称为占位符。一个占位符预示着会提供一个值。
a = tf.placeholder(tf.float32)b = tf.placeholder(tf.float32)adder_node = a + b # + provides a shortcut for tf.add(a, b)
前面的三行有点像一个函数或一个lambda,其中我们定义了两个输入参数(a和b),然后对它们进行一个操作。我们可以通过使用run方法的feed_dict参数来对多个输入进行评估, 以将具体值提供给占位符:
print(sess.run(adder_node, {a: 3, b: 4.5}))print(sess.run(adder_node, {a: [1, 3], b: [2, 4]}))
输出结果
7.5[ 3. 7.]
在TensorBoard中,图如下所示:
我们可以通过添加另一个操作使计算图更加复杂。例如,
add_and_triple = adder_node * 3.print(sess.run(add_and_triple, {a: 3, b: 4.5}))
产生输出
22.5
前面的计算图在TensorBoard中将如下所示:
在机器学习中,我们通常会想要一个可以接受任意输入的模型,比如上面的一个。为了使模型可训练,我们需要能够修改图形以获得具有相同输入的新输出。 变量允许我们向图中添加可训练的参数。它们的构造类型和初始值:
W = tf.Variable([.3], dtype=tf.float32)b = tf.Variable([-.3], dtype=tf.float32)x = tf.placeholder(tf.float32)linear_model = W * x + b
常量在调用tf.constant时被初始化,其值永远不会改变。相比之下,当调用tf.Variable,变量不会被初始化。要初始化TensorFlow程序中的所有变量,您必须显式调用特殊操作,如下所示:
init = tf.global_variables_initializer()sess.run(init)
重要的是要实现initTensorFlow子图的一个句柄来初始化所有的全局变量。直到我们调用sess.run,这些变量才被初始化。
既然x是占位符,我们可以同时评估linear_model几个值, x如下所示:
print(sess.run(linear_model, {x: [1, 2, 3, 4]}))
产生输出
[ 0. 0.30000001 0.60000002 0.90000004]
我们创建了一个模型,但是我们不知道它有多好。为了评估训练数据的模型,我们需要一个y占位符来提供所需的值,我们需要写一个损失函数。
损失函数测量当前模型与提供的数据之间的差距。我们将使用线性回归的标准损失模型,它将当前模型和提供的数据之间的三角形的平方相加。linear_model – y创建一个向量,其中每个元素是对应示例的误差增量。我们调用tf.square与那个误差一致。然后,我们创建一个单一的标量求和所有平方误差,使用tf.reduce_sum方法抽象出所有示例的误差:
y = tf.placeholder(tf.float32)squared_deltas = tf.square(linear_model - y)loss = tf.reduce_sum(squared_deltas)print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
产生损失值
23.66
我们可以通过手动重新赋值W和b为完美的-1和1来让提升上面的例子。一个变量由用于tf.Variable的值初始化,但可以使用类似tf.assign这些操作来改变。例如, W=-1并且b=1是我们的模型的最佳参数。我们可以改变W和b:
fixW = tf.assign(W, [-1.])fixb = tf.assign(b, [1.])sess.run([fixW, fixb])print(sess.run(loss, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]}))
最终打印显示现在的损失为零。
0.0
我们猜测到W和b“完美”的值,但机器学习的意义是自动地找到正确的模型参数。我们将在下一节中展示如何完成此项工作。
tf.train API
机器学习的完整讨论超出了本教程的范围。然而,TensorFlow提供了优化器,可以缓慢地更改每个变量,以便最大限度地减少损失函数。最简单的优化器是梯度下降。它根据该变量的损失导数的大小修改每个变量。通常,手动计算符号导数是冗长乏味且容易出错的。因此,TensorFlow可以在仅给出模型描述使用tf.gradients函数自动生成导数。为了简单起见,优化器通常会这样做。例如,
optimizer = tf.train.GradientDescentOptimizer(0.01)train = optimizer.minimize(loss)sess.run(init) # reset values to incorrect defaults.for i in range(1000): sess.run(train, {x: [1, 2, 3, 4], y: [0, -1, -2, -3]})print(sess.run([W, b]))
导致最终的模型参数:
[array([-0.9999969], dtype=float32), array([ 0.99999082], dtype=float32)]
现在我们完成了实际的机器学习!尽管这样做简单的线性回归并不需要太多的TensorFlow核心代码,但更复杂的模型和方法将数据输入到模型中需要更多的代码。因此,TensorFlow为常见的模式、结构和功能提供了更高级别的抽象。我们将在下一节中学习如何使用这些抽象。
完整程序
完整的可训练线性回归模型如下所示:
import tensorflow as tf# Model parametersW = tf.Variable([.3], dtype=tf.float32)b = tf.Variable([-.3], dtype=tf.float32)# Model input and outputx = tf.placeholder(tf.float32)linear_model = W * x + by = tf.placeholder(tf.float32)# lossloss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares# optimizeroptimizer = tf.train.GradientDescentOptimizer(0.01)train = optimizer.minimize(loss)# training datax_train = [1, 2, 3, 4]y_train = [0, -1, -2, -3]# training loopinit = tf.global_variables_initializer()sess = tf.Session()sess.run(init) # reset values to wrongfor i in range(1000): sess.run(train, {x: x_train, y: y_train})# evaluate training accuracycurr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
运行时,它会产生
W: [-0.9999969] b: [ 0.99999082] loss: 5.69997e-11
请注意,损失是非常小的数字(非常接近零)。如果您运行此程序,您的损失可能不完全相同,因为模型使用伪随机值初始化。
这个更复杂的程序仍然可以在TensorBoard中进行可视化
tf.estimator
tf.estimator 是一个高级TensorFlow库,简化机器学习的机制,包括:
运行训练循环
运行评估循环
管理数据集
tf.estimator定义了许多常见的模型。
基本用法
注意,用了tf.estimator线性回归程序变得简单得多:
import tensorflow as tf# NumPy is often used to load, manipulate and preprocess data.import numpy as np# Declare list of features. We only have one numeric feature. There are many# other types of columns that are more complicated and useful.feature_columns = [tf.feature_column.numeric_column("x", shape=[1])]# An estimator is the front end to invoke training (fitting) and evaluation# (inference). There are many predefined types like linear regression,# linear classification, and many neural network classifiers and regressors.# The following code provides an estimator that does linear regression.estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)# TensorFlow provides many helper methods to read and set up data sets.# Here we use two data sets: one for training and one for evaluation# We have to tell the function how many batches# of data (num_epochs) we want and how big each batch should be.x_train = np.array([1., 2., 3., 4.])y_train = np.array([0., -1., -2., -3.])x_eval = np.array([2., 5., 8., 1.])y_eval = np.array([-1.01, -4.1, -7, 0.])input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)train_input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)eval_input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)# We can invoke 1000 training steps by invoking the method and passing the# training data set.estimator.train(input_fn=input_fn, steps=1000)# Here we evaluate how well our model did.train_metrics = estimator.evaluate(input_fn=train_input_fn)eval_metrics = estimator.evaluate(input_fn=eval_input_fn)print("train metrics: %r"% train_metrics)print("eval metrics: %r"% eval_metrics)
运行时,它会产生
train metrics: {"loss": 1.2712867e-09, "global_step": 1000}eval metrics: {"loss": 0.0025279333, "global_step": 1000}
请注意我们的eval数据有较高的损失,但仍然接近于零。这意味着我们正在学习。
定制模型
tf.estimator不会将您锁定到其预定义的模型中。假设我们想创建一个没有内置到TensorFlow中的自定义模型。我们仍然可以保留tf.estimator的数据集、供给、训练等的高级抽象 。为了说明,我们将展示如何使用我们对较低级别TensorFlow API的了解实现我们自己的LinearRegressor等效模型。
要定义一个使用tf.estimator的自定义模型,我们需要使用 tf.estimator.Estimator。tf.estimator.LinearRegressor实际上是tf.estimator.Estimator一个子类。相对于子类Estimator,我们只是提供Estimator一个告诉 tf.estimator如何能评估预测,训练步骤和损失的model_fn函数 。代码如下:
import numpy as npimport tensorflow as tf# Declare list of features, we only have one real-valued featuredef model_fn(features, labels, mode): # Build a linear model and predict values W = tf.get_variable("W", [1], dtype=tf.float64) b = tf.get_variable("b", [1], dtype=tf.float64) y = W * features["x"] + b # Loss sub-graph loss = tf.reduce_sum(tf.square(y - labels)) # Training sub-graph global_step = tf.train.get_global_step() optimizer = tf.train.GradientDescentOptimizer(0.01) train = tf.group(optimizer.minimize(loss), tf.assign_add(global_step, 1)) # EstimatorSpec connects subgraphs we built to the # appropriate functionality. return tf.estimator.EstimatorSpec( mode=mode, predictions=y, loss=loss, train_op=train)estimator = tf.estimator.Estimator(model_fn=model_fn)# define our data setsx_train = np.array([1., 2., 3., 4.])y_train = np.array([0., -1., -2., -3.])x_eval = np.array([2., 5., 8., 1.])y_eval = np.array([-1.01, -4.1, -7, 0.])input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)train_input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)eval_input_fn = tf.estimator.inputs.numpy_input_fn( {"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)# trainestimator.train(input_fn=input_fn, steps=1000)# Here we evaluate how well our model did.train_metrics = estimator.evaluate(input_fn=train_input_fn)eval_metrics = estimator.evaluate(input_fn=eval_input_fn)print("train metrics: %r"% train_metrics)print("eval metrics: %r"% eval_metrics)
运行时,它会产生
train metrics: {"loss": 1.227995e-11, "global_step": 1000}eval metrics: {"loss": 0.01010036, "global_step": 1000}
请注意,自定义model_fn()函数的内容与下级API的手动模型训练循环非常相似。
下一步
现在您已经了解了TensorFlow的基础知识。我们有更多的教程可以看看,了解更多。如果您是机器学习的初学者,请参阅MNIST的初学者,否则请参阅Deep MNIST专家。
(全文完)
推荐:
优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!
- 如何挑选出优质基金,实现财富快速增值?
- 4个信号说明你的血液“粘稠如浆糊”!饭后一口它快速清血管
- 【庆安县华夏童年雅典贝贝早教幼儿园】 鸡蛋里加点这个,快速止
- 睡前3分钟,按按6个穴位,湿疹、荨麻疹快速止痒!不好天理难容
- 高血压再馋也别吃它,贪吃一点血压快速升高
- 八周,教你一步步练出马甲线!
- 如何快速给4-6个月宝宝制作营养价值高的辅食?
- 货车驶入快速内环禁行区 将被电子警察抓拍
- 宝宝退烧秘籍:即使高烧39.8度,只需一片它就能快速退烧,速藏!
- 双流“三联动”治理微腐败 推动临空服务业园区快速发展