CNN基本结构
如下图所示,卷积神经网络CNN的基本结构主要有三个层,分别是卷积层、池化层和全连接层
第一层为卷积层,第二层为池化层(又称降采样层或下采样层),第三四层和一二层一样,最后把池化结果拉平成一条长向量,传入到底层的全连接层中,最后输出结果。
卷积层
增强信号,提取图像的底层特征(像是一个提纯的过程,可以有多个卷积核进行卷积,将输入层的特征映射到卷积层上);
特征图:卷积操作后的图像,卷积核(就像是一个固定大小的窗户,它每次会圈住输入层矩阵的一部分数据,它也是一个矩阵,每个位置的数值表示权重)在输入层上边滑动(大小不变,只是卷积核位置有变化,导致圈住的数据不同)边进行矩阵乘法运算得到。【通过矩阵乘法理解,每次将一行一列数据相乘,变成一个数据,按位置顺序排列得到相乘结果】
感受野:被卷积核光顾到的位置,即卷积核此时圈住的那一块矩阵区域
池化层
【计算图像一个区域上某一个特定特征的平均值或最大值】
减小数据维度,预防过拟合的产生;
1.均值池化:对池化区域内的像素点取均值,得到的特征数据对背景信息更敏感
2.最大池化:对池化区域内的像素点取最大值,的道德特征对纹理特征信息更加敏感
全连接层
汇总之前卷积层和池化层得到的底层图像的特征和信息
输出可以是多分类输出(softmax),也可以是二分类输出(sigmoid)
softmax相当于一个归一化,输出的是每个类别在原图中的概率,最大的就是图片所属的类
激活层——softmax
激励层:将卷积层输出结果做非线性映射
提供非线性建模能力
处理多分类问题,只有一个正确答案,互斥输出。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
# 构建CNN模型
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(image_height, image_width, num_channels)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(2, activation='softmax'))
# 编译模型
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val))
# 提取特征
feature_extractor = tf.keras.Model(inputs=model.inputs, outputs=model.layers[-2].output)
features = feature_extractor.predict(X_train)