Working with Matrices:
了解TensorFlow如何使用矩阵对于通过计算图理解数据流非常重要。
Getting ready:
许多算法依赖矩阵运算。 TensorFlow为我们提供了易于使用的操作来执行这种矩阵计算。 对于以下所有示例,我们可以通过运行以下代码创建图表会话(graph session):
import tensorflow as tf
sess = tf.Session()
1.创建矩阵:
我们可以从numpy数组或嵌套列表创建二维矩阵,如前面在张量部分中所述。 我们还可以使用张量创建函数,并为诸如zeros(),ones(),truncated_normal()等功能指定二维形式。 TensorFlow还允许我们从具有函数diag()的一维数组或列表创建一个对角矩阵,如下所示:
identity_matrix = tf.diag([1.0, 1.0, 1.0])
A = tf.truncated_normal([2, 3])
B = tf.fill([2,3], 5.0)
C = tf.random_uniform([3,2])
D = tf.convert_to_tensor(np.array([[1., 2., 3.],[-3., -7.,-1.],[0., 5., -2.]]))
print(sess.run(identity_matrix))
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
。。。
** 请注意,如果我们再次运行sess.run(C),我们将重新初始化随机变量,并最终得到不同的随机值。2.加法和减法使用以下功能:
print(sess.run(A+B))
[[ 4.61596632 5.39771316 4.4325695 ]
[ 3.26702736 5.14477345 4.98265553]]
print(sess.run(B-B))
[[ 0. 0. 0.]
[ 0. 0. 0.]]
Multiplication
print(sess.run(tf.matmul(B, identity_matrix)))
[[ 5. 5. 5.]
[ 5. 5. 5.]]
3.另外,函数matmul()也有参数指定是否转置乘法前的参数或每个矩阵是否是稀疏的。
4.转换参数如下:
print(sess.run(tf.transpose(C)))
[[ 0.67124544 0.26766731 0.99068872]
[ 0.25006068 0.86560275 0.58411312]]
5.再次,值得一提的是,重新初始化给了我们与以前不同的值。
6.对于行列式,请使用以下内容:
print(sess.run(tf.matrix_determinant(D)))
-38.0
print(sess.run(tf.matrix_inverse(D)))
[[-0.5 -0.5 -0.5 ]
[ 0.15789474 0.05263158 0.21052632]
[ 0.39473684 0.13157895 0.02631579]]
** 注意,逆方法是基于Cholesky分解,如果矩阵是对称正定律或否则LU分解。
7.分解:
对于Cholesky分解,请使用以下内容:
print(sess.run(tf.cholesky(identity_matrix)))
[[ 1. 0. 1.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
8.对于特征值和特征向量,请使用以下代码:
print(sess.run(tf.self_adjoint_eig(D))
** 请注意,函数self_adjoint_eig()输出第一行中的特征值和剩余向量中的后续向量。 在数学中,这被称为矩阵的特征分解。
How it works...:
TensorFlow提供了所有的工具,让我们开始进行数值计算,并将这些计算添加到我们的图表中。 对于简单的矩阵运算,这种符号似乎很重。 请记住,我们将这些操作添加到图表中,并告诉TensorFlow通过这些操作运行的张量。 虽然这可能现在看起来很冗长,但是有助于了解后续章节中的符号,当这种计算方式使得更容易实现我们的目标时。
Implementing Activation Functions:
Getting ready:
当我们开始使用神经网络时,我们将使用激活函数,因为激活函数是任何神经网络的必需部分。 激活功能的目标是调整重量和偏差。 在TensorFlow中,激活函数是作用于张量的非线性运算。 它们是以与之前的数学运算相似的方式操作的功能。 激活功能有很多用途,但是一些主要的概念是,在对输出进行规范化时,它们将非线性引入到图中。 使用以下命令启动TensorFlow图:
import tensorflow as tf
sess = tf.Session()
How to do it...:
激活功能存在于TensorFlow的神经网络(nn)库中。 除了使用内置的激活功能,我们还可以使用TensorFlow操作来设计自己的功能。 我们可以导入预定义的激活函数(导入tensorflow.nn为nn),或者在我们的函数调用中显式输入.nn。 在这里,我们选择对每个函数调用是明确的:
1.被称为ReLU的整流线性单元是将非线性引入神经网络的最常见和最基本的方法。 该函数只是max(0,x)。 这是连续但不顺利的。 看起来如下:
print(sess.run(tf.nn.relu([-3., 3., 10.])))
[ 0. 3. 10.]
2.有时候我们希望把上一个ReLU激活功能的线性增加部分加起来。 我们可以通过将max(0,x)函数嵌套到这里来实现一个min()函数。 TensorFlow的实现被称为ReLU6功能。 这被定义为min(max(0,x),6)。 这是一个hard-Sigmoid函数的版本,计算速度更快,并且不会消失(在零点附近)或爆炸值。 当我们在第8章卷积神经网络和第9章循环神经网络中讨论更深层的神经网络时,这将会派上用场。 看起来如下:
print(sess.run(tf.nn.relu6([-3., 3., 10.])))
[ 0. 3. 6.]
3.sigmoid是最常见的连续和平滑激活功能。 它也称为逻辑函数,并具有形式1 /(1 + exp(-x))。 由于在训练期间排除反向传播术语的倾向,sigmoid并不经常被使用。 看起来如下:
print(sess.run(tf.nn.sigmoid([-1., 0., 1.])))
[ 0.26894143 0.5 0.7310586 ]
** 我们应该意识到,一些激活函数不是以零为中心,如sigmoid。 这将需要我们在大多数计算图算法中使用它之前将数据归零。
4.另一个平滑的激活功能是超切线。 超切线函数非常类似于sigmoid,除了不是在0和1之间的范围内,它的范围在-1和1之间。该函数具有双曲余弦的双曲正弦比的形式。 但是另一种写法是((exp(x) - exp(-x))/(exp(x)+ exp(-x)),如下所示:
print(sess.run(tf.nn.tanh([-1., 0., 1.])))
[-0.76159418 0. 0.76159418 ]
5.softsign功能也被用作激活功能。 该函数的形式为x /(abs(x)+ 1)。 softsign函数应该是对符号函数的连续逼近。 看起来如下:
print(sess.run(tf.nn.softsign([-1., 0., -1.])))
[-0.5 0. 0.5]
6.另一个功能,softplus,是ReLU功能的平滑版本。 该函数的形式是log(exp(x)+ 1)。 看起来如下:
print(sess.run(tf.nn.softplus([-1., 0., -1.])))
[ 0.31326166 0.69314718 1.31326163]
** 随着输入增加,softplus进入无穷大,而softsign变为1.随着输入变小,softplus接近零,softsign变为-1。
7. 指数线性单位(ELU)非常类似于softplus函数,除了底部渐近线为-1而不是0.如果x <0,则形式为(exp(x)+1)。 看起来如下:
print(sess.run(tf.nn.elu([-1., 0., -1.])))
[-0.63212055 0. 1. ]
How it works...:
这些激活函数是将来在神经网络或其他计算图中引入非线性的方法。 重要的是要注意我们网络中使用激活功能的位置。 如果激活函数的范围在0和1之间(sigmoid),则计算图只能输出0和1之间的值。
如果激活函数在节点之间并在其间隐藏,那么我们想知道当我们通过它们时,范围可以对我们的张量产生影响。 如果我们的张量被缩放为零,我们将需要使用一个激活函数,保留尽可能多的变化在零附近。 这意味着我们想要选择激活函数,如双曲正切(tanh)或softsign。 如果张量被缩放为正数,那么我们理想地选择一个激活函数,保留正域中的方差。
There's more...:
以下是两个图表,说明不同的激活功能。 以下表格显示了以下功能ReLU,ReLU6,softplus,expLU,sigmoid,softsign和双曲正切:
在图3中,我们可以看到四个激活函数,softplus,ReLU,ReLU6和指数LU。 除了ReLU6,其最大值为6:这些函数在零的左边,并且线性增加到零的右边。
在图4中,我们有激活函数sigmoid,双曲正切(tanh)和softsign。 这些激活功能都是平滑的,并具有S n形状。 请注意,这些功能有两个水平渐近线。