目录

卷积神经网络识别图像

# CNN网络的组成

  • 卷积层(提取图像特征)
  • 池化层(降维、防止过拟合)
  • 全连接层 (输出结果)
# 卷积层
tf.keras.layers.Conv2D(
    filter,kernel_size,strides=(1,1),padding='valid',activation=None
)
1
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
  • pool_size: 池化窗口大小
  • strides: 步长
  • padding: 是否填充,默认为否

平均池化:

tf.keras.layers.AveragePooling2D(
    pool_size=(2,2),strides=None,padding='valid'
)
1
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
最近更新
01
基本知识
07-18
02
损失函数
07-18
03
激活函数
07-18
更多文章>