本文将分解图像分类背后的目的,给出卷积神经网络的定义,讨论这两者如何作用,并简要说明如何在Python中创建一个卷积神经网络架构。
使用深度卷积神经网络进行图像分类
用深度卷积神经网络(DCNN)进行图像分类是一个口口相传的说法,但由于使用这种方法可以完成很多项目和任务,所以值得研究和理解。图像分类是一个强大的工具,可以将静态图像和推断出可能被错过的重要数据。
在这篇文章中,我们将分解图像分类背后的目的,给出CNN的定义,讨论这两者如何一起使用,并简要说明如何创建一个DCNN架构。
图像分类的目的是什么?
如前所述,图像分类的目的是为了能够从图像中产生更多的数据。这些数据可以简单到识别颜色模式,也可以复杂到根据其他图像的数据生成新的图像。这正是为什么图像分类,尤其是卷积神经网络,是如此强大的原因。
通过机器学习,有两种方式可以训练这些图像分类模型:监督式学习或无监督式学习。
根据你所创建的图像分类模型的类型,你可能会发现你想监督模型的学习,并控制哪些数据被送入其中。然而,你也可能想导入尽可能多的原始数据,让你的模型自己产生结论。这两种方法都是可以接受的,取决于你的目标。
图像分类是简单地从图像中生成数据,并能够组织这些数据用于其他用途的过程。当连接到一个DCNN时,一个图像分类模型的真正力量就可以被释放出来。
什么是卷积神经网络?
卷积神经网络是一种特定类型的神经网络架构,旨在从大量的数据中学习,特别是针对图像、音频、时间序列和信号数据。
不过,是什么让卷积神经网络与深度学习算法有什么不同?当涉及到分析和解释数据集时,关键词 "卷积 "是世界上所有差异的原因。卷积神经网络是由几十层,甚至几百层神经网络组成的,都是为了同一个目标而工作。
这意味着卷积神经网络可以有层层叠加,可以从每个图像中提取不同的数据。这允许每个卷积神经网络层快速 "研究 "一个图像输入,以获得特定的数据集,然后转到下一个图像。
从本质上讲,这使得深度学习模型在能够解析大量数据而不放慢速度方面具有令人难以置信的效率,因为每个层只看每张图像的一个紧密集中的数据。同样的过程也可以用于音频处理、信号数据和时间序列数据集。
CNN可以用于图像分类吗?
已经证实卷积神经网络(CNN或ConvNet)可以用于图像分类。然而,用深度卷积神经网络进行图像分类还没有得到确切的解决。
作为一个例子,专注于用卷积神经网络进行图像分类,可以让用户输入有车辆的图像实例,而不会让神经网络不堪重负。在一个标准的神经网络中,图像越大,处理我们希望从数据中推断出来的东西就需要更多的时间。使用卷积神经网络的图像分类使其更快,因为每一层只寻找一组特定的数据,然后将数据传递给下一层。
虽然标准的神经网络仍然能够处理图像数据集,但它需要更长的时间,而且可能无法及时创造出理想的结果。不过,使用深度卷积神经网络的图像分类将能够在更短的时间内处理更多的图像,从而能够快速识别图像中显示的车辆类型并对其进行适当的分类。
一旦模型得到适当的训练,用深度卷积神经网络进行图像分类的应用是无止境的,所以让我们来谈谈什么是图像分类的最佳学习过程。
哪种学习方式更适合于图像分类?
在这篇文章的前面,我们谈到了监督学习与无监督学习。这里我们将进一步讨论卷积神经网络模型的最佳学习方法。
到目前为止还没有明确说明的事情是,卷积神经网络是否应该在机器学习模型或深度学习模型上进行训练。简短的回答是,几乎可以肯定的是,用深度卷积神经网络进行图像分类会更有意义。
由于许多机器学习模型是围绕单输入测试建立的,这意味着这个过程要比使用基于深度学习神经网络的CNN图像分类选项慢得多,而且准确度也低得多。
如何创建你自己的卷积神经网络架构
现在,为了更好地理解用深度卷积神经网络进行图像分类,最后一步是深入了解其背后的架构。卷积神经网络架构并不像人们想象的那样复杂。
一个CNN基本上是由三层组成的:输入、卷积和输出。不同的卷积神经网络架构有不同的术语,但这些是理解这些模型如何创建的最基本方法。
输入层是这个过程的第一步,所有的图像首先被引入模型中
卷积层由神经网络的多个层组成,这些层将对图像的各种分类进行工作,一个接一个地建立起来。
输出层是神经网络的最后一步,图像在这里根据设定的参数进行实际分类。
用户究竟如何设置每一层,主要取决于所创建的内容,但在实践中,所有这些都相当简单易懂。卷积层会有很多相同的代码,只是针对每层内要提取的每块数据进行调整,一直到输出层。
虽然卷积神经网络的总架构可能看起来很吓人,因为有几十或几百个层组成卷积层,但该模型的结构实际上相当简单。
卷积神经网络代码示例
在这个Deep Learning With Python GitHub repo中,可以找到许多构建和训练卷积神经网络的实践代码示例(重点是图像分类的应用)。
一个简单的流程是这样的。
import tensorflow as tf
# Loading build-in MNIST dataset
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()
# Showing example images
fig, axes = plt.subplots(nrows=2, ncols=6,figsize=(15,5))
ax = axes.ravel()
for i in range(12):
ax[i].imshow(training_images[i].reshape(28,28))
plt.show()
示例图像可能看起来像下面这样。
# Reshaping the images for feeding into the neural network
training_images=training_images / 255.0
test_images=test_images / 255.0
#Keras model definition
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, activation=tf.nn.relu),
tf.keras.layers.Dense(10, activation=tf.nn.softmax)])
# Compiling the model, Optimizer chosen is ‘adam’
# Loss function chosen is ‘sparse_categorical_crossentropy`
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# Training/fitting the model for 10 epochs
model.fit(training_images, training_labels, epochs=10)
训练可能会产生逐个epoch的结果(损失,准确度,等等),如下所示。
计算训练好的模型在测试集预测上的准确性。
test_loss = model.evaluate(test_images, test_labels)
print("\nTest accuracy: ",test_loss[1])
输出
10000/10000 [==============================] - 1s 67us/sample - loss: 0.3636 - acc: 0.8763标签:DCNN,卷积,模型,分类,神经网络,图像,images From: https://blog.51cto.com/u_14279308/6037169