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

这篇具有很好参考价值的文章主要介绍了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"))

查看定义的网络架构:文章来源地址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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包