卷积神经网络

SAME和VALID特征图大小计算


SAME模式:根据卷积核大小,按需在图像上扩充padding,在原图四周补0,若需补奇数0则多出来的补在右边和下边。
输出的大小与步长相关,当步长为1时尺寸与原图一致,否则会变小。
卷积核filter是用fiter的跟原图的边角开始重合进行卷积计算。

输入特征图大小:W×H
卷积核大小: k×k
卷积步长: s×s
输出特征图大小: W1×H1

输出尺寸公式:

//math.ceil()向上取整
W1 = math.ceil(W / s)
H1 = math.ceil(H / s)

VALID模式: 根据图片实际大小执行卷积,不对图像边界填充,卷积后特征图变小。
卷积核filter是在原图进行卷积计算。

输入特征图大小:W×H
卷积核大小: k×k
卷积步长: s×s
输出特征图大小: W1×H1

输出尺寸公式:

//math.ceil()向上取整
W1 = math.ceil((W-k+1) / s)
H1 = math.ceil((H-k+1) / s)

其实还有一种FULL模式,参看:
卷积的三种模式:full, same, valid

《tensorflow中文文档 - 2.4MNIST进阶》例子分析


tensorflow中文文档 - 2.4MNIST进阶

一开始主要是《构建一个多层卷积网络》这一节有点不明白,参考这篇一起看比较容易理解:
tensorflow多层卷积网络入门

def conv2d(x, W):
  return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def max_pool_2x2(x):
  return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                        strides=[1, 2, 2, 1], padding='SAME')

strides参数官方解释:


可以看出strides是滑动步长,基本strides[0]strides[3]固定为1,strides[1]strides[2]分别是水平和垂直的步长。

在官方的这个例子中第一层卷积算出32个特征,第2层算出64个特征,这里的32和64个数都是用户自己指定的,也可以指定为其他数目,我的理解这里就是用32和64个filter进行卷积,所以出来有32和64个特征结果。

原图像是2828大小,每一层卷积后都跟着一个22的池化层,每次池化都会缩小一倍,所以经过两层池化卷积后变成了7*7大小。

这时再连接一个密集连接层也就是全连接层,这个全连接层有1024个神经元。把上面池化后的张量reshape成向量然后跟全连接层连接。

为了防止或减轻过拟合再加上dropout
最后添加softmax输出层。

你可能感兴趣的:(卷积神经网络)