Keras-4-深度学习用于计算机视觉-卷积神经网络对 MNIST 数字进行分类:

0. 说明:

本篇学习记录主要包括:《Python深度学习》的第5章(深度学习用于计算机视觉)的第1节(卷积神经网络简介)内容。

相关知识点:

  1. 密集层 (Dense层、全连接层) 和 卷积层的区别在于:

Dense层从输入特征空间中学到的是全局模式;而卷积层学到的是局部模式 (学到的是卷积核大小的窗口中发现的模式);

  1. 卷积的两个性质:

1). 平移不变性 (translation invariant):卷积网络在图像右下角学到的某个模式之后,可以在任何位置识别这个模式 (学到的模式不不再局限于某个位置,视觉本质上具有平移不变性)。
2). 模式的空间层次结构 (spatial hierarchies of patterns): 第一个卷积层学习较小的局部模式 (比如边缘),第二个卷积层将学习由第一层特征组成的更大的模式,以此类推,从而使得卷积网络可以有效地学习越来越复杂、越来越抽象的视觉概念 (视觉根本上具有空间层次)。

  1. 图像构成:

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. 卷积有两个关键参数:

1). 卷积核大小:从图中提取的图块的尺寸,通常是 3x3 或 5x5。
2). 输出特征深度:对应 channels,表示过滤器的数量。

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 构建卷积网络框架并训练模型:

  1. 包含3层卷集层 (Conv2D),2层汇聚层 (MaxPool2D);
  2. 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"))

查看定义的网络架构:

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值