文章目錄
- 目錄
- 1.NIN 結構
- 2.MLP卷積
- 3.全局均值池化
- 4.總體網絡架構
- 5.NIN補充
- 5.1 廣義線性模型(GLM)的局限性
- 5.2 CCCP層
- 5.3 1*1卷積核作用(補充)
- 6.手勢識別RGB圖像--NIN結構
目錄
1.NIN 結構
2.MLP卷積
- 傳統CNN的局部感受野窗口的運算,可以理解為一個單層的網絡。
- MLPconv層是每個卷積的局部感受野中還包含了一個微型的多層網絡。
- MLPconv采用多層網絡結構(一般3層)提高非線性,對每個局部感受野進行更加復雜的運算。
可以簡單理解是將傳統的卷積操作的輸出在作為一個MLP網絡層的輸入,從而使得輸入到下一層網絡的特征表征更強,對于同一個卷積核,共用一套MLP網絡。
3.全局均值池化
4.總體網絡架構
5.NIN補充
5.1 廣義線性模型(GLM)的局限性
- 經典CNN中的卷積層就是用線性濾波器對圖像進行內積運算,在每個局部輸出后面跟著一個非線性的激活函數,最終得到的叫作特征圖。
- 這種卷積濾波器是一種廣義線性模型。所以用CNN進行特征提取時,其實就隱含地假設了特征是線性可分的,可實際問題往往不是線性可分的。
- GLM的抽象能力比較弱,比線性模型更有表達能力的非線性函數近似器(比如MLP,徑向基神經)
5.2 CCCP層
MLPconv=CONV + MLP,因為conv是線性的,mlp是非線性的,mlp能夠得到更高的抽象,泛化能力更強。
跨通道時,mlpconv=卷積層 + 1×1卷積層,此時mlpconv層也叫cccp層
5.3 1*1卷積核作用(補充)
6.手勢識別RGB圖像–NIN結構
收斂緩慢,且震蕩
加了一層softmax ,第一三塊后加了BatchNormalization,基本解決了
代碼實現:
def NIN(input_shape=(64,64,3), classes=6):X_input = Input(input_shape)"block 1"X = Conv2D(filters=4, kernel_size=(5,5), strides=(1,1), padding='valid', activation='relu', name='conv1')(X_input)X = BatchNormalization(axis=3)(X)X = Conv2D(filters=4, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp1')(X)X = Conv2D(filters=4, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp2')(X)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool1')(X)"block 2"X = Conv2D(filters=8, kernel_size=(3,3), strides=(1,1), padding='valid', activation='relu', name='conv2')(X)X = BatchNormalization(axis=3)(X)X = Conv2D(filters=8, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp3')(X)X = Conv2D(filters=8, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp4')(X)X = AveragePooling2D((2,2), strides=(2,2), name='maxpool2')(X)"block 3"X = Conv2D(filters=16, kernel_size=(3,3), strides=(1,1), padding='valid', activation='relu', name='conv3')(X)X = BatchNormalization(axis=3)(X)X = Conv2D(filters=16, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp5')(X)X = Conv2D(filters=16, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp6')(X)X = MaxPooling2D((2,2), strides=(2,2), name='maxpool3')(X)"block 4"X = Conv2D(filters=6, kernel_size=(3,3), strides=(1,1), padding='same', activation='relu', name='conv4')(X)X = BatchNormalization(axis=3)(X)X = Conv2D(filters=6, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp7')(X)X = Conv2D(filters=6, kernel_size=(1,1), strides=(1,1), padding='valid', activation='relu', name='cccp8')(X)X = AveragePooling2D((6,6), strides=(1,1), name='Avepool1')(X)"flatten"X = Flatten()(X)X = Dense(classes, activation='softmax', name='fc1')(X)model = Model(inputs=X_input, outputs=X, name='NIN')return model