文章目录
Github项目地址
在线demo地址
整个网络的流程:
input(64,64,3)–>conv_1_1(62,62,10)–>relu_1_1(62,62,10)–>conv_1_2(60,60,10)–>relu_1_2(60,60,10)–>max_pool_1(30,30,10)–>conv_2_1(28,28,10)–>relu_2_1(28,28,10)–>conv_2_2(26,26,10)–>relu_2_2(26,26,10)–>max_pool_2(13,13,10)(–>flatten(1690)–>softmax(10))–>output(10)
What is a Convolutional Neural Network?
A CNN is a neural network: an algorithm used to recognize patterns in data. Neural Networks in general are composed of a collection of neurons that are organized in layers, each with their own learnable weights and biases.
CNN是一种神经网络,是一种被用于识别数据模式(recognize patterns in data) 的一种算法
神经网络(Neural Networks)通常是由一系列的神经元(neurons)组成,这些神经元分层组织(organized in layers),每一个 神经元都有它们自己的学习权重(learnable weights)和偏差(biases)。
下面将CNN分为几个基础的构建块(building blocks)来描述:
-
A tensor can be thought of as an n-dimensional matrix.
tensor 是一个n维的矩阵(n-dimensional matrix)
在该项目提到的CNN网络中,除了输出层以外,tensors都是三维的。 -
A neuron can be thought of as a function that takes in multiple inputs and yields a single output.
neuron 可以被理解为一个函数,接受多个inputs,输出单个output -
A layer is simply a collection of neurons with the same operation, including the same hyperparameters.
layer 就是一系列神经元的集合,这些神经元具有相同的操作,包含相同的超参数。 -
Kernel weights and biases, while unique to each neuron, are tuned during the training phase, and allow the classifier to adapt to the problem and dataset provided.
Kernel weights and biases 对每个神经元来说都是特殊的,这两个参数在训练的过程中被调整(tuned),这也使得分类器根据提供的数据集适应问题。 -
A CNN conveys a differentiable score function, which is represented as class scores in the visualization on the output layer.
CNN传达了一个可微分的分数函数,该函数在输出层的可视化中表示为类分数(class scores)。
什么使CNN与众不同?
CNN利用一种特殊类型的层,恰当地称为卷积层(convolutional layer),使它们处于适当的位置以从图像和类似图像的数据中学习。关于图像数据,CNN可以用于许多不同的计算机视觉任务,例如图像处理,分类,分割和对象检测。
What does each layer of the network do?
Input Layer (输入层)
最左边的一层是输入层,其表示将图像输入到CNN网络中。
该项目中因为是利用RGB图像作为input,所以输入层一共有三个通道,分别对应R,G,B
Convolutional Layers(卷积层)
卷积层是CNN的基础,因为它们包含学习的内核(learned kernels)(权重(weights)),这些内核提取出可将不同图像彼此区分开的特征-这就是我们想要的分类! 与卷积层交互时,您会注意到先前各层与卷积层之间的链接。 每个链接代表一个唯一的内核,该内核用于卷积操作以生成当前卷积神经元的输出或**图(activation map)。
卷积神经元执行具有唯一内核(unique kernel)和上一层对应神经元输出的元素点积(dot product)。 这将产生与唯一内核(unique kernel)一样多的中间结果。 卷积神经元是所有中间结果的总和与学习偏差的总和。
例如,让我们看一下上面的Tiny VGG架构中的第一卷积层。 请注意,此层中有10个神经元,但上一层中只有3个神经元。 在Tiny VGG架构中,卷积层是完全连接的,这意味着每个神经元都与上一层中的每个其他神经元相连。 着眼于第一卷积层最顶部的卷积神经元的输出,当我们将鼠标悬停在**图上时,我们看到有3个唯一的内核。
这些内核(kernals)的大小是由网络体系结构的设计人员指定的超参数(hyper-parameter)。 为了产生卷积神经元(**图(activation map))的输出,我们必须与上一层的输出以及网络学习到的唯一内核一起执行元素逐点积。 在TinyVGG中,点积运算使用的跨度(stride)为1,这意味着内核将每个点积移出1个像素,但这是网络架构设计人员可以调整以使其更适合其数据集的超参数。 我们必须对所有3个内核执行此操作,这将产生3个中间结果 (3个通道)。
然后,执行元素和,包含所有3个中间结果以及网络已获悉的偏差。 此后,生成的二维张量将是在第一卷积层中最顶层神经元的上方界面上可见的**图。 必须应用相同的操作来生成每个神经元的**图。
通过一些简单的数学运算,我们可以推断出在第一个卷积层中应用了3 x 10 = 30个唯一的内核,每个内核的大小为3x3。 卷积层与上一层之间的连通性是构建网络体系结构时的设计决策,它将影响每个卷积层的内核数量。
理解超参数(Hyperparameters)
-
Padding
当内核扩展到**图之外时,通常需要填充。 填充可以在**图的边界处保存数据,从而获得更好的性能,并且可以帮助保留输入的空间大小(preserve the input’s spatial size),从而使体系结构设计人员可以构建性能更高,更流畅的网络。存在许多填充技术,但是最常用的方法是零填充(zero-padding),因为它的性能,简单性和计算效率高。 该技术涉及在输入的边缘周围对称地添加零。 许多高性能的CNN(例如AlexNet)都采用了这种方法。
-
Kernel size
通常也称为过滤器大小(filter size),是指输入上的滑动窗口(sliding window)的尺寸。选择此超参数会对图像分类任务产生重大影响。例如,较小的内核大小可以从输入中提取大量包含高度局部特征的信息。如您在上面的可视化图中所看到的,较小的内核尺寸也导致较小的层尺寸减小,这允许更深的体系结构。相反,较大的内核会提取较少的信息,这会导致更快地减小图层尺寸,通常会导致性能下降。大内核更适合提取更大的特征。归根结底,选择合适的内核大小将取决于您的任务和数据集,但是通常,较小的内核大小可为图像分类任务带来更好的性能,因为架构设计师可以将越来越多的层堆叠在一起了解越来越多的复杂功能!
-
Stride
指示内核一次应移动多少像素。 例如,如上面的卷积层示例中所述,Tiny VGG对其卷积层使用步幅1,这意味着在输入的3x3窗口上执行点积以产生输出值,然后将其移至 每进行一次后续操作,就增加一个像素。 跨度对CNN的影响类似于内核大小。 随着步幅的减小,由于会提取更多的数据,因此会了解更多的功能,这也会导致更大的输出层。 相反,随着步幅的增加,这将导致特征提取更加受限,输出层尺寸更小。 架构设计人员的职责之一是在实现CNN时确保内核对称地跨输入滑动。 使用上面的超参数可视化来改变各种输入/内核尺寸的步幅,以了解此约束!
Activation Functions
-
ReLU
神经网络在现代技术中极为盛行-因为它们是如此的精确! 当今性能最高的CNN包含大量荒谬的图层(an absurd amount of layers),可以学习越来越多的功能。 这些突破性的CNN能够实现如此巨大的准确性的部分原因是由于它们的非线性。 ReLU将急需的非线性应用到模型中。
非线性是产生非线性决策边界所必需的,因此输出不能写成输入的线性组合。* 如果不存在非线性**函数,那么深的CNN架构将演变为一个等效的卷积层,其性能几乎不一样*。 与其他非线性函数(例如Sigmoid)相反,ReLU**函数专门用作非线性**函数,因为从经验上已经观察到,使用ReLU的CNN的训练速度要快于它们的对应函数。
ReLU**函数是一对一的数学运算:
此**函数逐元素应用于输入张量中的每个值。 例如,如果将ReLU应用于值2.24,则结果将为2.24,因为2.24大于0。您可以通过单击上方网络中的ReLU神经元来观察如何应用此**功能。 在上面概述的网络体系结构中的每个卷积层之后执行整流线性**功能(The Rectified Linear Activation function)(ReLU)。 注意该层对整个网络中各种神经元的**图的影响! -
Softmax
softmax操作的主要目的是:确保CNN输出的总和为1。因此,softmax操作可用于将模型输出缩放为概率。单击最后一层将显示网络中的softmax操作。请注意,展平后的对数如何不在0到1之间缩放。为了直观显示每个logit的影响(标量值未缩放),使用浅橙色→深橙色色标对它们进行编码。通过softmax函数后,每个类现在对应一个适当的概率!
您可能会想,标准归一化和softmax之间的区别是什么-毕竟,两者都会在0和1之间重新调整logit。请记住,反向传播是训练神经网络的关键方面-我们希望正确的答案具有最大的“信号”。 ”通过使用softmax,我们可以有效地“逼近” argmax,同时获得微分。重新缩放不会使最大权重明显高于其他logit,而softmax会重。简而言之,softmax是一个“更软”的argmax-看到我们在那里做了什么?
Pooling Layers (池化层)
在不同的CNN架构中,池化层的类型很多,但是它们的目的都是要逐渐减小网络的空间范围,从而减少网络的参数和总体计算。 上面的Tiny VGG架构中使用的池类型为Max-Pooling。
最大池操作需要在体系结构设计期间选择内核大小和步幅长度。 选择后,该操作将以指定的步幅在输入上滑动内核,同时仅从输入中选择每个内核切片上的最大值以产生输出值。 通过单击上方网络中的合并神经元,可以查看此过程。
在上面的Tiny VGG体系结构中,池化层使用2x2内核,步幅为2。使用这些规范进行此操作将导致75%的**被丢弃。 通过丢弃这么多值,Tiny VGG的计算效率更高,并且避免了过拟合。
Flatten Layer(展平层)
该层将网络中的三维层转换为一维向量,以适合全连接层的输入以进行分类。 例如,将一个5x5x2张量转换为大小为50的向量。网络的先前卷积层从输入图像中提取了特征,但是现在该对这些特征进行分类了。 我们使用softmax函数对这些功能进行分类,这需要一维输入。 这就是为什么需要平坦层的原因。 可以通过单击任何输出类来查看此层。
得到的结果即logit的值,下一步即进行softmax输出概率。