Keras的深度学习–第5部分:卷积神经网络

0
6714
图片作者 艾哈迈德·盖德Pixabay

动机

在之前的文章中,我们解决了数字和分类数据的问题,并且了解了每种数据所需的不同转换。关于图像,我们研究了一个简单的技巧,该技巧将每个图像的大小调整为像素阵列,并将其输入到输入层。该方法效果很好,我们在MNIST数据集上的准确性达到了约97%。

但是,处理具有更复杂图案的大图像则完全不同。科学家们努力达到令人满意的表现,甚至无法对狗和猫的图像进行分类。此类图像包含许多以特定方式关联的功能。例如:以给定顺序的一组像素定义了一条边,一个圆,一个鼻子,一张嘴等。因此,我们需要一种特殊的层来检测这些关系。

卷积层的作用就在这里。它是一个神经网络层,用于扫描图像并从中提取一组特征。通常,我们将积累这些层以了解更复杂的功能。这样,第一层学习了非常基本的特征,例如水平边缘,垂直边缘,线条等。我们越深入,就变得越复杂。然后,图层将能够将低级功能组合为高级功能。例如:可以将边缘和曲线组合起来以检测不同的头部,鼻子,耳朵等的形状。

广告Coursera Plus标语,包含约翰·霍普金斯大学,谷歌和密歇根大学的课程,突出显示数据科学职业发展的内容

卷积层对整个机器和深度学习领域产生了很大的影响。在某些情况下,它使我们能够以人为水平执行非常复杂的任务,甚至超越人类。因此,请密切注意您的武器库中将拥有非常强大的武器。

图像内核

核(或过滤器)只是使用卷积运算符应用于图像的小矩阵。

流程如下:

  1. 一个小的形状矩阵(k1,k2)在输入上滑动,
  2. 在两个矩阵上应用成对乘法,
  3. 得出结果矩阵的总和,并将结果放入最终的矩阵输出中

参见图片以获得更好的说明:

卷积运算符

对图像应用滤镜会从中提取一些功能。下图显示了简单内核​​如何检测边缘。

图像内核的图像结果
图像内核

这里的问题是如何在内核中获取这些数字?好吧,为什么不’我们是否使神经网络学习最好的内核来对一组图像进行分类?这是卷积神经网络背后的核心概念。卷积层充当从数据中学习的自动特征提取器。

问题定义

在本文中,我们将训练卷积神经网络,以从 时尚MNIST数据集.

Fashion-MNIST是Zalando的数据集 ’的文章图片,包含60,000个示例的训练集和10,000个示例的测试集。每个例子是28×28个灰度图像,与来自10个类别的标签关联。

Image Source: //github.com/zalandoresearch/fashion-mnist

标签为:

输出标签

加载数据

同样,我们将使用Keras下载数据。

从 keras.datasets import fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

预处理数据

我们需要对数据进行三个简单的修改:

  1. 将y_train和y_test转换为一个热编码版本
  2. 将图像重塑为(宽度,高度,通道数)。由于我们正在处理灰度图像,因此通道数将是一个
  3. 除以255缩放图像
# to categorical
from keras.utils import to_categorical
y_train_final = to_categorical(y_train)
y_test_final = to_categorical(y_test)

# reshape
X_train_final = X_train.reshape(-1, 28, 28, 1) / 255.
X_test_final = X_test.reshape(-1, 28, 28, 1) / 255.

建立网络

构建卷积神经网络与构建普通神经网络没有什么不同。此处的一个区别是我们不需要重塑图像,因为卷积层可用于2D图像。

从 keras import models, layers

model = models.Sequential()
model.add(layers.Conv2D(8, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.compile('rmsprop', 'categorical_crossentropy', metrics=['acc'])

这里唯一的新东西是第一层和Flattern层。我们使用Conv2D,它是2D图像的2D卷积层。参数如下:

  1. 要学习的内核/过滤器数。在这里,我们使用了32个内核。想象一下,这些内核中的每个内核都将学习一个简单的功能,例如垂直边缘检测,水平边缘检测等。
  2. 内核的大小。在这里,我们使用3 x 3矩阵。
  3. 激活功能应用于最终输出
  4. 输入形状,其中28为图像宽度和高度,1为通道数(1是灰度图像,因此为1,对于RGB,我们使用3)

由于卷积的输出是多维矩阵,因此我们需要重塑输出的形状(就像之前使用常规神经网络所做的那样)。此处的扁平层也是如此,它将矩阵展开为一个数组,然后将其馈送到下一层。

展平层

注意:我们使用了10个紧密连接的神经元的softmax输出层,因为我们要学习10个标签。

训练网络

和以前一样,我们只需要调用fit方法:

history = model.fit(X_train_final, y_train_final, validation_split=0.2, epochs=3)
 Train on 48000 samples, validate on 12000 samples Epoch 1/3 48000/48000 [==============================] - 19s 395us/step - loss: 0.4352 - acc: 0.8480 - val_loss: 0.3410 - val_acc: 0.8805 Epoch 2/3 48000/48000 [==============================] - 16s 332us/step - loss: 0.3132 - acc: 0.8909 - val_loss: 0.3213 - val_acc: 0.8873 Epoch 3/3 48000/48000 [==============================] - 17s 362us/step - loss: 0.2845 - acc: 0.9016 - val_loss: 0.3122 - val_acc: 0.8931 

通过非常简单的卷积网络,我们可以达到90%的精度。当然可以通过添加更多高级层和某些正则化技术来改善网络,但是我们将在以后的文章中继续进行。

挑战

尝试在同一数据集上训练一个简单的神经网络(不使用卷积)。在下面的评论部分中报告您的结果。

最后的想法

在本文中,我们学习了卷积神经网络的基础知识。我们了解到,它们用于自动提取图像特征,以产生比标准完全连接网络更高的精度。


注意: 这是一个来宾帖子,本文中的观点属于来宾作者。如果您对发布的任何文章有任何疑问 请访问www.marktechpost.com,网址为: [电子邮件 protected]

广告

发表评论

请输入您的评论!
请在这里输入您的名字

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.