卷积神经网络识别图像
# CNN网络的组成
- 卷积层(提取图像特征)
- 池化层(降维、防止过拟合)
- 全连接层 (输出结果)
# 卷积层
tf.keras.layers.Conv2D(
filter,kernel_size,strides=(1,1),padding='valid',activation=None
)
1
2
3
2
3
- filter: 卷积过滤器的数量,对应输出特征图的通道数
- kernel_size: 过滤器filter的大小,一般为3x3
- strides: 步长
- padding: 'valid'在外圈以0填充
- activation: 激活函数
# 池化层
用于降低后续网络层的输入维度,缩减模型大小,提高计算速度,防止过拟合
最大池化:
- Max Pooling,取窗口内的最大值作为输出,这种方式较为常见
tf.keras.layers.MaxPool2D(
pool_size=(2,2), strides=None, padding='valid'
)
1
2
3
2
3
- pool_size: 池化窗口大小
- strides: 步长
- padding: 是否填充,默认为否
平均池化:
tf.keras.layers.AveragePooling2D(
pool_size=(2,2),strides=None,padding='valid'
)
1
2
3
2
3
# 全连接层
位于CNN网络末端,经过卷积层的特征提取和池化层的降维后,将特征图转化为一维向量送入全连接层中进行分类或者回归操作
全连接层使用Dense实现
# 实现小项目 - 识别手写字体
# LeNET-5 卷积神经网络
import tensorflow as tf
from tensorflow.keras.layers import Dense,Conv2D,MaxPool2D,Flatten
from tensorflow.keras.datasets import mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()
# 数据预处理
# 对应图片数量,图片高度,图片宽度,色彩通道
x_train = tf.reshape(x_train,(x_train.shape[0],x_train.shape[1],x_train.shape[2],1))
x_test = tf.reshape(x_test,(x_test.shape[0],x_test.shape[1],x_test.shape[2],1))
# 构建模型
net = tf.keras.models.Sequential([
# 卷积层:6个5*5的卷积核,激活函数是sigmoid
Conv2D(filters=6,kernel_size=5,activation='sigmoid',input_shape=(28,28,1)),
# 最大池化
MaxPool2D(pool_size=2,strides=2),
# 卷积层:16个5*5的卷积核,激活函数是sigmoid
Conv2D(filters=16,kernel_size=5,activation='sigmoid'),
# 最大池化
MaxPool2D(pool_size=2,strides=2),
# 维度转换 => 一维
Flatten(),
# 全连接层,激活函数sigmoid
Dense(120,activation='sigmoid'),
# 全连接层,激活函数sigmoid
Dense(84,activation='sigmoid'),
# 全连接层,激活函数sigmoid
Dense(10,activation='softmax')
])
# 模型编译
net.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 模型训练
net.fit(x_train,y_train,epochs=10,avalidation_data=(x_test,y_test))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37