65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的深度学习:Keras.NET 中的硬币识别,第一部分

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2020 年 11 月 6 日

CPOL

3分钟阅读

viewsIcon

13355

downloadIcon

427

在本文中,我们将研究用于硬币识别问题的卷积神经网络,并将在 Keras.NET 中实现一个。

什么是 CNN?正如我们在本系列的前一篇文章中提到的,CNN 是一种神经网络 (NN),常用于图像分类任务,例如对象和人脸识别,以及通常用于输入可以具有类似网格拓扑的问题。在 CNN 中,并非每个节点都连接到下一层的所有节点。 这种部分连接有助于防止在完全连接的 NN 中出现的过度拟合问题,并加速 NN 的收敛。

围绕 CNN 的核心概念是一种称为卷积的数学运算,它在数字信号处理领域非常常见。 卷积定义为两个函数的乘积,产生第三个函数,该函数表示前两个函数之间的重叠量。 在 CNN 领域,卷积是通过滑动一个称为内核的滤波器来穿过图像来实现的。

在对象识别中,卷积运算允许我们检测图像中的不同特征,例如垂直和水平边缘、纹理和曲线。 这就是为什么任何 CNN 中的第一层都是卷积层。

CNN 中常见的另一个层是池化层。 池化用于减小图像表示的大小,这转化为参数数量的减少,最终减少了计算量。 最常见的池化类型是最大池化,它使用类似于卷积运算中的滑动窗口来收集每个位置中匹配的单元组的最大值。 最后,它从收集到的最大值构建图像的新表示。

与卷积相关的另一个概念是填充。 填充保证卷积过程将在整个图像(包括边界像素)上均匀发生。 这种保证由一个零像素边界支持,该边界添加到缩小的图像(池化后)周围,以便滑动窗口可以相同次数地到达图像的所有像素。

最常见的 CNN 架构通常以卷积层开始,然后是激活层,然后是池化层,最后是传统的完全连接网络,例如多层 NN。 这种层一个接一个放置的模型称为顺序模型。 为什么最后要有一个完全连接的网络? 为了学习变换后的图像(在卷积和池化之后)中特征的非线性组合。

这是我们将在 CNN 中实现的架构

  • Conv2D 层 – 32 个滤波器,滤波器大小为 3
  • 使用 ReLU 函数的激活层
  • Conv2D 层 – 32 个滤波器,滤波器大小为 3
  • 使用 ReLU 函数的激活层
  • MaxPooling2D 层 – 应用 (2, 2) 池化窗口
  • DropOut 层,在 25% – 通过随机丢弃上一层中的一些值(将它们设置为 0)来防止过度拟合; 又名稀释技术
  • Conv2D 层 – 64 个滤波器,滤波器大小为 3
  • 使用 ReLU 函数的激活层
  • Conv2D 层 – 64 个滤波器,滤波器大小为 3,步幅为 3
  • 使用 ReLU 函数的激活层
  • MaxPooling2D 层 – 应用 (2, 2) 池化窗口
  • DropOut 层,在 25%
  • Flatten 层 – 转换数据以供下一层使用
  • Dense 层 – 表示具有 512 个节点的完全连接的传统 NN。
  • 使用 ReLU 函数的激活层
  • DropOut 层,在 50%
  • Dense 层,节点数与问题中的类数匹配 – 对于使用的硬币图像数据集,为 60
  • Softmax 层

所提出的架构遵循对象识别 CNN 架构的一种模式; 层参数已经过实验微调。

我们经历的参数微调过程的结果部分存储在我们在此处提供的 Settings 类中

public class Settings
{
        public const int ImgWidth = 64;
        public const int ImgHeight = 64;
        public const int MaxValue = 255;
        public const int MinValue = 0;
        public const int Channels = 3;
        public const int BatchSize = 12;
        public const int Epochs = 10;
        public const int FullyConnectedNodes = 512;
        public const string LossFunction = "categorical_crossentropy";
        public const string Accuracy = "accuracy";
        public const string ActivationFunction = "relu";
        public const string PaddingMode = "same";
        public static StringOrInstance Optimizer = new RMSprop(lr: Lr, decay: Decay);
        private const float Lr = 0.0001f;
        private const float Decay = 1e-6f;
}

我们现在有了一个 CNN 的架构,我们将在下一篇文章中介绍它。 在下一次发布中,我们将研究我们使用 Keras.NET 实现的用于硬币识别的 CNN。

© . All rights reserved.