深度学习
卷积神经网络的结构
- 卷积层 -> **函数 -> 池化层 -> 全连接层
a、卷积层
卷积层过滤器
|
现在有三维数据 [ 28 * 26] 的图片
- 过滤器(卷积核)数量100个
- 卷积核大小为5 * 5
- 扫射步长为 1
- 零填充 1
,,,
,,,
单张图片得到的的结果是[26,24]的卷积结果,过滤器一共是100个没有考虑,如果考虑了形状是[26,24,100]
卷积层API:
- tf.nn.conv2d(input, filter, strides=, padding=, name=None)
计算给定4-D input和filter张量的2维卷积 - input:给定的输入张量,具有[batch,heigth,width,
channel],类型为float32,64 - filter:指定过滤器的大小,[filter_height, filter_width, in_channels, out_channels]
- filter_height 过滤器的高
- filter_width 过滤器的宽
- in_channels 图片通道大小 28 * 28 * 3
- out_channels 过滤器的数量
- strides:strides = [1, stride, stride, 1],步长
- padding:“SAME”, “VALID”,使用的填充算法的类型,
使用“SAME”。其中”VALID”表示滑动超出部分舍弃,
“SAME”表示填充,原来的大小
b、**函数
**函数有什么特征和作用,**函数主要的作用就是处理非线性分割。
左边是Linear函数就是没有**函数,右边使用的是近两年诞生的relu线性整流函数作为**函数。
http://playground.tensorflow.org/
第一,采用sigmoid等函数,反向传播求误差梯度时,计算量相对大,而采用Relu**函数,整个过程的计算量节省很多
第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(求不出权重和偏置)
第三,把图像不相关的特征去除
**函数: tf.nn.relu(features, name=None)
features:卷积后加上偏置的结果
return:结果
c、池化层
Pooling层主要的作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。
池化是缩小高、长方向上的空间的运算。下图所示,进行将 2 * 2的区域集约成1个元素的处理,缩小空间大小。
池化: tf.nn.max_pool(value, ksize=, strides=, padding=,name=None) 输入上执行最大池数
value:4-D Tensor形状[batch, height, width, channels]
ksize:池化窗口大小,[1, ksize, ksize, 1]
strides:步长大小,[1,strides,strides,1]
padding:“SAME”, “VALID”,使用的填充算法的类型,使用“SAME”
d、全连接层
分析:前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
55000 * 28 * 28 * 100 = 55000 * 14 * 14 * 100 -> [55000,14 * 14 * 100] * [14 * 14 * 100,10] + [10]