前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >01 TensorFlow入门(2)

01 TensorFlow入门(2)

作者头像
MachineLP
发布2018-01-09 15:06:49
9240
发布2018-01-09 15:06:49
举报
文章被收录于专栏:小鹏的专栏小鹏的专栏

Working with Matrices:

        了解TensorFlow如何使用矩阵对于通过计算图理解数据流非常重要。

Getting ready:

许多算法依赖矩阵运算。 TensorFlow为我们提供了易于使用的操作来执行这种矩阵计算。 对于以下所有示例,我们可以通过运行以下代码创建图表会话(graph session):

代码语言:js
复制
import tensorflow as tf
sess = tf.Session()

1.创建矩阵:

我们可以从numpy数组或嵌套列表创建二维矩阵,如前面在张量部分中所述。 我们还可以使用张量创建函数,并为诸如zeros(),ones(),truncated_normal()等功能指定二维形式。 TensorFlow还允许我们从具有函数diag()的一维数组或列表创建一个对角矩阵,如下所示:

代码语言:js
复制
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.加法和减法使用以下功能:

代码语言:js
复制
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.转换参数如下:

代码语言:js
复制
print(sess.run(tf.transpose(C)))
[[ 0.67124544 0.26766731 0.99068872]
[ 0.25006068 0.86560275 0.58411312]]

        5.再次,值得一提的是,重新初始化给了我们与以前不同的值。

6.对于行列式,请使用以下内容:

代码语言:js
复制
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分解,请使用以下内容:

代码语言:js
复制
print(sess.run(tf.cholesky(identity_matrix)))
[[ 1. 0. 1.]
[ 0. 1. 0.]
[ 0. 0. 1.]]

          8.对于特征值和特征向量,请使用以下代码:

代码语言:js
复制
print(sess.run(tf.self_adjoint_eig(D))

        ** 请注意,函数self_adjoint_eig()输出第一行中的特征值和剩余向量中的后续向量。 在数学中,这被称为矩阵的特征分解。

How it works...:

TensorFlow提供了所有的工具,让我们开始进行数值计算,并将这些计算添加到我们的图表中。 对于简单的矩阵运算,这种符号似乎很重。 请记住,我们将这些操作添加到图表中,并告诉TensorFlow通过这些操作运行的张量。 虽然这可能现在看起来很冗长,但是有助于了解后续章节中的符号,当这种计算方式使得更容易实现我们的目标时。

Implementing Activation Functions:

        Getting ready:

当我们开始使用神经网络时,我们将使用激活函数,因为激活函数是任何神经网络的必需部分。 激活功能的目标是调整重量和偏差。 在TensorFlow中,激活函数是作用于张量的非线性运算。 它们是以与之前的数学运算相似的方式操作的功能。 激活功能有很多用途,但是一些主要的概念是,在对输出进行规范化时,它们将非线性引入到图中。 使用以下命令启动TensorFlow图:

代码语言:js
复制
import tensorflow as tf
sess = tf.Session()

How to do it...:

激活功能存在于TensorFlow的神经网络(nn)库中。 除了使用内置的激活功能,我们还可以使用TensorFlow操作来设计自己的功能。 我们可以导入预定义的激活函数(导入tensorflow.nn为nn),或者在我们的函数调用中显式输入.nn。 在这里,我们选择对每个函数调用是明确的:

        1.被称为ReLU的整流线性单元是将非线性引入神经网络的最常见和最基本的方法。 该函数只是max(0,x)。 这是连续但不顺利的。 看起来如下:

代码语言:js
复制
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章循环神经网络中讨论更深层的神经网络时,这将会派上用场。 看起来如下:

代码语言:js
复制
print(sess.run(tf.nn.relu6([-3., 3., 10.])))
[ 0. 3. 6.]

3.sigmoid是最常见的连续和平滑激活功能。 它也称为逻辑函数,并具有形式1 /(1 + exp(-x))。 由于在训练期间排除反向传播术语的倾向,sigmoid并不经常被使用。 看起来如下:

代码语言:js
复制
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)),如下所示:

代码语言:js
复制
print(sess.run(tf.nn.tanh([-1., 0., 1.])))
[-0.76159418 0. 0.76159418 ]

        5.softsign功能也被用作激活功能。 该函数的形式为x /(abs(x)+ 1)。 softsign函数应该是对符号函数的连续逼近。 看起来如下:

代码语言:js
复制
 print(sess.run(tf.nn.softsign([-1., 0., -1.])))
[-0.5 0. 0.5]

        6.另一个功能,softplus,是ReLU功能的平滑版本。 该函数的形式是log(exp(x)+ 1)。 看起来如下:

代码语言:js
复制
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)。 看起来如下:

代码语言:js
复制
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形状。 请注意,这些功能有两个水平渐近线。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年04月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档