《Python深度学习》第五章-1(CNN简介)读书笔记
Posted Paul-Huang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Python深度学习》第五章-1(CNN简介)读书笔记相关的知识,希望对你有一定的参考价值。
第五章 深度学习用于计算机视觉
5.1 卷积神经网络简介
5.1.1 卷积神经网络对 MNIST 分类
使用卷积神经网络对 MNIST 数字进行分类,在第 2 章用密集连接网络做过(当时的测试精度为 97.8%)。它是 Conv2D
层和 MaxPooling2D
层的堆叠。
-
实例化一个小型的卷积神经网络
from keras import layers from keras import models model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu'))
卷积神经网络接收形状为
(image_height, image_width, image_channels)
的输入张量(不包括批量维度)。第一层传入参数input_shape=(28, 28, 1)
来完成此设置。>>> model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 3, 3, 64) 36928 ================================================================= Total params: 55,744 Trainable params: 55,744 Non-trainable params: 0
每个
Conv2D
层和MaxPooling2D
层的输出都是一个形状为(height, width,channels)
的 3D 张量。通道数量由传入Conv2D
层的第一个参数所控制(32 或 64)。 -
在卷积神经网络上添加分类器
model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax'))
在进入两个 Dense 层之前,形状 (3, 3, 64) 的输出被展平为形状 (576,) 的向量。
>>> model.summary() _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 26, 26, 32) 320 _________________________________________________________________ max_pooling2d_1 (MaxPooling2D) (None, 13, 13, 32) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 11, 11, 64) 18496 _________________________________________________________________ max_pooling2d_2 (MaxPooling2D) (None, 5, 5, 64) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 3, 3, 64) 36928 _________________________________________________________________ flatten_1 (Flatten) (None, 576) 0 _________________________________________________________________ dense_1 (Dense) (None, 64) 36928 _________________________________________________________________ dense_2 (Dense) (None, 10) 650 ================================================================= Total params: 93,322 Trainable params: 93,322 Non-trainable params: 0
-
在 MNIST 图像上训练卷积神经网络
from keras.datasets import mnist from keras.utils import to_categorical (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) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=5, batch_size=64)
在测试数据上对模型进行评估。
>>> test_loss, test_acc = model.evaluate(test_images, test_labels) >>> test_acc 0.9912999868392944
-
整体代码
from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from tensorflow.keras import layers from tensorflow.keras import models (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) model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=5, batch_size=64) test_loss, test_acc = model.evaluate(test_images, test_labels)
结果是:
>>> test_acc 0.99080000000000001
5.1.2 卷积运算
-
D e n s e 层 \\color{red}Dense 层 Dense层从输入特征空间中学到的是 全 局 模 式 \\color{red}全局模式 全局模式,而 卷 积 层 \\color{red}卷积层 卷积层学到的是 局 部 模 式 \\color{red}局部模式 局部模式。
-
卷积神经网络具有以下两个性质:
- 卷积神经网络学到的模式具有
平
移
不
变
性
(
t
r
a
n
s
l
a
t
i
o
n
i
n
v
a
r
i
a
n
t
)
\\color{red}平移不变性(translation\\;invariant)
平移不变性(translationinvariant)。这使得卷积神经网
络在处理图像时可以高效利用数据(因为 视 觉 世 界 从 根 本 上 具 有 平 移 不 变 性 \\color{red}视觉世界从根本上具有平移不变性 视觉世界从根本上具有平移不变性),它只需要更少的训练样本就可以学到具有泛化能力的数据表示。 - 卷积神经网络可以学到
模
式
的
空
间
层
次
结
构
(
s
p
a
t
i
a
l
h
i
e
r
a
r
c
h
i
e
s
o
f
p
a
t
t
e
r
n
s
)
\\color{red}模式的空间层次结构(spatial\\;hierarchies\\;of\\;patterns)
模式的空间层次结构(spatialhierarchiesofpatterns)。卷积神经网络可以有效地学习越来越复杂、越来越抽象的视觉概念(因为
视
觉
世
界
从
根
本
上
具
有
空
间
层
次
结
构
\\color{red}视觉世界从根本上具有空间层次结构
视觉世界从根本上具有空间层次结构)。
- 卷积神经网络学到的模式具有
平
移
不
变
性
(
t
r
a
n
s
l
a
t
i
o
n
i
n
v
a
r
i
a
n
t
)
\\color{red}平移不变性(translation\\;invariant)
平移不变性(translationinvariant)。这使得卷积神经网
-
特 征 图 ( f e a t u r e m a p ) \\color{red}特征图(feature\\;map) 特征图(featuremap)
- 定义: 深度轴的每个维度都是一个
特
征
\\color{red}特征
特征(或
过
滤
器
\\color{red}过滤器
过滤器),而 2D 张量
output[:, :, n]
是这个过滤器在输入上的响应的二维空间 图 ( m a p ) \\color{red}图(map) 图(map)。 - 应用:
- 输入卷积中的: 包含两个空间轴(高度和宽度)和一个深度轴(也叫通道轴)的 3D 张量,其卷积也叫 特 征 图 ( f e a t u r e m a p ) \\color{red}特征图(feature\\;map) 特征图(featuremap)。
- 从卷积中输出的: 卷积运算从输入特征图中提取图块,并对所有这些图块应用相同的变换,生成 输 出 特 征 图 ( o u t p u t f e a t u r e m a p ) \\color{red}输出特征图(output\\;feature\\;map) 输出特征图(outputfeaturemap)。该输出特征图仍是一个 3D 张量,具有宽度和高度,其深度是输出深度是层的参数,每层代表代表 过 滤 器 ( f i l t e r ) \\color{red}过滤器(filter) 过滤器(filter)。
- 定义: 深度轴的每个维度都是一个
特
征
\\color{red}特征
特征(或
过
滤
器
\\color{red}过滤器
过滤器),而 2D 张量
-
卷积关键参数:
- 从 输 入 中 提 取 的 图 块 尺 寸 \\color{red}从输入中提取的图块尺寸 从输入中提取的图块尺寸:这些图块的大小通常是 3 × 3 3×3 3×3 或 5 × 5 5×5 5《Python深度学习》第五章-2(Cats_vs_Dogs)读书笔记