卷积层:
相同填充模式下: 三通道图片7x7x3 经过一个卷积核(3x3x3)+偏执(1),该图片变成一通道(3x3x1)图片。
再经过一个卷积核(3x3x3)+偏执(0),该图片变成了二通道(3X3X2)图片。
经过多层卷积之后,就是一层一层地增加网络深度,最终得到一个又深又窄的表示,这个表示就是这个图片提取的特征。然后把其连接到全连接层,然后训练分类器。
共享权重:
我们想识别图像中的动物类别,那么动物在图片中的位置(左上角、中间或是右下角)是不重要的,这叫平移不变性;再比如说,在识别数字的过程中,数字的颜色并不影响结果;又或者说,在语言处理中,一些词汇在句子中的位置并不影响其代表的含义。当两种输入可以获得同样的信息,那么我们就应该共享权重而且利用这些输入来共同训练权重
池化层:
通过卷积后,为了引入不变性,同时防止过拟合问题或欠拟合问题、降低计算量,我们常进行池化处理。池化过程如上图所示。因此池化过后,通常图像的宽度和高度会变成原来的1/2。
在LeNet-5中,输入层是32x32的尺寸。
- 在第一次卷积中,使用了6个卷积核,得到了C1:6张28x28的特征图。
- 然后进行下采样,得到S2:特征图宽、高变为原来的1/2,即28/2=14,特征图尺寸变为14x14,特征图张数不变。
- 再进行第二次卷积,使用了16个卷积核,得到了C3:16张10x10的特征图。
- 然后进行下采样,得到S4:特征图宽、高变为原来的1/2,即10/2=5,特征图尺寸变为5x5,特征图张数不变。
- 之后进入卷积层C5,120张1x1全连接后的特征图,与S4全连接。
通过TensorFlow训练:
TensorFlow实际上对应的是一个C++后端,TensorFlow使用会话(Session)与后端连接。
交互式会话:
sess = tf.InteractiveSession()
sess是一个交互式会话,使得我们可以在运行图(Graph)的时候再插入计算图。
x = tf.placeholder(“float”, shape=[None,784])
x是占位符,可以在TensorFlow运行某一计算时根据该占位符输入具体的值。
None指张量shape某一维度未定,这里指batch大小未定。
(784=28X28 图片的单通道像素点,图片张数未定,多张图片构成一个batch)
y_ = tf.placeholder(“float”, shape=[None,10])
数字识别,10分类。
#初始化权重
def weight_variable(shape):
initial = tf.truncated_normal(shape, stddev = 0.1)//从截断正太分布中输出标准差为0.1的数据
return tf.Variable(initial)
#初始化偏置项
def bias_variable(shape):
initial = tf.constant(0.1, shape = shape )
return tf.Variable(initial)