最近我们被客户要求撰写关于深度学习的研究报告,包括一些图形和统计输出。
本文演示了训练一个简单的卷积神经网络 (CNN) 来对 CIFAR 图像进行分类。由于本教程使用 Keras Sequential API,因此创建和训练我们的模型只需几行代码。
设置
library(keras)
下载并准备 CIFAR10 数据集
CIFAR10 数据集包含 10 个类别的 60,000 张彩色图像,每个类别有 6,000 张图像。数据集分为 50,000 张训练图像和 10,000 张测试图像。这些类是互斥的,它们之间没有重叠。
验证数据
为了验证数据集看起来是否正确,让我们绘制训练集中的前 25 张图像并在每张图像下方显示类别名称。
train %>%
map(as.rater, max = 255) %>%
创建卷积基
下面的6行代码使用一种常见的模式定义了卷积基础:Conv2D和MaxPooling2D层的堆叠。
作为输入,CNN接受形状的张量(image_height, image_width, color_channels),忽略了批次大小。如果你是第一次接触这些维度,color_channels指的是(R,G,B)。在这个例子中,你将配置我们的CNN来处理形状为(32,32,3)的输入,这是CIFAR图像的格式。你可以通过将参数input_shape传递给我们的第一层来做到这一点。
kers_moe_etl %>%
laer_c_2d(fles = 32, ene_sz = c(3,3), acan = "relu",
lye_apoi_2d(posize = c(2,2)) %>%
lae_cv_2d(filrs = 64, relze = c(3,3), ctitio = "reu")
到目前为止,让我们展示一下我们模型的架构。
summary(model)
在上面,你可以看到每个Conv2D和MaxPooling2D层的输出是一个三维形状的张量(高度、宽度、通道)。当你深入到网络中时,宽度和高度维度往往会缩小。每个Conv2D层的输出通道的数量由第一个参数控制(例如32或64)。通常情况下,随着宽度和高度的缩小,你可以承受(计算上)在每个Conv2D层中增加更多的输出通道。
在顶部添加密集层
为了完成我们的模型,您需要将卷积基(形状为 (3, 3, 64))的最后一个输出张量输入一个或多个 Dense 层以执行分类。密集层将向量作为输入(1D),而当前输出是 3D 张量。首先,您将 3D 输出展平(或展开)为 1D,然后在顶部添加一个或多个 Dense 层。CIFAR 有 10 个输出类,因此您使用具有 10 个输出和 softmax 激活的最终 Dense 层。
model %>%
leree(unis = 64, aciaion = "relu") %>%
ayedese(unis = 10, acivin = "sftax")
这是我们模型的完整架构。
注意 Keras 模型是可变对象,您不需要在上面的 chubnk 中重新分配模型。
summary(modl)
如您所见,我们的 (3, 3, 64) 输出在经过两个 Dense 层之前被展平为形状为 (576) 的向量。
编译和训练模型
moel %>% comle(
optier = "adam",
lss = "specatialosnopy",
mecs = "accray"
)
评估模型
plot(hsy)
ealte(oel, x,y, erbe = 0)
我们简单的 CNN 已经实现了超过 70% 的测试准确率。