The TensorFlow Way
Introduction:
现在我们介绍了TensorFlow如何创建张量,使用变量和占位符,我们将介绍如何在计算图中对这些对象采取处理。 从此,我们可以设置一个简单的分类器,看看它的表现如何。
Operations in a Computational Graph:
Getting ready:
要启动图形,我们加载TensorFlow并创建一个会话,如下所示:
import tensorflow as tf
sess = tf.Session()
How to do it...:
在这个例子中,我们将结合我们所学到的和在列表中输入每个数字通过计算图操作并打印输出:
1.首先我们声明我们的张量和占位符。 这里我们将创建一个numpy数组来进入我们的操作:
import numpy as np
x_vals = np.array([1., 3., 5., 7., 9.])
x_data = tf.placeholder(tf.float32)
m_const = tf.constant(3.)
my_product = tf.mul(x_data, m_const)
for x_val in x_vals:
print(sess.run(my_product, feed_dict={x_data: x_val}))
How it works...:
步骤1和2在计算图上创建数据和操作。 然后,在步骤3中,我们通过图形提供数据并打印输出。 这是计算图形的样子:
Layering Nested Operations:
Getting ready:
了解如何将操作连接在一起很重要。 这将在计算图中设置分层操作。 对于演示,我们将乘以一个占位符两个矩阵,然后执行加法。 我们将以三维numpy数组的形式提供两个矩阵:
import tensorflow as tf
sess = tf.Session()
How to do it...:
注意数据在通过时如何改变形状也很重要。 我们将提供两个大小为3x5的数组。 我们将乘以每个矩阵大小为5x1的常数,这将导致大小为3x1的矩阵。 然后,我们将乘以1x1矩阵,再次产生3x1矩阵。 最后,我们最后添加一个3x1矩阵,如下所示:
1.首先,我们创建数据传回和相应的占位符:
my_array = np.array([[1., 3., 5., 7., 9.],
[-2., 0., 2., 4., 6.],
[-6., -3., 0., 3., 6.]])
x_vals = np.array([my_array, my_array + 1])
x_data = tf.placeholder(tf.float32, shape=(3, 5))
2.接下来,我们创建我们将用于矩阵乘法和加法的常数:
m1 = tf.constant([[1.],[0.],[-1.],[2.],[4.]])
m2 = tf.constant([[2.]])
a1 = tf.constant([[10.]])
3.现在我们声明操作并将它们添加到图中:
prod1 = tf.matmul(x_data, m1)
prod2 = tf.matmul(prod1, m2)
add1 = tf.add(prod2, a1)
4.最后,我们通过图表提供数据:
for x_val in x_vals:
print(sess.run(add1, feed_dict={x_data: x_val}))
[[ 102.]
[ 66.]
[ 58.]]
[[ 114.]
[ 78.]
[ 70.]]
How it works...:
我们刚刚创建的计算图可以用Tensorboard来显示。 检测板是TensorFlow的一个功能,它允许我们可视化该图中的计算图和值。 这些功能本身提供,与其他机器学习框架不同。 要了解如何完成此操作,请参阅第11章“更多与TensorFlow”中的“Tensorboard配方”中的“可视化图”。 这是我们的分层图如下所示:
There's more...:
在通过图形运行数据之前,我们必须声明数据的shape并知道操作的结果shape。 情况并非如此。 可能有一个或两个我们不知道或可以改变的维度。 为了实现这一点,我们指定可以变化或未知的维值为无值。 例如,要使先前的数据占位符的列数不明,我们将写下列行:
x_data = tf.placeholder(tf.float32,shape =(3,None))
这允许我们打破矩阵乘法规则,我们仍然必须遵守乘法常数必须具有相同的相应行数的事实。 我们可以在我们的图表中提供数据时动态生成或重新整形x_data。 当我们在多个批次中提供数据时,这将在后面的章节中派上用场。