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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏游戏开发那些事

【小白学游戏常用算法】一、随机迷宫算法

  现在的很多游戏中的地图一般采用格子的方式,虽然在表面地图上无法看到实际的格子,但是在地图的结构中专门有一个逻辑层,这个层和地图大小相等,划出很多小的格子,然...

1552
来自专栏祝威廉

基于Spark /Tensorflow使用CNN处理NLP的尝试

关于CNN如何和NLP结合,其实是被这篇文章指导入门的 。 我觉得使用CNN去处理一些NLP的分类问题,是非常不错的。

1742
来自专栏MixLab科技+设计实验室

用谷歌新开源的deeplearnJS预测互补颜色

本文翻译自deeplearnJS的示例教程,并结合了我在学习过程中的理解。 deeplearnJS简介: deeplearn.js是用于机器学习的开源WebGL...

3238
来自专栏DHUtoBUAA

编程求取直线一般式表达式,两直线交点

背景介绍   最近在水面无人艇(USV)模拟仿真中,用到了一些点和线的关系求解,本文主要讲述一下两点确认直线,点到直线距离,两条直线的交点等问题的解决方法,并给...

4767
来自专栏人工智能LeadAI

基于Spark /Tensorflow使用CNN处理NLP的尝试

01 前言 关于CNN如何和NLP结合,其实是被这篇文章(http://www.wildml.com/2015/11/understanding-convolu...

3946
来自专栏IT派

一文带你入门Tensorflow

导语:此文编译自FCC(FreeCodeCamp),作者为Déborah Mesquita,该作者利用神经网络和TensorFlow进行了机器文本分类,并提出了...

4399
来自专栏大数据文摘

机器学习中的线性代数:关于常用操作的新手指南

2022
来自专栏机器之心

教程 | 利用TensorFlow和神经网络来处理文本分类问题

3447
来自专栏人工智能LeadAI

实现与优化深度神经网络

全连接神经网络 辅助阅读:TensorFlow中文社区教程 - 英文官方教程(http://www.tensorfly.cn/tfdoc/tutorials/m...

35411
来自专栏机器学习算法与Python学习

Torch7模型训练

Torch7搭建卷积神经网络详细教程已经详细的介绍啦Module模块,这里再次基础上再给出一些上Container、 Transfer Functions La...

38913

扫码关注云+社区

领取腾讯云代金券