それ以来、畳み込みニューラルネットワーク(CNN)を理解しています

畳み込みニューラルネットワークは、名前が「高度」すぎるためにとにかく理解できなかったものであり、「畳み込みとは何か」を紹介するインターネット上のさまざまな記事は特に耐え難いものです。ウー・エンダのオンラインクラスを聞いた後、私は突然悟りを開いて、ついにこれが何であるか、そしてその理由を理解しました。ここではおそらく6〜7の記事を使用して、CNNを説明し、いくつかの興味深いアプリケーションを実装します。それを読んだ後、あなたは自分で好きなことをすることができるはずです。

1.はじめに:境界の検出

最も単純な例である「エッジ検出」を見てみましょう。サイズ8×8のような画像があるとします。画像写真内の数字は位置のピクセル値を表し、ピクセル値が大きいほど明るいことがわかります。色なので、説明のために、右側の小さなピクセルをより暗くします。グラフの中央にある2つの色の境界線は、検出する境界です。この境界を検出する方法は?このような フィルター(カーネルとも呼ばれる)を3×3のサイズで設計できます。写真次に、このフィルターを使用して、フィルターと同じ大きさの領域をカバーする画像を「カバー」し、対応する要素Multiply and次に合計します。面積を計算した後、他の面積に移動し、元の画像の隅々までカバーされるまで計算します。このプロセスは  「畳み込み」と呼ばれます。
(数学で畳み込み演算が何を指しているかは関係ありません。CNNでどのように計算されるかを知る必要があるだけです。)
ここでの「動き」にはステップサイズが含まれます。ステップサイズが1の場合、場所をカバーした後、 1グリッド移動すると、合計6×6の異なる領域をカバーできることが簡単にわかります。次に、これらの6×6領域の畳み込み結果を行列に入れ写真ます。何を見つけましたか?
この画像では、中央の色が明るく、両側の色が暗いため、元の画像の中央の境界線がここに反映されています。上記の例から、特定のフィルターを設計できることがわかりました。画像に追従させるために畳み込みを行うことで、境界など、画像内の特定の特徴を識別できます。
上記の例は、垂直方向の境界を検出するためのものです。水平方向の境界を検出するように設計することもできます。フィルターをちょうど90°回転させます。その他の機能については、理論的には、細かい設計を行う限り、いつでも適切なフィルターを設計できます。私たちのCNN(畳み込みニューラルネットワーク)は、主に、画像認識やその他の機能を実行するために、局所的な特徴から全体的な特徴まで、フィルターを介して特徴を1つずつ継続的に抽出することです。 問題は、どうすればこれほど多くの種類のフィルターを設計できるかということです。まず、大きなプッシュ画像に対してどの機能を特定する必要があるかは必ずしもわかりません。次に、どの機能があるかを知っていても、対応するフィルターを実際に設計するのは簡単ではない可能性があります。機能の数おそらく数千。実際、ニューラルネットワークを学習した後、これらのフィルターは私たちが設計する必要がまったくないことがわかりました。各フィルターの各数値は単なるパラメーターではありませんか? マシンにこれらを大規模に「学習」させることができます。データ量。パラメータこれがCNNの原則です。

第二に、CNNの基本的な概念

1.パディング

上記の紹介から、フィルターの畳み込み後、元の画像が(8,8)から(6,6)に小さくなることがわかります。もう一度転がすと、サイズは(4,4)になります。これの何が問題なのですか?
2つの主な問題があります:

  • 畳み込みが実行されるたびに、画像が縮小されるため、数回の畳み込みの後に画像が消えます。
  • 画像の中央にあるポイントと比較して、画像の端にあるポイントは、畳み込みで計算される頻度が低くなります。この場合、エッジの情報が失われやすくなります。



为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。写真比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。我们把上面这种“让卷积之后的大小不变”的padding方式,称为  “Same” 方式,
把不经过任何填白的,称为  “Valid” 方式。这个是我们在使用一些框架的时候,需要设置的超参数。

2.stride 步长

前面我们所介绍的卷积,都是默认步长是1,但实际上,我们可以设置步长为其他的值。
比如,对于(8,8)的输入,我们用(3,3)的filter,
如果stride=1,则输出为(6,6);
如果stride=2,则输出为(3,3);(这里例子举得不大好,除不断就向下取整)

3.pooling 池化

这个pooling,是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。
比如下面的MaxPooling,采用了一个2×2的窗口,并取stride=2:写真除了MaxPooling,还有AveragePooling,顾名思义就是取那个区域的平均值。

4.对多通道(channels)图片的卷 (重要!)

这个需要单独提一下。彩色图像,一般都是RGB三个通道(channel)的,因此输入数据的维度一般有三个: (长,宽,通道)
比如一个28×28的RGB图片,维度就是(28,28,3)。前面的引子中,输入图片是2维的(8,8),filter是(3,3),输出也是2维的(6,6)。如果输入图片是三维的呢(即增多了一个channels),比如是(8,8,3),这个时候,我们的filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。
这个时候的卷积,是三个channel的所有元素对应相乘后求和,也就是之前是9个乘积的和,现在是27个乘积的和。因此,输出的维度并不会变化。还是(6,6)。但是,一般情况下,我们会 使用多了filters同时卷积,比如,如果我们同时使用4个filter的话,那么 输出的维度则会变为(6,6,4) 。我特地画了下面这个图,来展示上面的过程:写真图中的输入图像是(8,8,3),filter有4个,大小均为(3,3,3),得到的输出为(6,6,4)。
我觉得这个图已经画的很清晰了,而且给出了3和4这个两个关键数字是怎么来的,所以我就不啰嗦了(这个图画了我起码40分钟)。其实,如果套用我们前面学过的神经网络的符号来看待CNN的话,

  • 我们的输入图片就是X,shape=(8,8,3);
  • 4个filters其实就是第一层神金网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
  • 我们的输出,就是Z1,shape=(6,6,4);
  • 后面其实还应该有一个激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);

所以,在前面的图中,我加一个激活函数,给对应的部分标上符号,就是这样的:写真【个人觉得,这么好的图不收藏,真的是可惜了】

三、CNN的结构组成

上面我们已经知道了卷积(convolution)、池化(pooling)以及填白(padding)是怎么进行的,接下来我们就来看看CNN的整体结构,它包含了3种层(layer):

1. Convolutional layer(卷积层—CONV)

由滤波器filters和激活函数构成。 一般要设置的超参数包括filters的数量、大小、步长,以及padding是“valid”还是“same”。当然,还包括选择什么激活函数。

2. Pooling layer (池化层—POOL)

这里里面没有参数需要我们学习,因为这里里面的参数都是我们设置好了,要么是Maxpooling,要么是Averagepooling。
需要指定的超参数,包括是Max还是average,窗口大小以及步长。
通常,我们使用的比较多的是Maxpooling,而且一般取大小为(2,2)步长为2的filter,这样,经过pooling之后,输入的长宽都会缩小2倍,channels不变。

3. Fully Connected layer(全连接层—FC)

这个前面没有讲,是因为这个就是我们最熟悉的家伙,就是我们之前学的神经网络中的那种最普通的层,就是一排神经元。因为这一层是每一个单元都和前一层的每一个单元相连接,所以称之为“全连接”。
这里要指定的超参数,无非就是神经元的数量,以及激活函数。接下来,我们随便看一个CNN的模样,来获取对CNN的一些感性认识:写真上面这个CNN是我随便拍脑门想的一个。它的结构可以用:
X→CONV(relu)→MAXPOOL→CONV(relu)→FC(relu)→FC(softmax)→Y
来表示。这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”, 也就是把  (height,width,channel) 的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了。

四、卷积神经网络 VS. 传统神经网络

其实现在回过头来看,CNN跟我们之前学习的神经网络,也没有很大的差别。
传统的神经网络,其实就是多个FC层叠加起来
CNN,无非就是把FC改成了CONV和POOL,就是把传统的由一个个神经元组成的layer,变成了由filters组成的layer。那么,为什么要这样变?有什么好处?
具体说来有两点:

1.参数共享机制(parameters sharing)

我们对比一下传统神经网络的层和由filters构成的CONV层:
假设我们的图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层:写真那这一层我们需要多少个参数呢?需要 64×9 = 576个参数(先不考虑偏置项b)。因为每一个链接都需要一个权重w。那我们看看 同样有9个单元的filter是怎么样的:写真其实不用看就知道,有几个单元就几个参数,所以总共就9个参数!因为,对于不同的区域,我们都共享同一个filter,因此就共享这同一组参数。
这也是有道理的,通过前面的讲解我们知道,filter是用来检测特征的,那一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 我们共享同一个filter不仅是合理的,而且是应该这么做的。 由此可见,参数共享机制,让我们的网络的参数数量大大地减少。这样,我们可以用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地 避免过拟合
同样,由于filter的参数共享,即使图片进行了一定的平移操作,我们照样可以识别出特征,这叫做  “平移不变性” 。因此,模型就更加稳健了。

2.连接的稀疏性(sparsity of connections)\

畳み込みの操作から、出力画像のユニットは入力画像の一部にのみ関連写真ことがわかります。従来のニューラルネットワークでは、すべてが完全に接続されているため、出力ユニットはすべての入力効果の影響を受けます。単位。これにより、画像の認識効果が大幅に低下します。それに比べて、それぞれの地域には独自の特徴があり、他の地域の影響を受けたくないのです。

CNNが従来のNNを上回り、ニューラルネットワークの新時代を切り開くのは、まさに上記の2つの利点によるものです。

おすすめ

転載: juejin.im/post/7022812074858414087