Tensorflow快餐教程(9) - 卷积

0
2
0
1. 云栖社区>
2. 博客>
3. 正文

## Tensorflow快餐教程(9) - 卷积

lusing 2018-05-04 18:34:21 浏览2105

# 卷积

## 卷积就是滑动中提取特征的过程

$h(x)=f(x)*g(x) =\int_{-\infty}^{\infty}f(t)g(x-t)dt$

$h(x)=(f*g)(x) = \sum_{t=-\infty}^{\infty}f(t)g(x-t)$

g(x-t)是变化的，而f(t)是固定不动的。我们可以将卷积理解成是g(x-t)滑动过程中对f(t)进行采样。

array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]], dtype=float32)

y=wx+b我们取w为3*3的全1矩阵，b=0。

[[9,9,9],
[9,9,9],
[9,9,9]]

array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]], dtype=float32)

[[3,2,1],
[2,3,2],
[1,2,3]]

[[2,2,1,0,0],
[2,3,2,1,0],
[1,2,3,2,1],
[0,1,2,3,2],
[0,0,1,2,2]]

### 卷积用Tensorflow实现

>>> c
array([[[[1.],
[0.],
[0.],
[0.],
[0.]],

[[0.],
[1.],
[0.],
[0.],
[0.]],

[[0.],
[0.],
[1.],
[0.],
[0.]],

[[0.],
[0.],
[0.],
[1.],
[0.]],

[[0.],
[0.],
[0.],
[0.],
[1.]]]], dtype=float32)

>>> a2 = sess.run(tf.ones([3,3]))
>>> a2
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=float32)

>>> a3 = sess.run(tf.reshape(a2,[3,3,1,1]))
>>> a3
array([[[[1.]],

[[1.]],

[[1.]]],

[[[1.]],

[[1.]],

[[1.]]],

[[[1.]],

[[1.]],

[[1.]]]], dtype=float32)

>>> a1 = tf.nn.conv2d(c,a3,strides=[1,1,1,1],padding='SAME')
>>> sess.run(a1)
array([[[[2.],
[2.],
[1.],
[0.],
[0.]],

[[2.],
[3.],
[2.],
[1.],
[0.]],

[[1.],
[2.],
[3.],
[2.],
[1.]],

[[0.],
[1.],
[2.],
[3.],
[2.]],

[[0.],
[0.],
[1.],
[2.],
[2.]]]], dtype=float32)

>>> a5 = tf.reshape(a4,[5,5])
>>> sess.run(a5)
array([[2., 2., 1., 0., 0.],
[2., 3., 2., 1., 0.],
[1., 2., 3., 2., 1.],
[0., 1., 2., 3., 2.],
[0., 0., 1., 2., 2.]], dtype=float32)

## 池化层

[[2,2,1,0,0],
[2,3,2,1,0],
[1,2,3,2,1],
[0,1,2,3,2],
[0,0,1,2,2]]

[[3,3,2,1],
[3,3,3,2],
[2,3,3,3],
[1,2,3,3,]]

>>> b = tf.reshape(a,[-1,5,5,1])
>>> c = sess.run(b)
array([[[[1.],
[0.],
[0.],
[0.],
[0.]],

[[0.],
[1.],
[0.],
[0.],
[0.]],

[[0.],
[0.],
[1.],
[0.],
[0.]],

[[0.],
[0.],
[0.],
[1.],
[0.]],

[[0.],
[0.],
[0.],
[0.],
[1.]]]], dtype=float32)

d =tf.nn.max_pool(c,ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

>>> sess.run(d)
array([[[[1.],
[0.],
[0.]],

[[0.],
[1.],
[0.]],

[[0.],
[0.],
[1.]]]], dtype=float32)

## 卷积网络的结构

1. 输入层：一般认为就是原图片
2. 卷积层：与全连接网络不同，卷积层中每一个节点的输入只是上一层神经网络的一小块，常用的块大小为33或者55。一般来说，通过卷积层处理过的节点的矩阵的深度会变深
3. 池化层：Pooling层不会改变矩阵的深度，但是会使矩阵变小。可以理解为池化层是把高分辨率的图片转化成低分辨率的图片
4. 全连接层：最后的分类工作一般还是由一至两个全连接层来实现的。

## 卷积网络简史

10年后的1998年，Yann LeCun设计了LeNet网络。在论文《Gradient-Based Learning Applied to Document Recognition》中提出了LeNet-5的模型，结构如下：

AlexNet成功之后，大家的研究热情空前高涨。主要方向有网络加深和功能增强。

1. 网络加深：深度学习的优势就是突破了加深层数的关键点。那么就可以构建比AlexNet层数更多的网络。代表作是2014年ImageNet比赛的亚军牛津大学的VGGNet，它的层数可以达到16~19层。从而将Top-5错误率从AlexNet的15.3%降到了7.32%.