![深度学习实战:基于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=1739279795-LP1TDUfYTfcCXzwTSeRWT68cWK3NIP8l-0-fc7394d26f3a18063d6ac5a45d8f5fd2)
图4-12 CIFAR-10图像示例
我们的目标是识别之前未曾见过的图像,并将其指定为上述10个类别之一。让我们定义一个合适的深度网络。
首先导入一些有用的模块,定义一些常量,然后加载数据集:
![113-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/113-02.jpg?sign=1739279795-cA0KKKeJWSJRrwK8R3fdZoQRKrvgpkVm-0-cac23a52a2c8624efea9d663c875e1ea)
网络将学习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=1739279795-iVJNqzkruMUdQyoVRVH8ub3rqHz1RC2V-0-3c079429db5554a1ebf8b7f88b67c2e3)
深度流程的下一个阶段是一个稠密网络,它具有512个单元和ReLU激活,接着是一个随机失活率为50%的随机失活层和一个带有10个类别输出的softmax层,每个类别表示一个分类:
![114-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/114-02.jpg?sign=1739279795-Y5vlS2wdlqw5viBCNobgsMgigvllzR3R-0-7413b64c6b0d52398d2fdfa3295cc20c)
定义完神经网络后,开始训练模型。在本例中,我们拆分数据,并同时计算训练集、测试集和验证集。训练集用于构建模型,验证集用于选择性能最佳的方法,而测试集使用全新且未见过的数据来检验最优模型的性能:
![114-03](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/114-03.jpg?sign=1739279795-wKUjQNpplyldqrgC8Zj7NPhC8494SwFh-0-be9821c7917c55a9da1d15fbdc683733)
运行代码。该网络经过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=1739279795-M59freFDoETE6vFDRQ0gEZoorrt21hFj-0-941c0bff7db0776109c8e042ac60dc86)
图4-13 准确度和损失的打印输出
![115-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/115-02.jpg?sign=1739279795-9bSzKhCepjtolicvh6tagYJAeYIWLE16-0-6419a9d5f725455d2385445333c56591)
图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=1739279795-4QoXsgLYiRnCKO8b4K1epYKDdpqHTpvX-0-b40e1062dfb8c98f77f1c7a4321a6f98)
恭喜你!你已定义了更深的网络。运行代码,经过40次迭代后达到了82%的准确度!为了完整起见,让我们加上代码的其余部分。第一部分是加载和归一化数据:
![116-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/116-01.jpg?sign=1739279795-7wVGpVn5tyiUFF3o4zBy2WlXQdn0wG2g-0-fcd7d423f3f99768effcc20962278eca)
因此,相较之前的简单深度网络,获得了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=1739279795-PNje3H4C8RnBFSlPuKCdXyTAw8tI3D3k-0-aead985d4ca85441ce881537b4797cf4)
其中,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=1739279795-Kui1hj1lkbfCYHzbAgsX6cd7RgbAtnBn-0-761b3f82e0435de86571553e418a1c01)
图4-15 图像增强示例
现在,我们可将这种想法直接应用于训练。使用之前定义的相同CNN,我们只需生成更多增强图像,然后进行训练。为了提高效率,图像生成器与模型并行运行。这样能做到在CPU上增强图像的同时,在GPU上并行训练模型。代码如下:
![118-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/118-02.jpg?sign=1739279795-CXVeC9yvfTKfD1N1R1CfYtSaQBs3ep1F-0-2340ca206a7d0fbf6c6708fdd06e1a13)
现在,每次迭代都变得更加耗费资源,这是因为我们拥有了更多的训练数据。为此,我们仅运行50次迭代。如图4-16与图4-17所示,这样做后获得了85.91%的准确度。
![119-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-01.jpg?sign=1739279795-GZhmLrXcBJbG6oI8Jlz3Jxdos9mWlTyQ-0-99f618ca042c56b9690f1544d4e529cc)
图4-16 50次迭代结果
![119-02](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-02.jpg?sign=1739279795-HMGET9ZVthU7JopHwgIIAZOGMG8j8f7H-0-3c05ce0a4dc510586e7fdc26296e4f03)
图4-17 最终准确度显示为85.91%
图4-18总结了我们实验过程中得到的成果。
![119-03](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/119-03.jpg?sign=1739279795-Lfyi8CauP3LyplEzdOpWGXmU0h7D0fyq-0-f9ca8fd704110f0514ee82c24b25033d)
图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=1739279795-y8xAPpbPXUMSDyVXjyDT6FnyAuw82SsE-0-ec52c21e37a65c79c019390a16bb49a2)
现在让我们预测猫和狗。
![120-01](https://epubservercos.yuewen.com/FACE01/20940534208098106/epubprivate/OEBPS/Images/120-01.jpg?sign=1739279795-BVax7hHjyuqhkONkzHaWt738uZC1NpKc-0-09b85c61eac0dc3fe70172a9bf9411bf)
得到输出类别3(猫)和5(狗),与期望相符。我们成功创建了一个用于CIFAR-10图像分类的CNN。接下来,我们将研究VGG-16——深度学习的突破性进展。