每天一遍,学习不厌
TensorFlow
介绍
TensorElow.TM是一个采用数据流图( data flow graphs ),用于数值计算的开源软件库。节点(Nodes )在图中表示数10作,图中的线( edges )则表示在节点间相互联系的多维数据数组,即张量( tensor )。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPL ),服务器,移动设备等等。
数据流图用“结点” ( nodes )和"线"(edges)的有向图来描述数学计算。“节点”一般用来表示施加的数学操作,但也可以表示数据输入( feed in )的起点/输出( push out )的终点,或者是读取/写入持久变量( persistent variable )的终点。“线"表示′节点"之间的输入/输出关系。这些数据"线"可以输运"size可动态调整"的多维数据数组,即“张量” ( tensor )。张量从图中流过的直观图像是这个工具取名为"Tensorflow"的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
数据流图用“结点” ( nodes )和“线"(edges)的有向图来描述数学计算。"节点”一般用来表示施加的数学操作,但也可以表示数据输入( feed in )的起点/输出
( push out )的终点,或者是读取/写入持久变量( persistent variable )的终点。“线"表示“节点"之间的输入/输出关系。这些数据“线"可以输运"size可动态调整"的多维数据数组,即“张量”( tensor )。张量从图中流过的直观图像是这个工具取名为"Tensorflow"的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型。
TensorFlow计算模型——计算图
计算图—―搭建神经网络的计算过程,只搭建,不运算。
TensorFlow的名字中己经说明了它最重要的两个概念——Tensor和Flow。
Tensor就是张量。张量这个概念在数学或者物理学中可以有不同的解释。
在TensorFlow中,张量可以被简单地理解为多维数组,如果说TensorFlow 的第一个词Tensor表明了它的数据结构,那么Flow则体现了它的计算模型。Flow翻译成中文就是"流”,它直观地表达了张量之间通过计算相互转化的过程。
TensorElow是一个通过计算图的形式来表述计算的编程系统。TensorFlow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
TensorFlow程序─般可以分为两个阶段。
在第一个阶段需要定义计算图中所有的计算。
比如在上图向量加法样例程序中首先定义了两个输入,然后定义了一个计算来得到它们的和。
第二个阶段为执行计算。
import tensorflow as tf
a = tf.constant([1.0,2.0],name='a' )
b = tf.constant([2.0,3.0],name= 'b')
result = a + b
TensorFlow数据模型——张量( tf.Tensor )
https://tensorflow.google.cn/guideltensors
张量― 多维数组(列表),阶—— 张量的维数。
在TensorFlow程序中,所有的数据都通过张量的形式来表示。从功能的角度上看,张量可以被简单理解为多维数组。其中零阶张量表示标量( scalar ) ,也就是一个数;第一阶张量为向量( vector),也就是一个一维数组;第n 阶张量可以理解为一个n维数组。
但张量在Tensor Flow中的实现并不是直接采用数组的形式,它只是对TensorFlow中运算结果的引用。在张量中并没有真正保存数字,它保存的是如何得到这些数字的计算过程。还是以向量加法为例,当运行如下代码时,并不会得到加法的结果,而会得到对结果的一个引用。
从上面代码的运行结果可以看出,一个张量中主要保存了三个属性∶名字( name )、维度( shape )和类型( type ).
我们从上图了解了Tensor Flow的计算都可以通过计算图的模型来建立,
而计算图上的每一个节点代表了一个计算,计算的结果就保存在张量之中。所以张量和计算图上节点所代表的计算结果是对应的。这样张量的命名就可以通过”node:src_ output "的形式来给出。其中node为节点的名称,src-output表示当前张量来自节点的第几个输出。
比如上面代码打出来的"add:0”就说明了result这个张量是计算节点” add ”输出的第一个结果(编号从0开始)。
张量的第二个属性是张量的维度( shape )。这个属性描述了一个张量的维度信息。比如上面样例中shape = ( 2,)说明了张量result是一个一维数组,这个数组的长度为2。
张量的第三个属性是类型( type ),每一个张量会有一个唯一的类型。TensorFlow 会对参与运算的所有张量进行类型的检查,当发现类型不匹配时会报错。
TensorFlow运行模型——会话( session )
执行计算图中的节点运算。
前面的两节介绍了TensorFlow是如何组织数据和运算的。本节将介绍如何使用TensorFlow中的会话( session )来执行定义好的运算。会话拥有并管理
TensorFlow程序运行时的所有资源。所有计算完成之后需要关闭会话来帮助系统回收资源,否则就可能出现资源泄漏的问题。TensorFlow中使用会话的模式一般有两种,第一种模式需要明确调用会话生成函数和关闭会话函数,这种模式的代码流程如下。
使用这种模式时,在所有计算完成之后,需要明确调用Session.close函数来关闭会话并释放资源。
为了解决异常退出时资源释放的问题,TensorFlow可以通过Python的上下文管理器来使用会话。以下代码展示了如何使用这种模式。
变量(tf.Variable)
变量( tf.Variable )的作用就是保存和更新神经网络中的参数。和之前的不一样。
参数︰即线上的权重W,用变量表示,随机给初值。
当创建一个变量时,你将一个张量作为初始值传入构造函数Variable()。TensorFlow提供了一系列操作符来初始化张量,初始值是常量或是随机值。
注意,所有这些操作符都需要你指定张量的shape。那个形状自动成为变量的shape。变量的shape通常是固定的,但TensorFlow提供了高级的机制来重新调整其行列数。
神经网络中常用的生成随机数数组的函数有∶
变量的初始化必须在模型的其它操作运行之前先明确地完成。最简单的方法就是添加一个给所有变量初始化的操作,并在使用模型之前首先运行那个操作。
tf.initialize_all_variables 初始化所有的变量,才能进行运算。
神经网络的实现过程
1、准备数据集,提取特征,作为输入喂给神经网络(Neural Network NN)
2、搭建NN结构,从输入到输出(先搭建计算图,再用会话执行)
3、大量特征数据喂给NN,迭代优化NN参数
4、使用训练好的模型预测和分类
基于tensorflow的前向传播
变量初始化︰在sess.run 函数中用tf.global_variables_initializer()汇总所有待优化变量。
#全局变量的初始化器
init_op = tf.global_variables_initializer()
sess.run(init_op
计算图节点运算:在sess.run函数中写入待运算的节点
sess.run(y)
placeholder也是一个张量,占位投喂,专门用来声明自变量的
用tf.placeholder占位,在sess.run 函数中用函数中用feed_dict喂数据
喂一组数据
import tensorflow as tensorflow
x = tf.pleaceholder(tf.float32,shape = (1,2))
print(x)
w0 = tf.constant([[1,2,3,4],[5,6,7,8]],dtype = 'float32')
w1 =tf.constant([[2],[3],[2],[1]],dtype = 'folat32')
l1 = tf.matmul(x,w0)
out = tf.matmut(l1,w1)
with tf.Sessin() as sess:
r = sess.run(out,feed_dict={x:[5.,6.]})
print(r)
喂多组数据 ,要改成,shape =(None,2) ,代表n行两列,数据之间相乘的时候只要后面的数值可以对上就可以。
'占位符'
import tensorflow as tensorflow
x = tf.pleaceholder(tf.float32,shape = (None,2))
print(x)
w0 = tf.constant([[1,2,3,4],[5,6,7,8]],dtype = 'float32')
w1 =tf.constant([[2],[3],[2],[1]],dtype = 'folat32')
l1 = tf.matmul(x,w0)
out = tf.matmut(l1,w1)
with tf.Sessin() as sess:
r = sess.run(out,feed_dict={x:[5.,6.]})
print(r)
r = sess.run(out,feed_dict = {x:[[5.,6.],[6.,5.]]})
print(r)
反向传播
反向传播︰训练模型参数,在所有参数上用梯度下降,使神经网络模型在训练数据上的损失函数最小。
损失函数
损失函数的计算有很多方法。
解决回归问题的损失函数:均方误差MSE
用tensorflow函数表示为loss_mse = tf.reduce_mean(tf.square(y_- y)) ,tensorflow的自带API
反向传播训练方法︰以减小 loss值为优化目标,有梯度下降、adam优化器等优化方法。
这两种优化方法用tensorflow的函数可以表示为∶
以上的两种优化器,用来减小损失值,第一种是小批量的梯度下降优化器,需要学习率。在传入损失函数。
tf.train.GradientDescentOptimizer使用随机梯度下降算法,使参数沿着梯度的反方向,即总损失减小的方向移动,实现更新参数。其中,J(θ)为损失函数,θ(可以理解为w)为参数,α为学习率。(常用于模型简单的,自定义的学习率找到的最优可能只是局部最优)
和梯度下降的思想: W1 = W0 -learn_rate * 对W0的求偏导
- tf.train.AdamOptimizer()是利用自适应学习率的优化算法,Adam 算法和随机梯度下降算法不同。随机梯度下降算法保持单一的学习率更新所有的参数,学习率在训练过程中并不会改变。而Adam算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。(适合大数据,复杂的网络结构,但是效率低下,耗时)
学习率learning_rate :决定每次参数更新的幅度。
优化器中都需要一个叫做学习率的参数,使用时如果学习率选择过大会导致待优化的参数在最小值附近波动不收敛的情况,如果学习率选择过小,会出现收敛速度慢的情况。我们可以选个比较小的值填入,比如0.01 . o.001。
解决分类问题的损失函数:交叉熵( cross entropy )
假设有两个分布p ( 1,0,0 )与q(0.8,0.1,0.1 ),则它们在给定样本集上的交叉嫡定义如下:
p ( 1,0,0 )代表真实的预测值输出的概率,一个为1,其他的都为0。与q(0.8,0.1,0.1 )代表预测的输出,第一个的预测值为0.8,其他的为0.1,两者之间存在着损失
交叉熵可以计算得到(0.8,0.1,0.1),与(0.7,0.1,0.1,)哪一个距离(1,0,0)距离更近。交叉熵越小,说明效果越小,越准确。
通过训练,调整参数,使得其他类别的概率无线的趋近于0,而相应的概率应该为1.
用Tensorflow 函数表示:
numpy,clip的作用是如下:使得比2小的变成2,比5 大的变成5
使其值不能小于1e-12,不能大于1
ce=-tf.reduce_sum(p * tf.log(tf.clip_by_value(q,1e-12,1.0)))
( 1e-12是为了防止log0出现)
两个神经网络模型解决二分类问题中,已知标准答案为p=(1,0),第一个神经网络模型预测结果为q1=(0.6,0.4),第二个神经网络模型预测结果为q2=(0.8,0.2),判断哪个神经网络模型预测的结果更接近标准答案。
根据交叉嫡的计算公式得
由于0.222>0.097,所以预测结果y2与标准答案与标准答案y_更接近,y2预测更准确。
总结
交叉嫡刻画了两个概率分布之间的距离,它是分类问题中使用比较广的一种损失函数。
交叉嫡越大,两个概率分布距离越远,两个概率分布越相异;
交叉嫡越小,两个概率分布距离越近,两个概率分布越相似。
常见交叉熵的函数
TensorFlow针对分类问题,实现了常见的交叉熵函数,分别是
- tf.nn.sigmoid cross_ entropy_ with_ logits
计算方式:对输入的logits先通过sigmoid函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得的结果不至于溢出。
logists=预测输出,labels=真实输出
适用:每个类别相互独立但互不排斥的情况:例如一-幅图可以同时包含一条狗和一只大象。(结果是多个类别的概率值,结果可以同时属于多个类别)多取值
output不是一个数 ,而是一个batch中每 个样本的loss,所以一般配tf.reduce__mean(loss) 使用。
●tf.nn.softmax cross. entropy with. logits
tf.nn.softmax_ cross_ entropy_ with_logits(labels=None,
1ogits=None)
计算方式:对输入的logits先通过softmax函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。
适用:每个类别相互独立且排斥的情况,一幅图只能属于一类,而不能同时包含一条狗和一 只大象。(输出结果就是0和1,所有结果只能是属于1的那一个类别)单取值
神经网络计算过程:
1.导入模块,生成模拟数据集;
import
常量定义
生成数据集
2.前向传播:定义输入、参数和输出
×=(输入) y_= (预测输出)
w1= (权重) w2=(权重)
b = (阈值,偏置项) y= (真实输出)
3.反向传播:定义损失函数、反向传播方法
loss=(损失函数)
train step=(训练步骤)
4.生成会话,训练STEPS轮
基于Tensorflow训练神经网络
BATCH_SIZE是定义一次跑多少个样本。输出样本要是一行两列,表示是否属于这个类。
用一下方法实现
AdamOptimizer(0.001) . minimize(loss)自适应学习率效果可能更好
31-47
48-56
57-70
图像处理与CNN
计算机眼中的图像
在计算机中,对于图像存储是通过矩阵来存储的。照片分为黑白和彩色。在图像里我们相应的有灰度图和彩色图。
对于灰度图像,由于只有明暗的区别,因此只需要一个数字就可以表示出不同的灰度。通常用0表示最暗的黑色, 255表示最亮的白色,介于0和255之间的整数则表示不同明暗程度的灰色。
对于彩色图像,我们用( R,G,B )三个数字来表示一个颜色,他们表示用红®、绿(G)、蓝(B)三种基本颜色叠加后的颜色。对于每种基本颜色,我们用0到255之间的整数表示这个颜色分量的明暗程度。
三个数字中对应的某种基本颜色的数字越大,表示该基本颜色的比例越大,例如
( 255,0,0 )表示纯红色,( 0,255,0 )表示纯绿色,( 135,206,255 )表示天蓝
色。
一-张彩色图片我们可以用一一个由整数组成的立方体阵列来表示。我们称这样的立方体排列的数字阵列为三阶张量( tensor )。这个三阶张量的长度与宽度就是图片的分辨率,高度为3.对于数字图像而言,三阶张量的高度也成为通道( channel )数,因此我们说彩色图像有3个通道。矩阵可以看成是通道为1的三阶张量。
图像特征概述
在深度学习出现之前,图像特征的设计- -直是计算机视觉领域中一个重 要的研究
课题,在这个领域发展初期,人们手工设计了各种图像特征,这些特征可以描述
图像的颜色、边缘、纹理等性质,结合机器学习技术,能解决物体识别和物体检
测等实际问题。
卷积运算
卷积定义
卷积是两个变量在某范围内相乘后求和的结果。
一维卷积
卷积运算的物理意义:一个函数(如:单位响应)在另一个函数(如:输入信号)上的加权叠加
有两个离散信号
待卷积信号X=[1,2,3,0,1,0],
卷积核 H=[1,2,1]
卷积运算 Y=X* H
valid
自始至终卷积核都在"信号内”
最后得到的结果的长度会小于卷积信号的长度
same
卷积核的中心刚好是从待卷积信号的第一个元素"划”到最后一个元素卷积结果的长度和待卷积信号长度一-样
full
从卷积核的最后一个元素开始,直到第一个元素到与待卷积信号第一个元素对齐卷积结果的长度是n+m-1
二维卷积
图像数据是5x5的维矩阵 ,使用一 一个3x3的卷积核 ,从左到右从 上到下滑动。滑动的过程称为stride, 一个卷积层有两个stride ,分别从上到下,从左到右,步长一般设定为1或2。
利用卷积提取图像特征
卷积运算在图像处理中应用十分广泛,许多图像特征提取方法都会用到卷积。以灰度图为例,, 我们知道在计算机中,一个灰度图像被表示为一个整数矩阵,如果我们用一个形状较小的矩阵和这个图像矩阵做卷积运算,就可以得到一一个新的矩阵,这个新的矩阵可以看作是一副新的图像,换句话说,通过卷积运算,我们可以将原图像变换为一副新的图像。这幅新图像比原图像更清楚地表示了某些性质,我们就可以把它看做原图像的一一个特征。
这里用到的小矩阵就称为卷积核( convolution kernel) , 通常,图像矩阵中的元
素都是介于0到255的整数,但卷积核中的元素可以是任意实数。
通过卷积,我们可以从图像中提取边缘特征,在没有边缘的比较平坦的区域,图像的像素值的变化较小,而横向边缘上下两侧的像素值差异明显,竖向边缘左右两侧的像素也会有较大差别。
如上图,我们用1、0、-1组成的卷积核与原图像进行卷积运算,可以从图像中提取出竖向边缘。
事实上,这两个卷积核分别计算了原图像上每个3*3区域内左右像素或者上下像素的差值(为了将运算结果以图像的形式显示出来,我们对运算结果取绝对值) ,通过这样的运算,我们就可以从图像上提取不同的边缘特征。
卷积神经网络基本结构
Alex Net神经网络
上图为Alex Net神经网络的主体部分,主体部分有5个卷积层和3个全连接层组成
5个卷积层位于网络的最前端,依次对图像进行变换以提取特征;
每个卷积层之后都有一个ReLU(功能类似sigmiod)非线性激活层完成非线性变换;
第一、二、五个卷积层之后连接有最大池化层,用以降低特征图的分辨率。
经过5个卷积层以及相连的非线性激活层与池化层之后,特征图被转换为4096维特征向量,在经过两次全连接层和ReLU层变换之后,成为最终的特征向量,在经过一个全连接层和一个softmax归一化指数层之后,就得到了对图片所属类型的预测。