第J7周:对于ResNeXt-50算法的思考

def block(x,filters,strides=1,groups=32,conv_shortcut=True):
    if conv_shortcut:
    	shortcut=Conv2D(filters * 2, kernel_size = (1,1),strides=strides,
    	padding='same')
    	shortcut = BatchNormalization(epsilon=1.001e-5)(shortcut)
    else:
    	shortcut=x
 	x=Conv2D(filters=filters,kernel_size=(1,1),strides=1,padding='same',use_bias=False)
 	x=BatchNormalization(epsilon=1.001e-5)(x)
 	x=ReLU()(x)
 	g_channels=int(filters/groups)
 	x=grouped_convolution_block(x,strides,groups,g_channels)
	x=Conv2D(filters=filters*2,kernel_size=(1,1),strides=1,padding='same')
	x=BatchNormalization(epsilon=1.001e-5)(x)
	x=Add()([x,shortcutu])
	x=ReLU()(x)
	return x
def grouped_convolution_block(init_x,strides,groups,g_channels):
	group_list = []
	for c in range(groups):
		x = Lambda(lamba x: x[:,:,:,c*g_channels:(c+1) * g_channels])(init_x)
		x =Conv2D(filters=g_channels,kernel_size=(3,3),stride=strides,padding='same',use_bias=False)
		group_list.append(x)
	group_merage=concatenate(group_list,axis=3)
	x=BatchNormalization(epsilon=1.001e-5)(group_merage)
	x=ReLU()(x)
	return x
def stack(x,filters,blocks,strides,groups=32):
	x=block(x,filters,strides=strides,groups=groups)
	for i in range(blocks):
		x=block(x,filters,groups=groups,conv_shortcut=False)
	return x
def ResNext50(input_shape,num_classes):
	inputs=Input(shape=input_shape)
	x=ZeroPadding2D((3,3))(inputs)
	x=Conv2D(filters=64,kernel_size=(7,7),strides=2,padding='valid')(x) #通道数64
	x=BatchNormalization(epsilon=1.001e-5)(x)
	x=ReLU()(x)
	x=ZeroPadding2D((1,1))(x)
	x=MaxPool2D(pool_size=(3,3),strides=2,padding='valid')(x)
	x=stack(x,filters=128,blocks=2,strides=1) #输出通道数为
	x=stack(x,filters=256,blocks=3,strides=2)
	x=stack(x,filters=512,blocks=5,strides=2)
	x=stack(x,filters=1024,blocks=2,strides=2)
	x=GlobalAvgPool2D()(x)
	x=Dense(num_classes,activation='softmax')(x)
	model=Model(inputs=inputs,outputs=x)
	return model

问题:如果conv_shortcut=False,那么在执行x=Add()"语句时,通道数不一致的,为什么不会报错?
回答:这个代码没有错。因为在ResNext50整个模型中,stack模块中,每个stack的第一个block的conv_shortcut=True,此时输出的通道数为filters的两倍,之后再将conv_shortcut=False,通道数就是匹配的了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值