卷积和池化
首先介绍一下Tensorflow当中的卷积和池化操作。
- .卷积操作如下
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
#添加一个卷积层如下,
conv1 = tf.layers.conv2d( # shape (28, 28, 1)
inputs=image,
filters=16,
kernel_size=5,
strides=1,
padding='same',
activation=tf.nn.relu
)
ARGS:
- input:A Tensor。必须是以下类型之一:float32,float64。并且必须为一个4维的数据
- filter:A Tensor。必须有相同的类型input。
- strides:列表ints。1-D长度4.每个尺寸的滑动窗口的步幅input。步长一般为1,strides = [1,X,Y,1],
padding: A string来自:"SAME", "VALID"。使用的填充算法的类型。一般只用SAME,
- use_cudnn_on_gpu:可选bool。默认为True。
- name:操作的名称(可选)。激活函数一般选择tf.nn.relu,激活函数的作用,用来增加线性分割能力,sigmoid一般会造成梯度消失,或者计算参数太多,资源消耗
卷积过程 如下
总结输出大小
输入体积大小H_1*W_1*D_1H1∗W1∗D1
四个超参数:
- Filter数量K
- Filter大小F
- 步长S
- 零填充大小P
输出体积大小H_2*W_2*D_2H2∗W2∗D2
- H_2 = (H_1 - F + 2P)/S + 1H2=(H1−F+2P)/S+1
- W_2 = (W_1 - F + 2P)/S + 1W2=(W1−F+2P)/S+1
- D_2 = KD2=K
注意如下
- 卷积后的长度=(原长度-kernel_size+padding*2)/strides+1
- 卷积后的宽度=(原宽度-kernel_size+padding*2)/strides+1
- 卷积后的高度=filters
- 卷积会造成特征增多,
2. 池化操作
tf.nn.max_pool(value, ksize, strides, padding, name=None)
ARGS:
- value:A 4-D Tensor具有形状[batch, height, width, channels]和类型float32,float64,qint8,quint8,qint32。
- ksize:长度> = 4的int列表。输入张量的每个维度的窗口大小。
- strides:长度> = 4的int列表。输入张量的每个维度的滑动窗口的跨度。
以前的API需要指定4维度,strides在官方定义中是一个一维具有四个元素的张量,其规定前后必须为1,这点大家就别纠结了,中间两个数分别代表了水平滑动和垂直滑动步长值。步长为2时,strides=[]1,2,2,1]- padding:一个字符串,或者'VALID'或'SAME'。填补算法。
- name:操作的可选名称。
以前的API需要指定W_conv1 = weight_variable([5,5, 1,32]) # patch 5x5, in size 1, out size 32
pool1 = tf.layers.max_pooling2d(
conv1,
pool_size=2,
strides=2,
)
池化
- 池化操作会减小维度,
- 池化特征提取
- 常用的大小为2*2 步长 也为2
- 分类的话需要全连接层,
- 全连接层相当于做特征加权加权操作,,卷积和池化相当于特征工程,整个网络相当于一个''分类器''