AlexNetモデルの詳細な分析

2012年にAlexによって提案されたAlexnetネットワーク構造モデルは、ニューラルネットワークのアプリケーションを爆発させ、2012年の画像認識コンペティションのチャンピオンシップを獲得し、CNNを画像分類のコアアルゴリズムモデルにしました。
ここに画像の説明を挿入
上の写真はAlexNetのネットワーク構造です

ネットワーク変更のハイライトは次のとおりです。
(1)GPUが初めてネットワークアクセラレーショントレーニングに使用されます。
(2)従来のSigmoid活性化関数やTanh活性化関数の代わりにReLU活性化関数を使用します。
(3)LRN部分応答正規化が使用されます。
(4)Droupoutランダム不活性化ニューロン操作は、過剰適合を減らすために、完全に接続された層の最初の2つの層で使用されます。

AlexNetの場合、5つの畳み込み層と3つの完全に接続された層があります。

畳み込み層C1
この層の処理フローは次のとおりです。畳み込み-> ReLU->プーリング->正規化。

畳み込み、入力は227×227、96個の11×11×3畳み込みカーネルを使用し、取得されたFeatureMapは55×55×96です。
ReLU、畳み込み層によって出力されたFeatureMapをReLU関数に入力します。
ステップサイズが2の3×3プーリングユニットを使用したプーリング(オーバーラッププーリング、ステップサイズはプーリングユニットの幅よりも小さい)、出力は27×27×96((55-3)/ 2) + 1 = 27)
ローカル応答の正規化、ローカル正規化にk = 2、n = 5、α= 10-4、β= 0.75を使用、出力は27×27×96のまま、出力は2つのグループに分割されます。各グループのサイズ27×27×48

畳み込み層C2
この層の処理フローは次のとおりです。畳み込み-> ReLU->プーリング->正規化

畳み込み、入力は27×27×48の2セットです。それぞれサイズ5×5×48の128個の畳み込みカーネルを持つ2つのグループを使用し、エッジパディング= 2とし、畳み込みのステップサイズは1です。出力FeatureMapは2グループで、各グループのサイズは27×です。 27回128。((27 + 2 ∗ 2−5)/ 1 + 1 = 27)
ReLU、畳み込み層から出力されたFeatureMapをReLU関数に入力します。
プーリング操作のサイズは3×3、ステップサイズはは2です。、プールされた画像のサイズは(27-3)/ 2 + 1 = 13であり、出力は
k = 2、n = 5、α= 10-4を使用した13×13×256のローカル応答正規化です。 、β= 0.75(ローカル正規化の場合)、出力は13×13×256のまま、出力は2つのグループに分割され、各グループのサイズは13×13×128です。

畳み込み層C3
この層の処理フローは次のとおりです。畳み込み-> ReLU

畳み込み、入力は13×13×256、サイズが3×3×256、エッジ充填パディング= 1、畳み込みのステップサイズが1の384個の畳み込みカーネルの2セットを使用します。出力FeatureMapは13です。 ×13回384ReLU
、畳み込み層から出力されたFeatureMapをReLU関数に入力します

畳み込み層C4
この層の処理フローは次のとおりです。畳み込み-> ReLU
この層はC3に似ています。

畳み込み、入力は13×13×384、2つのグループに分割され、各グループは13×13×192です。2つのグループが使用されます。各グループはサイズが3×3×192の192の畳み込みカーネルで、エッジパディングはdone = 1、畳み込みのステップサイズは1です。出力FeatureMapは13×13×384で、2つのグループに分割され、各グループは13×13×192
ReLUであり、畳み込み層によって出力されたFeatureMapはReLUに入力されます。関数

畳み込み層C5
この層の処理フローは次のとおりです。畳み込み-> ReLU->プーリング

畳み込み、入力は13×13×384で、2つのグループに分けられ、各グループは13×13×192です。2つのグループを使用します。各グループは3×3×192のサイズでエッジパディング= 1の128畳み込みカーネルであり、畳み込みのステップサイズは1です。出力FeatureMapは13×13×
256ReLUです。製品レイヤーによって出力されたFeatureMap
は、プールのためにReLU関数に入力されます。プール操作のサイズは3×3、ステップサイズは2、プールされた画像のサイズは(13-3)/です。 2 + 1 = 6、つまり、出力が6×6×256になった後のプーリング

完全に接続されたレイヤーFC6
このレイヤーのプロセスは次のとおりです:(畳み込み)完全に接続された-> ReLU-> Dropout

畳み込み->完全接続:入力は6×6×256、このレイヤーには4096の畳み込みカーネルがあり、各畳み込みカーネルのサイズは6×6×256です。畳み込みカーネルのサイズは、処理されるフィーチャマップ(入力)のサイズとまったく同じであるため、つまり、畳み込みカーネルの各係数には、フィーチャマップ(入力)サイズの1ピクセル値のみが乗算されます。したがって、このレイヤーは完全接続レイヤーと呼ばれます。たたみ込みカーネルとフィーチャマップのサイズが同じであるため、たたみ込み操作後の値は1つだけです。したがって、たたみ込み後のピクセルレイヤーのサイズは4096×1×1、つまり4096個のニューロンがあります。
ReLU、これらの4096の計算結果は、4096の値を生成します。ReLUアクティブ化関数による
ドロップアウトは、過剰適合を抑制し、一部のニューロンをランダムに切断するか、一部のニューロンをアクティブ化しません。

完全に接続されたレイヤーのFC7プロセスは次のとおりです。完全に接続された-> ReLU-
>ドロップアウト

完全に接続され、入力は4096ベクターである
ReLU、4096の演算結果が4096個の値を生成するReLU活性化機能により生成された
阻害は、過剰適合ドロップアウトは、ランダムにいくつかのニューロンを切断またはいくつかのニューロンを活性化しない。
出力層
によって4096データ出力第7層は第8層の1000個のニューロンと完全に接続されており、トレーニング後に1000個のフロートタイプの値が出力されます。これは予測結果です。

ここに画像の説明を挿入

from tensorflow.keras import layers, models, Model, Sequential

def AlexNet_v1(im_height=224, im_width=224, class_num=1000):
    #num 是分类的类别
    # tensorflow中的tensor通道排序是NHWC
    input_image = layers.Input(shape=(im_height, im_width, 3), dtype="float32")  # output(None, 224, 224, 3)
    x = layers.ZeroPadding2D(((1, 2), (1, 2)))(input_image)                      # output(None, 227, 227, 3)
    x = layers.Conv2D(48, kernel_size=11, strides=4, activation="relu")(x)       # output(None, 55, 55, 48)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 27, 27, 48)
    x = layers.Conv2D(128, kernel_size=5, padding="same", activation="relu")(x)  # output(None, 27, 27, 128)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 13, 13, 128)
    x = layers.Conv2D(192, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 192)
    x = layers.Conv2D(192, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 192)
    x = layers.Conv2D(128, kernel_size=3, padding="same", activation="relu")(x)  # output(None, 13, 13, 128)
    x = layers.MaxPool2D(pool_size=3, strides=2)(x)                              # output(None, 6, 6, 128)

    x = layers.Flatten()(x)                         # output(None, 6*6*128)
    x = layers.Dropout(0.2)(x)
    x = layers.Dense(2048, activation="relu")(x)    # output(None, 2048)
    x = layers.Dropout(0.2)(x)
    x = layers.Dense(2048, activation="relu")(x)    # output(None, 2048)
    x = layers.Dense(class_num)(x)                  # output(None, 5)
    predict = layers.Softmax()(x)

    model = models.Model(inputs=input_image, outputs=predict)
    return model

おすすめ

転載: blog.csdn.net/qq_43811879/article/details/109639473