01 TensorFlow入门(2)


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形状。 请注意,这些功能有两个水平渐近线。






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MachineLP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值