图像分类——GoogLeNet

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

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40527560/article/details/131621663