论文简读(二)
- 論文:https://arxiv.org/pdf/1409.4842.pdf
inception v1
流程
- 整體框架 - 論文的目的 - 論文中的創新點 - keras代碼實現整體框架
- inception模塊的設計
該論文加入inception模塊,(b)相比于(a)來說,在3x3h和5x5的卷積前加入了1x1的卷積用來降維,也就是減少channel數,這樣大大減少計算量。為什么要這樣設計呢?因為inception v1之前的網絡都是一條路走到黑,通過加深網絡來提高準確率,但這樣大大增加了計算量。而inception模塊增加了網絡的深度和寬度,利用小卷積,既增加網絡結構的深度,又減少了計算量,還提高了網絡的準確率。 - 網絡結構表
從表中來看,除了inception模塊,其他還是常規操作
論文的目的
- 減少計算參數量,減少訓練時間
- 提高網絡內部的資源利用率
- 既增加網絡的深度又增加網絡的寬度,還提升了準確率
論文中的創新點
- 1x1小卷積的提出,用于降維,減少了計算參數
- 最后使用了averagepool來適應網絡的如何輸入尺寸
- 加入了中間層輸出分支,在較低層進行分類并進行梯度的反向傳播
keras代碼實現
import keras from keras.layers import Input,Dense,Conv2D,MaxPool2D,BatchNormalization from keras.layers import concatenate,AvgPool2D,Dropout,Flatten from keras.models import Model from keras.utils import plot_model# inception模塊 def Inception(inputs=None,filter1=None,kernel1=1,filter3=None,kernel3=3,filter5=None,kernel5=5):# 1x1降維_1x1 = Conv2D(filters=filter1[0],kernel_size=kernel1,padding="same",activation="relu")(inputs)# 1x1降維reduce_1x1_3 = Conv2D(filters=filter1[1],kernel_size=kernel1,padding="same",activation="relu")(inputs)_3x3 = Conv2D(filters=filter3,kernel_size=kernel3,padding="same",activation="relu")(reduce_1x1_3)# 1x1降維reduce_1x1_5 = Conv2D(filters=filter1[2],kernel_size=kernel1,padding="same",activation="relu")(inputs)_5x5 = Conv2D(filters=filter5,kernel_size=kernel5,padding="same",activation="relu")(reduce_1x1_5)maxpool = MaxPool2D(pool_size=3,strides=1,padding="same")(inputs)# 1x1降維_1x1_max = Conv2D(filters=filter1[3],kernel_size=kernel1,padding="same",activation="relu")(maxpool)# 在通道上合并out = concatenate([_1x1,_3x3,_5x5,_1x1_max])return out# 分支輸出模塊 def output(net=None):net = AvgPool2D(pool_size=5,strides=3,padding="valid")(net)net = Conv2D(filters=128,kernel_size=1,strides=1,padding="valid",activation="relu")(net)net = Dense(units=1024,activation="relu")(net)net = Dropout(rate=0.7)(net)out = Dense(units=1000,activation="softmax")(net)return out# 網絡結構 --> 對著表看,很清晰 def Inception_v1():inputs = Input(shape=(224, 224, 3))net = Conv2D(filters=64, kernel_size=7,strides=2,padding="same",activation="relu")(inputs)net = BatchNormalization()(net)net = MaxPool2D(pool_size=3, strides=2, padding="same")(net)net = Conv2D(filters=64, kernel_size=1,strides=1,padding="same",activation="relu")(net)net = Conv2D(filters=192, kernel_size=3, strides=1,padding="same", activation="relu")(net)net = BatchNormalization()(net)net = MaxPool2D(pool_size=3, strides=2, padding="same")(net)net = Inception(inputs=net,filter1=[64,96,16,32],filter3=128,filter5=32)net = Inception(inputs=net,filter1=[128,128,32,64],filter3=192,filter5=96)net = MaxPool2D(pool_size=3, strides=2, padding="same")(net)net = Inception(inputs=net,filter1=[192,96,16,64],filter3=208,filter5=48)out1 = output(net)net = Inception(inputs=net,filter1=[160,112,24,64],filter3=224,filter5=64)net = Inception(inputs=net,filter1=[128,128,24,64],filter3=256,filter5=64)net = Inception(inputs=net,filter1=[112,144,32,64],filter3=288,filter5=64)out2 = output(net)net = Inception(inputs=net,filter1=[256,160,32,128],filter3=320,filter5=128)net = MaxPool2D(pool_size=3, strides=2,padding="same")(net)net = Inception(inputs=net,filter1=[256,160,32,128],filter3=320,filter5=32)net = Inception(inputs=net,filter1=[384,192,48,128],filter3=384,filter5=48)net = AvgPool2D(pool_size=7, strides=1,padding="valid")(net)net = Flatten()(net)net = Dropout(rate=0.4)(net)out3 = Dense(units=1000, activation="softmax")(net)model = Model(inputs=[inputs], outputs=[out1, out2, out3])return model# 畫出結構圖并保存 model = Inception_v1() plot_model(model, to_file='model.png',show_shapes=True,dpi=150)- 網絡結構圖
- 每天進步一點點
總結
- 上一篇: CV之路——opencv基本操作
- 下一篇: 贷款违约预测--赛题理解