0. 说明:
本篇学习记录主要包括:《Python深度学习》的第5章(深度学习用于计算机视觉)的第1节(卷积神经网络简介)内容。
相关知识点:
- 密集层 (Dense层、全连接层) 和 卷积层的区别在于:
Dense层从输入特征空间中学到的是全局模式;而卷积层学到的是局部模式 (学到的是卷积核大小的窗口中发现的模式);
- 卷积的两个性质:
1). 平移不变性 (translation invariant):卷积网络在图像右下角学到的某个模式之后,可以在任何位置识别这个模式 (学到的模式不不再局限于某个位置,视觉本质上具有平移不变性)。
2). 模式的空间层次结构 (spatial hierarchies of patterns): 第一个卷积层学习较小的局部模式 (比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推,从而使得卷积网络可以有效地学习越来越复杂、越来越抽象的视觉概念 (视觉根本上具有空间层次)。
- 图像构成:
1). 图像是一个3D张量,包含两个空间轴 (宽度和高度) 和 一个深度轴 (也称 通道轴)。
2). 对于RBP图像而言,其通道轴维度大小为3,因为有3个颜色通道;对于灰度图而言,则只有一个颜色通道,深度为1;
3). 卷积运算从输入特征图中提取图块,并对所有的图块做相同的变换,生成输出特征图。输出特征图仍然是3D张量,其深度和该层隐藏单元的个数相同。此时的深度轴不再是RBG那样代表颜色,而是代表过滤器。比如:MNIST中,第一个卷积层输入大小为 (28, 28, 1),输出为 (26, 26, 32),即其输入在32个过滤器上做计算,对应32个输出通道,每个通道包含26 x 26
的网格,所以最终输出为 (26, 26, 32)。
- 卷积有两个关键参数:
1). 卷积核大小:从图中提取的图块的尺寸,通常是 3x3 或 5x5。
2). 输出特征深度:对应 channels,表示过滤器的数量。文章来源:https://www.toymoban.com/news/detail-502349.html
1 . 卷积神经网络对 MNIST 数字进行分类:
1.1 加载 MNIST 数据集并做预处理:
from keras.datasets import mnist
from keras.utils import to_categorical ## 将标签实现向量化 (one-hot)
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32')/255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32')/255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
1.2 构建卷积网络框架并训练模型:
- 包含3层卷集层 (Conv2D),2层汇聚层 (MaxPool2D);
- MNIST 图像格式为 28 x 28 x 1 (height, width, channels) (灰度图,只有一个channel);
from keras import models
from keras import layers
## 构建基本的 CNN 框架,包括 2层CNN 和 2层Pooling
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation="relu", input_shape=(28, 28, 1)))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation="relu"))
model.add(layers.MaxPool2D((2,2)))
model.add(layers.Conv2D(64, (3,3), activation="relu"))
## 在卷集网络上添加分类器 (MNIST有10种数字,所以对应10个类别的输出,用softmax获取每个类别比例,加和为1)
model.add(layers.Flatten())
model.add(layers.Dense(64, activation="relu"))
model.add(layers.Dense(10, activation="softmax"))
查看定义的网络架构:文章来源地址https://www.toymoban.com/news/detail-502349.html
model.summary()
# 整体的结构:cnn1 --> max_pooling --> cnn2 --> max_pooling --> cnn3 --> flatten --> fc1 --> fc2 --> output
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_6 (Conv2D) (None, 26, 26, 32) 320
max_pooling2d_4 (MaxPooling (None, 13, 13, 32) 0
2D)
conv2d_7 (Conv2D) (None, 11, 11, 64) 18496
max_pooling2d_5 (MaxPooling (None, 5, 5, 64) 0
2D)
conv2d_8 (Conv2D) (None, 3, 3, 64) 36928
flatten_1 (Flatten) (None, 576) 0
dense_2 (Dense) (None, 64) 36928
dense_3 (Dense) (None, 10) 650
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________
## 编译模型
model.compile(optimizer="rmsprop",
loss="categorical_crossentropy",
metrics="accuracy")
## 训练模型
model.fit(train_images,train_labels, epochs=5, batch_size=64)
Epoch 1/5
2023-06-12 21:05:09.603085: W tensorflow/tsl/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
938/938 [==============================] - 19s 18ms/step - loss: 0.1733 - accuracy: 0.9456
Epoch 2/5
938/938 [==============================] - 17s 18ms/step - loss: 0.0480 - accuracy: 0.9855
Epoch 3/5
938/938 [==============================] - 17s 18ms/step - loss: 0.0326 - accuracy: 0.9903
Epoch 4/5
938/938 [==============================] - 16s 18ms/step - loss: 0.0251 - accuracy: 0.9923
Epoch 5/5
938/938 [==============================] - 16s 17ms/step - loss: 0.0207 - accuracy: 0.9936
<keras.callbacks.History at 0x1786e8ca0>
1.3 在测试集上评估模型:
test_loss, test_acc = model.evaluate(test_images, test_labels)
print(test_acc)
313/313 [==============================] - 3s 10ms/step - loss: 0.0364 - accuracy: 0.9897
0.9897000193595886
到了这里,关于Keras-4-深度学习用于计算机视觉-卷积神经网络对 MNIST 数字进行分类:的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!