一、前言
以前は、単に TensorFlow の完全接続ネットワークを使用して温度を予測し、次に完全接続ネットワークの数学的計算を詳しく調べてから、CNN (畳み込み) ネットワークを使用して手書きの数字認識を行いました。この記事でもこのリズムを継続します。畳み込みネットワークを調べたり、数学的計算を行ったりします。
2.畳み込みネットワークのレビュー
以前畳み込みネットワークを使用したとき、特にいくつかのパラメータの意味をあまり明確に説明しませんでした。ここで下調べをしましょう。
上の図から、私たちが構築したネットワーク内には、畳み込み層 (Conv2D)、プーリング層 (MaxPooling2D)、一次元変換層 (Flatten)、および全結合層 (Dense) の 4 つの異なる層があります。一つ。
1、卷积层
上の図は畳み込み層の動作原理を非常によく示しており、インターネット上には非常に直感的なアニメーション画像がいくつかあります。畳み込み計算は、入力から畳み込みカーネルと同じサイズの行列を見つけ、対応するビットを乗算し、それらを加算して結果の 1 ビットを取得します。
1)Conv2D
ここで言う2Dとは2次元データ、つまり入力データを2次元データとして処理する畳み込み層のことですが、当然1次元と3次元の入力を処理する畳み込み層であるConv1DやConv3Dもあります。それぞれのデータ。
2)フィルタ
意味はコンボリューションカーネルの数で、上の図のカーネルの数です。コンボリューション カーネルの数が増えるほど、この層の出力も大きくなります。
3)カーネルサイズ
意味はコンボリューションカーネルのサイズで、上の図ではコンボリューションカーネルのサイズは3x3ですが、この例では5x5のサイズを使用しています。畳み込みカーネルの数とサイズは合わせてパラメータ W と b のサイズを構成します。これは完全に接続されたネットワークに類似した概念です。
4)パディング
パディングには、VALID 破棄と SAME 補完という 2 つのパラメータ値があります。
主に SAME パラメータ値を使用します。つまり、畳み込み計算結果のサイズが元の入力よりも小さい場合、入力と出力のサイズを一致させるために入力の端に 0 が追加されます。以下に例を示します。
元の出力は 2x2 であることがわかりますが、出力サイズを 3x3 に修正するには、入力の端に 0 を追加します。
5)步长
ここでの暗黙のパラメーターは「ステップ サイズ = 1」 (ストライド) です。前述したように、畳み込み計算の原理は、以下に示すように、入力から畳み込みカーネルと同じサイズの行列を見つけることです。
最初の行列:
2 番目の行列:
ここではステップ サイズ 1 を使用します。ステップ サイズを 2 に変更すると、次のようになります。
6)パディング:有効
ステップ サイズがわかったら、パディングの VALID と、パディングを破棄する必要がある理由を見てみましょう。
カーネル サイズが 3x3、ステップ サイズが 2 であると仮定すると、次のようになります。
入力のサイズが小さいため、6列目は計算できないことがわかります。padding=SAMEの場合は最後に0を追加してサイズを拡張しますが、VALIDの場合、6列目は破棄されます。 、および対応する計算結果のサイズも小さくなります。
7)入力形状
入力のサイズを制限します。
2、池化层
上図を見るとプーリングとは何かがよく分かりますが、プーリングには最大プーリングと平均プーリングの2種類があります。ここで使用するのは、最大値を見つけることです。
Pool_size はプールのサイズで、上の図も 2x2 のプールです。
3、一维化
いわゆる 1 次元化とは、次のように行列を 1 次元に変換することです。
三、精简示例
前の例では入力が 28x28 と少し大きかったのですが、計算過程を確認したいだけなので入力サイズを小さくし、コンボリューション カーネルの数とサイズも小さくしています。
各レイヤーのパラメータは以下のコードで出力できます。
1)すべてのレイヤーにパラメータがあるわけではありません
レイヤー 1、3、6、7 のパラメーターのみを出力していることがわかります。その理由は、プーリング層と 1 次元変換がパラメーターなしの単なる演算であるためです。
2)パラメータ出力の転置
出力を見ると、パラメーター行列に T が付いていることに注意してください。つまり、行列は転置されて出力されます。理由は行列の表現で、転置しないと理解できないので、計算する際に入力も転置して計算結果が同じになるようにしています。
3) 各層の計算結果
以下のコードで各層の計算結果を出力することで、各層の手計算が正しいかどうかを確認することができます。以下に初層の計算結果のみを説明する。
4.計算プロセス
1. 入力調整
上に示したように、まず入力を転置し、次に行列の端を 0 で埋めます。
2. コンボリューションカーネルと入力の「分割」
前述したように、畳み込み計算では、実際には、対応する計算を実行するために入力から畳み込みカーネルと同じサイズの行列を見つけます。そのため、次のようなルールに従って入力を「分割」できます。
最初の小さな行列:
2 番目の小さな行列:
3 番目の小さな行列:
4 番目の小さな行列:
5 番目の小さな行列:
類推すると、16 個の小さな行列を取得できます。それぞれの小さな行列はコンボリューション カーネルで計算して 16 個の値を取得できるため、計算の結果は 4x4 行列になります。
小さな行列のオンライン分割は通常、左から右に、次に上から下に行われることに注意してください。ただし、入力が転置されているため、ここでは最初に上から下に、次に左から右に移動しますが、計算結果は同じです。
3. コンボリューションカーネル計算
上の図を見ると、コンボリューション カーネルには値のセットが 1 つしかないことに注意してください。つまり、入力から分割された 16 個の小さな行列が同じ W1+b1 で順番に計算されます。計算方法は、対応するフェーズです。各入力ビットと W1 を乗算し、積を加算し、b1 で合計します。
4. プーリング層
いわゆるプーリングとは、行列を圧縮することです。集中方法は、行列からその「より大きな」値を抽出することです。具体的なプロセスは、入力行列をプールのサイズ (pool_size) に応じて分割し、次のように分割することです。いくつかの小さな行列を計算し、各小さな行列の最大値を見つけて、最後にこれらの最大値を新しい行列に結合します。これがプーリング層の出力です。
1) プーリング層の分割
最初の小さな行列:
2 番目の小さな行列:
3 番目の小さな行列:
4 番目の小さな行列:
転置のため、ここでの分割プロセスも上から下、次に左から右に行われることに注意してください。第二に、ここでの分割は畳み込み層の分割とは異なります。畳み込み層のステップ数はスライドします。ここでのデフォルトは、pool_size に基づいてスライドするだけです。
2)池化计算
プーリングは非常に簡単で、最大値を見つけるだけです。最後に、結果が行列化されて、次の畳み込み層に必要な入力が取得されます。
5、第二层卷积
これまでの経験を踏まえると、第 2 層の畳み込み計算はより簡単になります。しかし、畳み込みの 2 番目の層に 2 つの畳み込みカーネルがある場合はどうなるでしょうか?実際には、W と b のセットがもう 1 つだけあるため、同じ入力行列を異なる畳み込みカーネル パラメーターを使用して 2 回計算できます。このようにして、2 セットの出力が得られます。
6、2 番目のプーリング
以前の計算結果は 2 つの行列に形成され、別々にプールされます。サイズが大きいため、プーリング後の値は 1 つだけですが、実際、入力が十分に大きい場合、プーリング後の結果は 2 つの行列になるはずです。
7、一维化
出力が小さいので1D化も簡単です。プーリングの結果が 2 つの大きな行列である場合、1 次元化プロセスはそれほど直感的ではありません。
次の例は、より大きな行列の 1 次元化を示しています。実際には、2 つの行列は単に左右に接続されているのではなく、互いに点在しています。
8、全結合層の計算
全結合層の計算は非常に簡単です。
1) 最初の完全に接続された層
2) 2 番目の全結合層の計算
五、回顾
手計算の結果は TensorFlow で計算した結果とそれほど変わらないことがわかりますが、それでもわずかな差があり、その理由は数値精度の問題であると考えられます。
最後に、入力が転置されていることに注意してください。