使用tensorflow实现inception v3

本文详细解读了Inception V3网络结构,包括inception_1到inception_5模块的实现,从不同分支的卷积、池化到全连接层的串联过程。核心内容涉及多尺度特征提取和并行路径设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.inception整体结构

 

1.figure5实现

def inception_1(x,param1,param2,param3,param4):
    # branch1 1*1-3*3-3*3
    branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
    branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=1)
    branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=1)
    
    # branch2 1*1-3*3
    branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
    branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=1)
    
    # branch3 avg_pool 3*3-1*1
    branch3 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
    branch3 = conv_fn(branch3,filters=param3[0],kernel_size=(1,1),strides=1)
    
    # branch4 1*1
    branch4 = conv_fn(x,filters=param4[0],kernel_size=(1,1),strides=1)
    
    return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])

2.figure5与figure6中间部分实现

def inception_2(x,param1,param2):
    # branch1 conv 3*3
    branch1 = conv_fn(x,filters=param1[0],kernel_size=(3,3),strides=2,padding="valid")
    
    # branch2 1*1-3*3-3*3
    branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
    branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=1)
    branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,3),strides=2,padding="valid")
    
    # branch3 max_pool 3*3 2
    branch3 = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
    
    return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3])

3.figure 6实现

 

def inception_3(x,param1,param2,param3,param4):
    # branch1 1*1-1*7-7*1-1*7-7*1
    branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
    branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(1,7),strides=1)
    branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(7,1),strides=1)
    branch1 = conv_fn(branch1,filters=param1[0],kernel_size=(1,7),strides=1)
    branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(7,1),strides=1)
    
    # branch2 1*1-1*7-7*1
    branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
    branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(1,7),strides=1)
    branch2 = conv_fn(branch2,filters=param2[1],kernel_size=(7,1),strides=1)
    
    # branch3 avg_pool-conv 1*1
    branch3 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
    branch3 = conv_fn(branch3,param3[0],kernel_size=(1,1),strides=1)
    
    # branch4
    branch4 = conv_fn(x,param4[0],kernel_size=(1,1),strides=1)
    return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])

 4.figure6与figure7连接部分实现

def inception_4(x,param1,param2):
    # branch1 1*1-3*3
    branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
    branch1 = conv_fn(branch1,filters=param1[1],kernel_size=(3,3),strides=2,padding='valid')
    
    # branch2 1*1-1*7-7*1-3*3
    branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
    branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(1,7),strides=1)
    branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(7,1),strides=1)
    branch2 = conv_fn(branch2,filters=param2[0],kernel_size=(3,3),strides=2,padding='valid')
    
    # branch3 max_pool 3*3
    branch3 = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
    return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3])

5.辅助输出部分实现

 

def aux_logit(x,n_classes=1000):
    x = keras.layers.AveragePooling2D(pool_size=(5,5),strides=3)(x)
    x = conv_fn(x,filters=128,kernel_size=(1,1),strides=1)
    x = keras.layers.Flatten()(x)
    x = keras.layers.BatchNormalization()(x)
    aux_output = keras.layers.Dense(n_classes,activation="softmax")(x)
    return aux_output

7.figure7实现

def inception_5(x,param1,param2,param3,param4):
    # branch1 1*1
    branch1 = conv_fn(x,filters=param1[0],kernel_size=(1,1),strides=1)
    
    # branch 1*1-1*3 and 3*1
    branch2 = conv_fn(x,filters=param2[0],kernel_size=(1,1),strides=1)
    branch2_1 = conv_fn(branch2,filters=param2[1],kernel_size=(1,3),strides=1)
    branch2_2 = conv_fn(branch2,filters=param2[1],kernel_size=(3,1),strides=1)
    branch2 = keras.layers.Concatenate(axis=3)([branch2_1,branch2_2])
    
    # branch3 1*1-3*3-1*3 and 3*1
    branch3 = conv_fn(x,filters=param3[0],kernel_size=(1,1),strides=1)
    branch3 = conv_fn(branch3,filters=param3[1],kernel_size=(3,3),strides=1)
    branch3_1 = conv_fn(branch3,filters=param3[1],kernel_size=(3,1),strides=1)
    branch3_2 = conv_fn(branch3,filters=param3[1],kernel_size=(1,3),strides=1)
    branch3 = keras.layers.Concatenate(axis=3)([branch3_1,branch3_2])
    
    # branch avg_pool 3*3 - conv 1*1
    branch4 = keras.layers.AveragePooling2D(pool_size=(3,3),strides=1,padding="same")(x)
    branch4 = conv_fn(branch3,filters=param4[0],kernel_size=(1,1),strides=1)
    
    return keras.layers.Concatenate(axis=3)([branch1,branch2,branch3,branch4])

8、串联整个网络

def incepetion_v3(input_shape,n_classes=1000):
    x_input = keras.layers.Input(shape=input_shape)
    x = conv_fn(x_input,filters=32,kernel_size=(3,3),strides=2,padding="valid")
    x = conv_fn(x,filters=32,kernel_size=(3,3),strides=1,padding="valid")
    x = conv_fn(x,filters=64,kernel_size=(3,3),strides=1)
    x = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
    
    x = conv_fn(x,filters=80,kernel_size=(1,1),strides=1,padding="valid")
    x = conv_fn(x,filters=192,kernel_size=(3,3),strides=1,padding="valid")
    x = keras.layers.MaxPooling2D(pool_size=(3,3),strides=2)(x)
    
    # mixed 0: 35 x 35 x 256
    x = inception_1(x,[64,96],[48,64],[32],[64])
    
    #  mixed 1: 35 x 35 x 288
    x = inception_1(x,[64,96],[48,64],[64],[64])
    
    # mixed 2: 35 x 35 x 288
    x = inception_1(x,[64,96],[48,64],[64],[64])    
    
    # mixed 3: 17 x 17 x 768
    x = inception_2(x,[384],[64,96])
    
    # mixed 4: 17 x 17 x 768
    x = inception_3(x,[128,192],[128,192],[192],[192])
    
    # mixed 5, 6: 17 x 17 x 768
    x = inception_3(x,[160,192],[160,192],[192],[192])
    x = inception_3(x,[160,192],[160,192],[192],[192])
    
    # mixed 7: 17 x 17 x 768
    x = inception_3(x,[192,192],[192,192],[192],[192])
    
    # 辅助输出
    aux_out = aux_logit(x,n_classes)
    
    # mixed 8: 8 x 8 x 1280
    x = inception_4(x,[192,320],[192])
    
    # mixed 9、10: 8 x 8 x 2048
    x = inception_5(x,[320],[384,384],[448,384],[192])
    x = inception_5(x,[320],[384,384],[448,384],[192])
    
    # 输出层
    x = keras.layers.GlobalAveragePooling2D()(x)
    output = keras.layers.Dense(n_classes,activation="relu")(x)
    
    model = keras.models.Model(inputs=[x_input],outputs=[aux_out,output])
    return model

9.网络结构概览 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱花的浪漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值