最近,我们的客户要求我们写一份关于神经网络的研究报告,包括一些图形和统计输出。
[En]
Recently, we have been asked by our customers to write a research report on neural networks, including some graphics and statistical outputs.
什么是CNN
本文演示了如何训练一个简单的卷积神经网络 (CNN) 来对 图像进行分类。
Convolutional Neural Networks
(ConvNets 或 CNNs)是一类神经网络,已被证明在图像识别和分类等领域非常有效。与传统的多层感知器架构不同,它使用两个称为 convolution
和 pooling
的操作将图像简化为其基本特征,并使用这些特征来理解和分类图像。
CNN重要术语
卷积层
卷积是从输入图像中提取特征的第一层。卷积通过使用输入数据的小方块学习图像特征来保留像素之间的关系。这是一个数学运算,需要两个输入,例如 image matrix
和 filter
或 kernel
。然后图像矩阵的卷积乘以过滤器矩阵,称为 Feature Map
。
使用不同滤波器组的图像卷积可以通过应用滤波器组进行边缘检测、模糊和锐化。
[En]
Image convolution using different filters can perform edge detection, blurring and sharpening by applying filters.
激活函数
由于卷积是线性操作,图像远非线性,非线性层通常直接放在卷积层之后,以引入 nonlinearity
激活图。
有几种类型的非线性运算,最常见的是:
[En]
There are several types of nonlinear operations, and the popular ones are:
Sigmoid
: sigmoid 非线性具有数学形式 f(x) = 1 / 1 + exp(-x)。它取一个实数值并将其标准化到 0 到 1 之间的范围内。
Tanh
: Tanh 将实数值压缩到 [-1, 1] 范围内。
ReLU
: 线性单元 (ReLU) 计算函数 ƒ(κ)=max (0,κ)。
Leaky ReL
:Leaky ReLU 函数只不过是 ReLU 函数的改进版本。Leaky ReLU 就是为了解决这个问题而定义的。
Maxout
:Maxout 激活是 ReLU 和leaky ReLU 函数的泛化。
ELU
: Exponential Linear Unit
或简称ELU,也是Rectiufied Linear Unit (ReLU)的一种变体。与leaky relu和parametric ReLU函数不同,ELU不是直线,而是使用对数曲线来定义负值。
过滤器 | 核大小 | 过滤器数量
卷积使用a 从输入图像 kernel
中提取某些 特征内容。核是一个矩阵,它 slide
跨越图像并与输入相乘,从而以某种理想的方式增强输出。
在我们深入研究之前,核是一个权重矩阵,它与输入相乘以提取相关特征。核矩阵的维度是卷积的名称。例如,在 中 2D convolutions
,核矩阵是 2D matrix
。
正常的卷积层实际上由多个这样的滤光片组成。
[En]
A normal convolution layer actually consists of multiple such filters.
步长
输入矩阵上移动的像素数。当步长为1时,我们一次将滤镜移动到1个像素。当步长为2时,我们一次将滤镜移动到2个像素,依此类推。下图显示卷积将以1的步长工作。
[En]
The number of pixels moved on the input matrix. When the step size is 1, we move the filter to 1 pixel at a time. When the step size is 2, we move the filter to 2 pixels at a time, and so on. The following figure shows that convolution will work in steps of 1.
填充
padding
意味着在数据的边界处提供额外的像素。有时过滤器不能完全适合输入图像,那么我们将使用填充。
我们有两个选择:
- 用零(零填充)填充图片以使其适合
[En]
fill the picture with zero (zero fill) to make it fit*
- 删除不适合滤镜的图像部分。这称为有效填充,它只保留图像的有效部分。
[En]
remove parts of the image that are not suitable for the filter. This is called an effective fill, and it retains only the valid part of the image.*
池化层
A pooling layer
是在卷积层之后添加的新层。具体来说,在对卷积层输出的特征图应用非线性(例如 ReLU)之后;
当图像太大时,池化层部分会减少参数的数量。 Spatial pooling
也称为 subsampling
或 downsampling
减少每个地图的维数但保留重要信息。
空间池可以有不同的类型:
[En]
Space pools can have different types:
- 最大池化
- 平均池化
Max pooling
从校正后的特征图中取最大元素。计算特征图上每个补丁的平均值称为 average pooling
。特征图调用中每个补丁的所有元素的总和为 sum pooling
.
扁平化和密集层
Flattening
正在将数据转换为一维数组以将其输入到下一层。我们展平卷积层的输出以创建单个长特征向量。
Fully connected layer
:传统的多层感知器结构。它的输入是一个一维向量,表示前几层的输出。它的输出是附在图像上的不同可能标签的概率列表(例如狗、猫、鸟)。接收概率最高的标签是分类决策。
下载数据和模型构建
该 数据集包含 60,000 张彩色图像 10 classes
,每个类别有 6,000 张图像。数据集分为 50,000 张训练图像和 10,000 张测试图像。这些类是互斥的,它们之间没有重叠。
X_train = X_train/255
X_test = X_test/255
X_train.shape, X_test.shape
验证数据
为了验证数据集看起来是否正确,让我们绘制测试集中的第一个图像并显示它。
[En]
To verify that the dataset looks correct, let’s draw the first image in the test set and display it.
plt.imshow(X_test[0])
y_test
构建 CNN 模型
下面的 8 行代码使用一个通用模式定义了卷积基:一堆 Conv2D
、 MaxPooling2D
、 Dropout
和 Flatten
层 Dense
。
作为输入,a Conv2D
采用形状 (image_height, image_width, color_channels) 的张量。
Maxpool2D()
通过对沿特征轴的每个维度在 (2,2) Downsamples
定义的窗口上取最大值来对输入表示进行 分层 。
Dropout
() 用于在训练阶段的每次更新时将隐藏单元的出边随机设置为 0。
Flatten()
用于将数据转换为一维数组,用于输入到下一层。
Dense()
层是具有 128 个神经元的常规深度连接神经网络层。输出层也是一个密集层,有 10 个神经元用于 10 个类。
使用的激活函数是 softmax
。Softmax 将实数向量转换为分类概率向量。输出向量的元素在 (0, 1) 范围内并且总和为 1。
model.add(Flatten())
model.add(Dense(units = 128, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.summary()
编译和训练模型
这是 compiling
模型和 fitting
训练数据。我们将使用 10 epochs
来训练模型。一个时期是对所提供的整个数据的迭代。 是在每个 epoch 结束时 validation_data
评估和任何模型指标的 数据。 loss
模型不会根据这些数据进行训练。由于指标 = ['sparse_categorical_accuracy']
模型将基于 accuracy
.
history = model.fit(X_train
我们现在将绘制 model accuracy
and model loss
。在模型准确度中,我们将绘制训练准确度和验证准确度,在模型损失中,我们将绘制训练损失和验证损失。
绘制训练和验证的准确值
epoch_range = range(1, 11)
plt.plot(epoch_range, history.history['sparse_categorical_accuracy'])
绘制训练和验证的损失值
plt.plot(epoch_range, history.history['loss'])
y_pred = model.predict_classes(X_test)
confusion_matrix
mat
plot
结论:
在本教程中,我们训练了简单的卷积神经网络 (CNN) 来对 图像进行分类。从学习曲线图中我们观察到,在 3 个 epoch 之后,验证准确度低于训练集准确度,即我们的模型是过拟合,这意味着我们增加了模型的复杂性。还使用混淆矩阵评估模型。观察到该模型对鸟、猫、鹿、狗等标签的预测精度较低。
Original: https://blog.csdn.net/qq_19600291/article/details/124255471
Author: 拓端研究室
Title: 拓端tecdat|python用TensorFlow 2二维卷积神经网络CNN对图像物体识别混淆矩阵评估
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508763/
转载文章受原作者版权保护。转载请注明原作者出处!