莫烦python-Tensorflow笔记

人工神经网络

人工神经网络不会凭空产生新连接,而是来更换神经元从而形成一个更好的神经系统,本质上是一个能让计算机处理和优化的一个数学模型。
根据外部信息的基础通过正向和反向传播来改变内部结构,是一种自己适应的逐渐的过程,常用来对输入和输出间复杂的关系进行建模,或者探索数据间的模式。
输入层:直接接受信息的神经层
隐藏层:负责传入信息的加工处理
输出层:信息在神经元中传递、中转、分析、权衡形成分析输出的结果
激励函数给计算机一个刺激行为,根据输出结果的正确与否,调整参数,有的神经元变得迟钝,有的神经元被激活起来,变得对图片里真正重要的信息敏感。随着训练次数增多,被改动后的参数就能变得能预测出正确的结果。
#optimization
Newton’s method/Least Squares method/Gradient Descent
我们研究的神经网略就属于Gradient Descent,经常遇到误差方程(cost function),用来计算预测出来的和我们实际中的值有多大差别。存在局部最优解(local minimum)和全局最优解(global minimum),通常境况下即便不是全局最优解,神经网络也能让你的局部最优足够优秀, 以至于即使拿着一个局部最优也能出色的完成手中的任务。
一般来说, 神经网络是一连串神经层所组成的把输入进行加工再输出的系统。我们能将神经网络分成三部分,输入端、黑盒、输出端,中间的加工过程就是黑盒。将神经网络第一层加工后的信息叫做代表特征(feature representation)。加工过程就是将一种代表特征转换成另一种代表特征,一次次特征之间的转换,也就是一次次的更有深度的理解。
代表特征的另一个应用:迁移学习(transfer learning)。

Tensorflow

TensorFlow是Google开发的一款神经网络的Python外部的结构包,也是一个采用数据流图来进行数值计算的开源软件库。TensorFlow让我们可以先绘制计算结构图,也可以称是一系列可人机交互的计算操作,然后把编辑好的Python文件转换成 更高效的C++,并在后端进行计算。
机器学习其实就是让电脑不断的尝试模拟已知的数据。他能知道自己拟合的数据离真实的数据差距有多远, ,然后不断地改进自己拟合的参数,提高拟合的相似度。
Tensorflow 首先要定义神经网络的结构, 然后再把数据放入结构当中去运算和 training。因为TensorFlow是采用数据流图来计算,所以首先我们得创建一个数据流流图, 然后再将我们的数据(数据以张量(tensor)的形式存在)放在数据流图中计算。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。训练模型时tensor会不断的从数据流图中的一个节点flow到另一节点,这就是TensorFlow名字的由来。
张量的分别:
零阶张量为纯量或标量 (scalar) ,也就是一个数值。
一阶张量为向量 (vector)。
二阶张量为矩阵 (matrix)
以此类推

加速神经网络训练过程

传统的参数 W 的更新是把原始的 W 累加上一个负的学习率(learning rate) 乘以校正值 (dx)。这种方法可能会让学习过程曲折无比,看起来像 喝醉的人回家时,摇摇晃晃走了很多弯路。

W += - Learning rate * dx
  1. Stochastic Gradient Descent (SGD)
    把数据拆分成小批小批的,然后再分批不断放入 NN 中计算。虽然不能反映整体数据的情况,不过却很大程度上加速了 NN 的训练过程, 而且也不会丢失太多准确率.
  2. Momentum
    “惯性原则”,把这个人从平地上放到了一个斜坡上,只要他往下坡的方向走一点点,由于向下的惯性,他不自觉地就一直往下走,走的弯路也变少了。
m = b1 * m - Learning rate * dx
W += m
  1. AdaGrad
    “对错误方向的阻力”。这种方法是在学习率上面动手脚,使得每一个参数更新都会有自己与众不同的学习率,他的作用和 momentum 类似,不过不是给喝醉酒的人安排另一个下坡,而是给他一双不好走路的鞋子,使得他一摇晃着走路就脚疼,鞋子成为了走弯路的阻力,逼着他往前直着走。
v += dx^2
W += -Learning rate * dx / v^0.5
  1. RMSProp
    合并momentum和adagrad,但实际上缺少momentum部分
v = b1 *v + (1 - b1) * dx^2
W += -Learning rate * dx / v^0.5
  1. Adam
    计算m时有 momentum下坡的属性,计算 v 时有adagrad 阻力的属性,然后再更新参数时把m和V都考虑进去。实验证明,大多数时候,使用adam都能又快又好的达到目标,迅速收敛。所以说,在加速神经网络训练的时候,一个下坡,一双破鞋子,功不可没。
m = b1 * m - Learning rate * dx
v = b2 *v + (1 - b2) * dx^2
W += -Learning rate * m / v^0.5

Optimizer

过拟合

解决方法

  1. 增大数据量
  2. 利用正规化
    y=Wx
    L1: c o s t = ( W x − r e a l cost = (Wx-real cost=(Wxreal y ) 2 y)^2 y)2 + a b s ( W ) abs(W) abs(W)
    L2: c o s t = ( W x − r e a l cost = (Wx-real cost=(Wxreal y ) 2 y)^2 y)2 + ( W ) 2 (W)^2 (W)2
    L3: c o s t = ( W x − r e a l cost = (Wx-real cost=(Wxreal y ) 2 y)^2 y)2 + ( W ) 3 (W)^3 (W)3
  3. dropout
    在训练的时候,我们随机忽略掉一些神经元和神经联结,使这个神经网络变得“不完整”。用一个不完整的神经网络训练一次。到第二次再随机忽略另一些,变成另一个不完整的神经网络。相当于我们让每一次预测结果都不会依赖于其中某部分特定的神经元。像l1,l2正规化一样,过度依赖的 W,也就是训练参数的数值会很大,l1,l2会惩罚这些大的参数。Dropout 的做法是从根本上让神经网络没机会过度依赖。

卷积神经网络

神经网络是由一连串的神经层组成,每一层神经层里面有存在有很多的神经元。这些神经元就是神经网络识别事物的关键。

卷积神经网络(convolutional neural network)不再对每个像素的输入信息做处理,而是对图片上每一小块像素区域做处理,这种做法加强了图片信息的连续性。使得神经网络能看到图形, 而非一个点,这种做法同时也加深了神经网络对图片的理解。具体来说, 卷积神经网络有一个批量过滤器,持续不断的在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域,然后把收集来的信息进行整理,这时候整理出来的信息有了一些实际上的呈现,比如这时的神经网络能看到一些边缘的图片信息,然后在以同样的步骤,用类似的批量过滤器扫过产生的这些边缘信息,神经网络从这些边缘信息里面总结出更高层的信息结构,比如说总结的边缘能够画出眼睛,鼻子等等。再经过一次过滤,脸部的信息也从这些眼睛鼻子的信息中被总结出来。最后我们再把这些信息套入几层普通的全连接神经层进行分类,这样就能得到输入的图片能被分为哪一类的结果了。

PS:图片是有高度的!这里的高指的是计算机用于产生颜色使用的信息。如果是黑白照片的话,高的单位就只有1(0或1结构),如果是彩色照片,就可能有红绿蓝三种颜色的信息,这时的高度为3。

过滤器就是影像中不断移动的东西, 他不断在图片收集小批小批的像素块, 收集完所有信息后, 输出的值, 我们可以理解成是一个高度更高,长和宽更小的”图片”。这个图片里就能包含一些边缘信息。然后以同样的步骤再进行多次卷积,将图片的长宽再压缩,高度再增加。就有了对输入图片更深的理解。将压缩,增高的信息嵌套在普通的分类神经层上,我们就能对这种图片进行分类了。

在每一次卷积的时候, 神经层可能会无意地丢失一些信息。这时,池化 (pooling) 就可以很好地解决这一问题。而且池化是一个筛选过滤的过程,能将 layer 中有用的信息筛选出来,给下一个层分析。同时也减轻了神经网络的计算负担 。也就是说在卷集的时候,我们不压缩长宽,尽量地保留更多信息,压缩的工作就交给池化了,这样的一项附加工作能够很有效的提高准确性。

比较流行的一种搭建结构是这样,从下到上的顺序,首先是输入的图片(image),经过一层卷积层 (convolution),然后在用池化(pooling)方式处理卷积的信息,这里使用的是 max pooling 的方式。然后在经过一次同样的处理,把得到的第二次处理的信息传入两层全连接的神经层 (fully connected),这也是一般的两层神经网络层,最后在接上一个分类器(classifier)进行分类预测。

Convolutional Neural Networks (CNN) 是神经网络处理图片信息的一大利器.

从图片中抽离出来的小部分叫patch或者kernel,有自己的长、宽、厚度,抽离出来后经过分析都会得到一个长度一个宽度k个高度的数列,抽离的时候有一个参数教stride,即每次跨多少个单位像素点去抽离图片中的像素点(stride=2,隔一个取一个),压缩完后合并变成一个更小的立方体,这种抽离信息的方式叫做padding。
padding有两种形式,valid padding长度宽度裁剪了一些,抽取的这一块全部在里面,same padding长宽不变,抽取的这一块一部分在外面,用0来填充。

隐藏层又包含卷积层和池化层(pooling),图像输入到卷积神经网络后通过卷积来不断的提取特征,每提取一个特征就会增加一个feature map,所以立方体不断的增加厚度,为了减小图像的空间大小,在随后的卷积层之间周期性地引进pooling,pooling可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量,且具有加快计算速度也有防止过拟合的作用。pooling分两种,max pooling和average pooling。

image → \to convolution图层 → \to max pooling → \to convolution图层 → \to max pooling → \to fully connected → \to fully connected → \to classification
convolution+max pooling可以更好地保存原图像的信息数,全连接层fully connected是每一层是由许多神经元组成的的平铺结构,平铺是因为滤波器去卷积激活函数的输出得到的是一个值,即fully connected layer的一个神经元的输出。

PS:conv stride2(跨步大丢失信息)与conv stride1(跨步减小)+pooling(跨步变大)得到的图形相同

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值