卷积神经网络(CNN)在 Tensorflow 中的工作
在本文中,我们将看到卷积神经网络与 TensorFlow 的工作原理,TensorFlow 是一个强大的机器学习库来创建神经网络。
现在要知道,卷积神经网络如何将其分解为多个部分。这个卷积神经网络的 3 个最重要的部分是,
- 卷积
- 汇集
- 展平
与其他人工神经网络相比,这 3 个动作是使卷积神经网络性能更好的非常特殊的东西。现在,让我们详细讨论它们,
卷积
考虑一个 28*28 的图像,例如 MINST 数据集,它基本上是一个手写数字识别。为了使用简单的人工神经网络构建一个模型来识别数字,我们将每个像素值单独作为模型内部的特征输入提供,即 784 个输入节点,您将有几个隐藏层,模型可能表现良好,但这里的问题是模型将无法识别图像中的重要特征。它会盲目地读取像素并吐出输出。
但是像这个 MINST 数据集(28 x 28 图像)这样尺寸非常小的图像,它将为模型提供 784 个输入,每个节点都应该划分为隐藏层,并且会分配很多权重,显然会有很大的权重的计算。现在考虑一个 1920 x 1080 的超高清图像,如果我们按照相同的方法,实际上会有 200 万个输入节点,即使我们采用 64 个节点的隐藏层,对于这么大的输入我们将有 1.3 亿个权重,并且会有大量的计算,您的机器甚至无法想到一次管理那么多计算。
所以为此,我们首先需要找到一张图片的重要特征,
通过找到这些重要特征,我们可以在不影响输出质量的情况下留下一些不需要的像素。通过这种方法,我们可以让模型在现实世界中具有人类水平的图像识别能力。所以为此,我们有卷积。
卷积是互联网上最困惑和最难的话题,但它只是通过在图像上滑动过滤器(内核)来搜索图像,以找到图像的不同特征。内核只是其中具有不同权重的 2D 矩阵。基本上,这个内核将通过图像,用图像相应部分的权重总和的平均值替换像素值。这些内核是查找图像中最重要特征的绝佳方式。
我们将对图像应用许多随机生成的内核,以找到图像的许多不同特征
因此,在将这个卷积层应用到我们的模型之后,我们需要对特征进行池化。
汇集
现在您已经找到了图像的重要特征,但输入量仍然非常大,我们的机器无法处理这么多的输入量。所以这就是汇集的地方。
池化只是减小图像的大小,而不会丢失我们通过卷积发现的特征。例如,MaxPooling 方法将采用矩阵的形状并返回该范围内较大的值。通过这样做,我们可以在不丢失该图像的重要特征的情况下压缩图像。
展平
展平只不过是将 3D 或 2D 矩阵转换为模型的 1D 输入,这将是我们处理图像并将输入连接到完全连接的密集层以进行进一步分类的最后一步。
综上所述,卷积神经网络的工作方式是:
- 应用卷积来查找图像中不同的重要特征
syntax: model.add(layers.Conv2D(no. of kernels, size of the kernel, activation=’relu’, input_shape)
- 应用池化压缩图像而不丢失其特征
syntax: model.add(layers.MaxPooling2D((size of the kernel)))
- 将其展平为来自 3D[彩色图像] 或 2D [黑白图像] 的一维输入以传递到模型中
syntax: model.add(layers.Flatten()
- 完全连接的输入层和隐藏层,用于使用权重和偏差以及激活函数和优化器。
- 哇!你已经建立了最好的图像分类器。
典型的 CNN 模型如下所示:
Python
# Importing the library
import tensorflow as tf
from tensorflow import keras
# Designing the model
model = tf.keras.models.Sequential([
# Convolutional layer1
tf.keras.layers.Conv2D(
32, (3, 3), activation='relu', input_shape=(32, 32, 3))
tf.keras.layers.MaxPooling2D((2, 2)) # Pooling
# COnvolutional layer2
tf.keras.layers.Conv2D(64, (3, 3), activation='relu')
tf.keras.layers.MaxPooling2D((2, 2)) # Pooling
# COnvolutional layer3
tf.keras.layers.Conv2D(64, (3, 3), activation='relu')
tf.keras.layers.MaxPooling2D((2, 2)) # Pooling
# Flattening the input
tf.keras.layers.Flatten(),
# Fully connected layers
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(256, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# Compiling the model
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(
from_logits=True),
metrics=['accuracy'])
# FItting the data to a model
history = model.fit(train_images, train_labels, epochs=10,
validation_data=(test_images, test_labels))
输出: