![深度学习实战:基于TensorFlow 2和Keras(原书第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/670/40319670/b_40319670.jpg)
4.3 通过深度学习识别CIFAR-10图像
CIFAR-10数据集包含60 000张32×32像素的3通道彩色图像,并被划分为10个类别,每个类别包含6000张图像。训练集包含50 000张图像,测试集包含10 000张图像。图4-12展示了一些来自上述10个类别的随机实例。
![113-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/113-01.jpg?sign=1738939939-1gN3Eh9zp1q1JPk0mRaqWgzBSHsZ80e1-0-89e7767ffd9955637a00a9cb26f8bae4)
图4-12 CIFAR-10图像示例
我们的目标是识别之前未曾见过的图像,并将其指定为上述10个类别之一。让我们定义一个合适的深度网络。
首先导入一些有用的模块,定义一些常量,然后加载数据集:
![113-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/113-02.jpg?sign=1738939939-xO02AaI9r4pcu7eLUT2FXait6bYzG6Ko-0-004f7ce399e7c3fc0e989e493de816b0)
网络将学习32个卷积滤波器,每个滤波器的大小为3×3。输出维度与输入形状相同,因此将为32×32,并且用到的激活函数为ReLU函数,这也是引入非线性的一种简单方法。之后,我们进行了最大池化操作,池的大小为2×2,Dropout
为25%:
![114-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/114-01.jpg?sign=1738939939-uZowIYC5FqtcdxHuUIgxi0QkWdhDGSc1-0-3cf42ee57b86af111648f43d643fff50)
深度流程的下一个阶段是一个稠密网络,它具有512个单元和ReLU激活,接着是一个随机失活率为50%的随机失活层和一个带有10个类别输出的softmax层,每个类别表示一个分类:
![114-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/114-02.jpg?sign=1738939939-naWn5hPfsMuJcZoAwHfwZGUnxY9idFzE-0-7fe673be74d789658f9b77127de0ea02)
定义完神经网络后,开始训练模型。在本例中,我们拆分数据,并同时计算训练集、测试集和验证集。训练集用于构建模型,验证集用于选择性能最佳的方法,而测试集使用全新且未见过的数据来检验最优模型的性能:
![114-03](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/114-03.jpg?sign=1738939939-wH1z6TrfGcCgwSWXtocKUzVVHp07L5gH-0-42ed646bd0ae5ca2591b3d5fbe56a803)
运行代码。该网络经过20次迭代后,达到了66.8%的测试准确度。如图4-13与图4-14所示,我们还打印了准确度和损失变化图,并通过model.summary()
转储(dump)模型。
![115-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/115-01.jpg?sign=1738939939-OWBpIkmP0dlzgfbW5pRNlkV3wUlaLg4Y-0-c39c25e4c5cb94624e60f48fc2633a9a)
图4-13 准确度和损失的打印输出
![115-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/115-02.jpg?sign=1738939939-TpdtCAVYQcg53RIpf08S4gLk6Vd16SOF-0-b63ea08eefdd83e9c7853190da4694e3)
图4-14 定义的深度神经网络的准确度和损失
4.3.1 用更深的网络提高CIFAR-10的性能
一种提高性能的方法是定义具有多个卷积运算的更深的网络。如下例所示,我们有一系列模块:
第一模块:(CONV + CONV + MaxPool + DropOut)
第二模块:(CONV + CONV + MaxPool + DropOut)
第三模块:(CONV + CONV + MaxPool + DropOut)
这些模块之后都是标准的稠密输出层。所有使用的激活函数均为ReLU函数。我们在第1章中也讨论过一个新网络层BatchNormalization()
,它用于为多模块引入一种归一化形式:
![115-03](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/115-03.jpg?sign=1738939939-qS93BONFUNp9qPb2OXQQh3eQy5Zhj6EL-0-2a4280e8220026d30bc7091a4c806c43)
恭喜你!你已定义了更深的网络。运行代码,经过40次迭代后达到了82%的准确度!为了完整起见,让我们加上代码的其余部分。第一部分是加载和归一化数据:
![116-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/116-01.jpg?sign=1738939939-t8Jw0Ul3FWNtLuz7BQ8KHfhSYBOrGIrJ-0-b3ce3439ae18b6ce1e9ecce61c03d0b9)
因此,相较之前的简单深度网络,获得了15.14%的提升。为了完整起见,我们还打印了训练期间的准确度和损失。
4.3.2 用数据增强提高CIFAR-10的性能
提高性能的另一种方法是为训练提供更多的图像。具体地,可采用标准的CIFAR训练集,再通过多种变换来扩展该集合,比如旋转、尺寸变换、水平或垂直翻转、缩放、通道移位(channel shift)等。让我们看看应用于上节定义的同一网络上的代码:
![117-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/117-01.jpg?sign=1738939939-NtYWyOJ6IO3etzPPVBySXEXUeEv2Jw8V-0-2ece38c57e1200fbfafce750bef8c60f)
其中,rotation_range
是随机旋转图片的度数(0~180),width_shift
和height_shift
是垂直或水平随机转换图片的范围,zoom_range
用于随机缩放图片,hori-zontal_flip
用于在水平方向上随机翻转半图,fill_mode
是在旋转或移位后,填充新像素点的策略。
数据增强后,我们从标准CIFAR-10集生成了更多的训练图像,如图4-15所示。
![118-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/118-01.jpg?sign=1738939939-iWGtshpyHZ1K3swSMwQhf8FwizhCcLa6-0-a554b2978bcb461ff4d17963478001a9)
图4-15 图像增强示例
现在,我们可将这种想法直接应用于训练。使用之前定义的相同CNN,我们只需生成更多增强图像,然后进行训练。为了提高效率,图像生成器与模型并行运行。这样能做到在CPU上增强图像的同时,在GPU上并行训练模型。代码如下:
![118-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/118-02.jpg?sign=1738939939-MiwSDlXWrATs42CmRiukTWorv5VsN62q-0-cd5bd9146a332655d7abf03f5912d130)
现在,每次迭代都变得更加耗费资源,这是因为我们拥有了更多的训练数据。为此,我们仅运行50次迭代。如图4-16与图4-17所示,这样做后获得了85.91%的准确度。
![119-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-01.jpg?sign=1738939939-qDq55vaXCQ6p9U3QTkl6bOqKwrhSsEEz-0-f8f9290a44e225a78c67d7611b508839)
图4-16 50次迭代结果
![119-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-02.jpg?sign=1738939939-7jFRMXVXWTvH43asu0B3ZBIh7e51eojJ-0-9b20e71e4a27cfa55cac40ac569597ec)
图4-17 最终准确度显示为85.91%
图4-18总结了我们实验过程中得到的成果。
![119-03](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-03.jpg?sign=1738939939-CFWQ4qfHIR8P2YSTidEKhdMPcxptitfP-0-29df2f60165aa89d1527342fec8d68a0)
图4-18 使用不同网络的CIFAR-10的准确度
可在线获得CIFAR-10的最新技术成果列表(http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html
)。截至2019年4月,最佳成果的准确度为96.53%[3]。
4.3.3 基于CIFAR-10预测
假设我们想用上述训练好的CIFAR-10深度学习模型进行图像的批量评估。
由于保存了模型和权重,因此不需要每次都训练:
![119-04](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-04.jpg?sign=1738939939-mOnIWYpaeklWOIPAiw0BRRd6mGL8w4Jy-0-f103cfaba1cfea28a7566591f2fc1453)
现在让我们预测猫和狗。
![120-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/120-01.jpg?sign=1738939939-98qxNYzpBvlvbHJeJ8dEf1M9KEfKkY9C-0-68f38acef62dc9735bf30c0c9e373846)
得到输出类别3(猫)和5(狗),与期望相符。我们成功创建了一个用于CIFAR-10图像分类的CNN。接下来,我们将研究VGG-16——深度学习的突破性进展。