inception块
1x1卷积:
class Inception(tf.keras.layers.Layer):
#设置模块的构成
def __init__(self,c1,c2,c3,c4):
super().__init__()
#路线1
self.p1_1=tf.keras.layers.Conv2D(c1,kernel_size=1,activation='relu',padding='same')
#路线2
self.p2_1=tf.keras.layers.Conv2D(c2[0],kernel_size=1,activation='relu',padding='same')
self.p2_2=tf.keras.layers.Conv2D(c2[1],kernel_size=3,activation='relu',padding='same')
#路线3
self.p3_1=tf.keras.layers.Conv2D(c3[0],kernel_size=1,activation='relu',padding='same')
self.p3_2=tf.keras.layers.Conv2D(c3[1],kernel_size=5,activation='relu',padding='same')
#路线4
self.p4_1=tf.keras.layers.MaxPool2D(pool_size=3,padding='same',strides=1)
self.p4_2=tf.keras.layers.Conv2D(c4,kernel_size=1,activation='relu',padding='same')
#前向传播过程
def call(self,x):
#路线1
p1=self.p1_1(x)
#路线2
p2=self.p2_2(self.p2_1(x))
#路线3
p3=self.p3_2(self.p3_1(x))
#路线4
p4=self.p4_2(self.p4_1(x))
#concat
outputs=tf.concat([p1,p2,p3,p4],axis=-1) #按最后一个维度也就是通道进行拼接
return outputs
Inception(64,(96,128),(16,32),32)
GoogLeNet模型
B1模块
第一个模块使用一个64通道的7*7卷积层
#B1
inputs=tf.keras.Input(shape=(224,224,3),name='input')
x=tf.keras.layers.Conv2D(64,kernel_size=7,strides=2,padding='same',,activation='relu')(inputs)
x=tf.keras.layers.MaxPool2D(pool_size=3,strides=2,padding='same')(x)
B2模块
第二个模块使用2个卷积层:首先是64通道的1 * 1卷积层,然后是将通道增加3倍的3 * 3的卷积层
#B2
x=tf.keras.layers.Conv2D(64,kernel_size=1,padding='same',activation='relu')(x)
x=tf.keras.layers.Conv2D(192,kernel_size=3,padding='same',activation='relu')(x)
x=tf.keras.layers.MaxPool2D(pool_size=3,strides=2,padding='same')(x)
B3模块
第三个模块串联2个完整的Inception块。第一个Inception块输出通道为64+128+32+32=256。第二个Inception块输出通道数增至128+192+96+64=480
#B3
x=Inception(64,(96,128),(16,32),32)(x)
x=Inception(128,(128,192),(32,96),64)(x)
x=tf.keras.layers.MaxPool2D(pool_size=3,strides=2,padding='same')(x)
B4模块
#辅助分类器
def aux_classifier(x,filter_size):
x=tf.keras.layers.AveragePooling2D(pool_size=5,strides=3,padding='same')(x)
x=tf.keras.layers.Conv2D(filters=filter_size[0],kernel_size=1,strides=1,padding='valid',activation='relu')(x)
x=tf.keras.layers.Flatten()(x)
x=tf.keras.layers.Dense(units=filter_size[1],activation='relu')(x)
x=tf.keras.layers.Dense(units=10,activation='softmax')(x)
return x
#B4
x=Inception(192,(96,208),(16,48),64)(x)
#辅助输出
aux_output1=aux_classifier(x,[128,1024])
x=Inception(160,(112,224),(24,64),64)(x)
x=Inception(128,(128,256),(24,64),64)(x)
x=Inception(112,(144,288),(32,64),64)(x)
#辅助输出
aux_output1=aux_classifier(x,[128,1024])
x=Inception(256,(160,320),(32,128),128)(x)
x=tf.keras.layers.MaxPool2D(pool_size=3,strides=2,padding='same')(x)
B5模块
#B5
x=Inception(256,(160,320),(32,128),128)(x)
x=Inception(384,(192,384),(48,128),128)(x)
x=tf.keras.layers.GlobalAveragePooling2D()(x)
output=tf.keras.layers.Dense(10,activation='softmax')
model=tf.keras.Model(inputs=inputs,outputs=[output,aux_output1,aux_output2])
model.summary()
手写数字识别
只有模型编译有变化
#模型编译
net.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'],loss_weights=[1,0.3,0.3])
延伸版本
InceptionV2
InceptionV3