LeNet モデルとコード実装の詳細な説明

1. 畳み込みニューラルネットワークの構成

畳み込みニューラル ネットワーク図

入力層

ネットワーク全体の入力は通常、画像のピクセル マトリックスを表します。上図の一番左の三次元マトリックスは入力画像を表し、三次元マトリックスの縦横は画像のサイズを表し、三次元マトリックスの深さは画像のカラーチャンネル(チャンネル)を表します。画像。白黒画像の深さは 1、RGB カラー モードの画像の深さは 3 です。

畳み込み層

CNNの最も重要な部分。全結合層とは異なり、畳み込み層の各ノードの入力はニューラル ネットワークの前層の小さなブロックにすぎず、この小さなブロックの一般的に使用されるサイズは 3×3 または 5×5 です。一般に、畳み込み層で処理されるノード行列は深くなります。
畳み込み層の計算:
この畳み込み層では 2 つの主要な操作があります:
(1) ローカル アソシエーション: 各ニューロンをフィルター (フィルター) とみなします
(2) ウィンドウ (受容野) スライディング: ローカル データのフィルター 計算
させてください畳み込み層で遭遇するいくつかの名詞を紹介します:
Depth : 以下の図に示すとおり
ここに画像の説明を挿入
Stride : スライディング ウィンドウの各動きの長さ
Padding :
たとえば、5 があります * 5 の画像の場合、スライディング ウィンドウは2*2、ステップ サイズは 2 ですが、次の図に示すように、スライドできないピクセルがまだ 1 つあることがわかります。
ここに画像の説明を挿入
以下の図に示すように、元のマトリックスにレイヤーを埋めて 6 * 6 マトリックスにすることができ、その後、スライディング ウィンドウがすべてのピクセルを横断できるようになります。
ここに画像の説明を挿入
畳み込み演算:
ここに画像の説明を挿入
特徴マップの辺の長さの式は次のとおりです: N = ( W − F + 2 P ) / S + 1 N=(W-F+2P)/S+1N=( WF+2P ) / S _+1
このうち、W は入力画像、F はコンボリューション カーネル サイズ、P はパディング値、S はステップ サイズです。

活性化関数

-活性化関数層の役割は、畳み込み層が複雑な特徴を表現できるように支援することです。畳み込みニューラル ネットワークは、通常、線形整流ユニット (Rectified Linear Unit、ReLU) を使用します。他の ReLU に似たバリアントには、傾斜 ReLU (Leaky ReLU、LReLU)、パラメーター化 ReLU (Parametric ReLU、PReLU)、ランダム化 ReLU (Randomized ReLU、RReLU)、指数関数などがあります。リニアユニット(Exponential Linear Unit、ELU)など ReLU が登場する前は、活性化関数としてシグモイド関数とハイパボリック タンジェント関数 (双曲線正接) がよく使われていました。以下に示すように。
ここに画像の説明を挿入

プーリング層(プーリング)

プーリング層は 3 次元マトリックスの深さを変更しませんが、マトリックスのサイズを縮小できます。プーリング操作は、高解像度の画像を低解像度の画像に変換するものと考えることができます。プーリング層を通じて、最後に完全に接続された層のノードの数をさらに減らすことができ、ニューラル ネットワーク全体のパラメータを削減するという目的を達成できます。プーリング層自体には、トレーニングできるパラメーターはありません。
最大プーリングとは、関数出力の結果として畳み込み後の関数領域内の要素の最大値を取得し、入力画像に対する極大応答を抽出し、最も顕著な特徴を選択することを指します。平均プーリングとは、畳み込み後の関数領域内の要素のアルゴリズム平均値を関数の出力結果とし、入力画像に対する局所応答の平均値を抽出することを指します。以下に示すように。
ここに画像の説明を挿入

全結合層

畳み込み層とプーリング層を複数回繰り返した後、CNN の最後では、通常、1 ~ 2 つの全結合層を使用して最終的な分類結果が得られます。数回の畳み込み操作とプーリング操作の後、画像内の情報は、より高い情報量を含む特徴に抽象化されたと考えることができます。畳み込みとプーリングは自動画像抽出のプロセスと考えることができ、特徴抽出が完了した後も、分類タスクを完了するには全結合層を使用する必要があります。
多分類問題の場合、活性化関数の最後の層でソフトマックスを選択できるため、各カテゴリに属する​​サンプルの確率分布を取得できます。

2、LeNet-5 の詳細な説明とコード実装

LeNet は、 1998 年LeCuu らによって提案されました論文のアドレス: Gradient-Based Learning Applied to Document Recognition
論文の詳細な説明は、ブログを参照してください: CNN エントリ アルゴリズム LeNet-5 の詳細な解釈 (CNN エントリ アルゴリズム LeNet-5 の詳細な解釈)紙)

1. LeNetモデルの詳細説明

LeNet5 ネットワークは小さいですが、深層学習の基本モジュールである畳み込み層プーリング層全結合層が含まれています。
ここに画像の説明を挿入
LeNet-5 には合計 7 つのレイヤーがあり、入力は含まれておらず、各レイヤーにはトレーニング可能なパラメーターが含まれています。各レイヤーには複数のフィーチャ マップがあり、各フィーチャー マップは畳み込みフィルターを通じて入力のフィーチャーを抽出し、各フィーチャー マップには複数のニューロンがあります。
各レイヤーのパラメータの詳細な説明:

  1. INPUT 入力層
    入力画像のサイズは: 32 * 32
    注: 入力層はネットワーク階層の 1 つとは見なされません。
  2. C1 層 - 畳み込み層
    入力: 32 * 32
    畳み込みカーネル サイズ: 6 * 6
    畳み込みカーネル タイプ: 6
    出力フィーチャーマップ サイズ: 28 (32 - 5 + 1)
    ニューロンの数: 28 * 28 * 6
    トレーニング可能なパラメーター: (5 * 5) + 1) * 6
    接続数: (5 * 5 + 1) * 6 * 28 * 28
  3. S2 層 - プーリング層
    入力: 28 * 28
    サンプリング領域: 2 * 2
    サンプリング方法: 4 つの入力を追加し、トレーニング可能なパラメーターを乗算し、トレーニング可能なバイアスを追加します。結果はシグモイド
    サンプリングによるものです タイプ: 6
    出力フィーチャマップ サイズ: 14 * 14 (28 / 2)
    ニューロン数: 14 * 14 * 6
    接続数: (2 * 2 + 1) * 6 * 14 * 14
  4. C3 層 - 畳み込み層
    入力: 14 * 14
    畳み込みカーネル サイズ: 5 * 5
    畳み込みカーネル タイプ: 16
    出力フィーチャーマップ サイズ: 10 * 10 (14 - 5 + 1)
    トレーニング可能なパラメーター: 6 * (3 * 5 * 5 + 1) + 6 * (4 * 5 * 5 + 1)+3*(4 * 5 * 5 + 1) + 1 * (6 * 5 * 5 + 1) 接続数: 10 * 10 * ( 15 + 16
    )
  5. S4 層 - プーリング層
    入力: 10 * 10
    サンプリング領域: 2*2
    サンプリング方法: 4 つの入力を追加し、トレーニング可能なパラメーターを乗算し、トレーニング可能なバイアスを追加します。結果はシグモイド
    サンプリングによるものです タイプ: 16
    出力フィーチャマップ サイズ: 5 * 5 (10/2)
    ニューロンの数: 5 * 5 * 16
    接続数: 16 (2 * 2 + 1) 5 * 5
  6. C5 層 - 畳み込み層
    入力: 5 * 5
    畳み込みカーネル サイズ: 5 * 5
    畳み込みカーネル タイプ: 120
    出力フィーチャーマップ サイズ: 1 * 1 (5 - 5 + 1)
    トレーニング可能なパラメーター/接続: 120* (16 * 5*5+) 1)
  7. F6層 - 全結合層
    入力:120次元ベクトル
    計算方法:入力ベクトルと重みベクトルの内積を計算し、バイアスを加えてシグモイド関数で出力します。
    トレーニング可能なパラメータ: 84 * ( 120 + 1 )
  8. 出力層 - 全結合層
    出力層も全結合層で、合計 10 個のノードがあり、0 ~ 9 の数字を表し、ノード i の値が 0 の場合、ネットワーク認識の結果は番号 i になります。放射基底関数(RBF)ネットワーク接続方式を採用しています。x が前の層の入力、y が RBF の出力であると仮定すると、RBF 出力の計算方法は次のようになります。yi = ∑ j ( xj − wij ) 2 y_i = \sum_j(x_j-w_{ij})^2y私は=j( ×jw)2
    上の式wij w_{ij}w、iは0から9、jは0から7の値をとる*12-1。RBF出力の値が0に近いほどiに近い、つまりiのASCIIコードマップに近いことを示し、現在のネットワーク入力の認識結果が文字iであることを示します。この層には 84x10=840 のパラメーターと接続があります。

2. コードの実装

from keras.models import Sequential
from keras.layers import Input, Dense, Activation, Conv2D, MaxPooling2D, Flatten
from keras.datasets import mnist

# 加载和准备数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# astype修改数据类型
x_train = x_train.reshape(-1, 28, 28, 1)
x_train = x_train.astype('float32')
print(x_train.shape)
y_train = y_train.astype('float32')
x_test = x_test.reshape(-1, 28, 28, 1)
x_test = x_test.astype('float32')
y_test = y_test.astype('float32')
print(y_train)
# 归一化
x_train /= 255
x_test /= 255

from keras.utils import np_utils

y_train_new = np_utils.to_categorical(num_classes=10, y=y_train)
print(y_train_new)
y_test_new = np_utils.to_categorical(num_classes=10, y=y_test)


# 数据预处理
def LeNet_5():
    model = Sequential()
    model.add(Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation='tanh', input_shape=[28, 28, 1]))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='tanh'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Flatten())
    model.add(Dense(120, activation='tanh'))
    model.add(Dense(84, activation='tanh'))
    model.add(Dense(10, activation='softmax'))
    return model


# 训练模型
def train_model():
    model = LeNet_5()
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.fit(x_train, y_train_new, batch_size=64, epochs=20, validation_split=0.2, shuffle=True)
    return model


model = train_model()
# 返回测试集损失函数值和准确率
loss, accuracy = model.evaluate(x_test, y_test_new)
print(loss, accuracy)

3. 参考文献

https://www.cnblogs.com/longsongpong/p/11721034.html
https://blog.csdn.net/fly_wt/article/details/95599187

おすすめ

転載: blog.csdn.net/One2332x/article/details/121352108