TensorFlow 实现卷积神经网络(CNN)
文章目录
1. 知识点:
-
计算卷积后的图片的大小
- 在最后的全连接层使用,将卷积后的所有特征转换成1维向量,进行全连接
-
卷积核的使用
- 卷积核大小
- 卷积核步长
- 填充值
-
卷积核的特征数量
-
卷积函数的使用
-
池化函数的使用
2. 出错点:
- 卷积后的图像的大小
- 最后输出层输入大小
3. 卷积层(Conv Layer)的输出张量(图像)的大小
定义如下:
O = 输出图像的尺寸。
I = 输入图像的尺寸。
K = 卷积层的核尺寸
N = 核数量
S = 移动步长
P =填充数
基本公式为:
O = ⌈ I − K + 2 × P S ⌉ + 1 O = \bigg\lceil\frac{I-K+2\times P}{S}\bigg\rceil+1 O=⌈SI−K+2×P⌉+1
padding=’SAME‘ 填充0
**默认:**P = 0
符号:( ⌈ ⌉ \lceil \quad \rceil ⌈⌉ ):向上取整
输出图像尺寸的计算公式如下:
O = ⌈ I − K + 2 × 0 S ⌉ + 1 O = \bigg\lceil\frac{I-K+2\times 0}{S}\bigg\rceil+1 O=⌈SI−K+2×0⌉+1
例如:输入图片28x28,卷积核3x3 ,步长h=2, w=2,计算结果:
\bigg\lceil\frac{28-3+2\times 0}{2}\bigg\rceil+1=14
(28 -3)/2 = 12.5,向上取整为13 所以最后为14
注意:
- 当步长为1时,输出图片的尺寸等于输出图片的尺寸
- 如何高和宽 不同,那么就分开求值
padding=’VALID‘ 不填充(需验证)
默认:p = 1
公式为:
O = ⌈ I − K + 2 × p S ⌉ − 1 O = \bigg\lceil\frac{I-K+2\times p}{S}\bigg\rceil-1 O=⌈SI−K+2×p⌉−1
例如: 输入图片28x28,卷积核3x3 ,步长h=2, w=2,计算结果:
O = ⌈ 28 − 3 + 2 × 1 2 ⌉ − 1 = 13 O = \bigg\lceil\frac{28-3+2\times 1}{2}\bigg\rceil-1 = 13 O=⌈228−3+2×1⌉−1=13
(28-3+2)/2 =13.5 向上取整 14 减 1 = 13
4. 池化层(Conv Layer)的输出张量(图像)的大小
在TensorFlow
中:池化操作:(tf.nn.max_pool()
)
步长为1 时,图片尺寸不变
步长相同,尺寸不同时,图片尺寸相同
步长不同,尺寸相同时,图片尺寸不同
定义如下:
O = 输出图像的尺寸。
I = 输入图像的尺寸。
S = 移动步长
PS = 池化层尺寸
**注意:**不同于卷积层,池化层的输出通道数不改变
padding=’SAME‘ 填充0
输出图像尺寸的计算公式如下:
符号:($\lceil\quad \rceil$
) 代表向上取整
O =\bigg\lceil\frac{I - P_S}{S}\bigg\rceil+1
**例:**原图=[1,28,28,1] ksize=[1,2,2,1], strides=[1,3,3,1] 结果:(1, 10, 10, 1),计算过程
O=\bigg\lceil\frac{28-2}{3} \bigg\rceil +1 = 10
(28-2)/3 = 8.6666667 向上取整为:9 加1 = 10
在TensorFlow的(填充0)池化结果
示例代码:
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
# 获取数据集
mnist = input_data.read_data_sets(r'E:\PycharmProjects\TensorflowTest\MNIST_data', one_hot=True)
# in_x = tf.Variable(tf.zeros([1,28,28,1]), dtype=tf.float32)
in_x = tf.placeholder(dtype=tf.float32, shape=[1,28,28,1])
pool1 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,1,1,1],padding='SAME')
pool2 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
pool3 = tf.nn.max_pool(in_x,ksize=[1,2,2,1],strides=[1,3,3,1],padding='SAME')
pool4 = tf.nn.max_pool(in_x,ksize<