TensorFlow中Inception V3添加Dropout层引发形状错误求助
Inception V3添加Dropout层后出现形状不匹配错误
问题描述
我正在实现一个小型版Inception V3模型,为缓解过拟合尝试添加Dropout层,但一直遇到形状错误,排查后未找到原因,寻求帮助。
警告信息
tensorflow/core/grappler/optimizers/meta_optimizer.cc:954] layout failed: INVALID_ARGUMENT: Size of values 0 does not match size of permutation 4 @ fanin shape ininception_v3/dropout/dropout/SelectV2-2-TransposeNHWCToNCHW-LayoutOptimizer
模型构建代码
def build_inception_V3(): inputs = Input((H,W,3)) B_1 = Block_1(inputs) B_2 = Block_2(B_1) In_A = Inception_A(B_2) In_A = Dropout(0.5)(In_A) # Add dropout after Inception_A In_A = Inception_A(In_A) In_A = Dropout(0.5)(In_A) # Add dropout after Inception_A In_A = Inception_A(In_A) In_A = Dropout(0.5)(In_A) # Add dropout after Inception_A Red_A = Inception_Reduction_A(In_A) In_B = Inspection_B(Red_A) In_B = Dropout(0.5)(In_B) In_B = Inspection_B(In_B) In_B = Dropout(0.5)(In_B) In_B = Inspection_B(In_B) In_B = Dropout(0.5)(In_B) In_B = Inspection_B(In_B) In_B = Dropout(0.5)(In_B) Red_B = Inception_Red_B(In_B) In_C = Inception_C(Red_B) In_C = Dropout(0.5)(In_C) In_C = Inception_C(In_C) In_C = Dropout(0.5)(In_C) Res = keras.layers.GlobalAveragePooling2D(name='avg_pool')(In_C) Res = keras.layers.Dense(7, activation='softmax', name='predictions')(Res) model = keras.Model(inputs, Res, name='inception_v3') return model
相关模块代码
Inception_A模块
def Inception_A(X): conv_3 = Conv2D(filters=48,strides=1,padding='same',kernel_size=(1,1))(X) conv_3 = batch_norm_relu(conv_3) conv_3_1 = Conv2D(filters=64,strides=1,padding='same',kernel_size=(3,3))(conv_3) conv_3_1 = batch_norm_relu(conv_3_1) conv_5 = Conv2D(filters=64,kernel_size=(1,1),strides=1,padding='same')(X) conv_5 = batch_norm_relu(conv_5) conv_5_1 = Conv2D(filters=96,strides=1,padding='same',kernel_size=(3,3))(conv_5) conv_5_1 = batch_norm_relu(conv_5_1) conv_5_2 = Conv2D(filters=96,strides=1,padding='same',kernel_size=(3,3))(conv_5_1) conv_5_2 = batch_norm_relu(conv_5_2) conv_1 = Conv2D(filters=64,strides=1,padding='same',kernel_size=(1,1))(X) conv_1 = batch_norm_relu(conv_1) max_pool = AveragePooling2D(strides=1,padding='same',pool_size=(3,3))(X) conv_1_max = Conv2D(filters=32,strides=1,padding='same',kernel_size=(1,1))(max_pool) conv_1_max = batch_norm_relu(conv_1_max) res = Concatenate(axis=-1)([conv_3_1,conv_5_2,conv_1,conv_1_max]) return res
Block_1模块
def Block_1(X,F1=32,F2=32,F3=64): x = batch_norm_relu(X) x = Conv2D(kernel_size=(3,3),strides=(2,2),filters=F1,padding="valid")(x) x = batch_norm_relu(x) x = Conv2D(kernel_size=(3,3),strides=(1,1),filters=F2,padding="valid")(x) x = batch_norm_relu(x) x = Conv2D(kernel_size=(3,3),strides=(1,1),filters=F3,padding="same")(x) return x
解决方法
替换Dropout层为SpatialDropout2D:标准
Dropout仅适用于2D张量(如全连接层输出),而Inception模块输出的是4D特征图((batch_size, height, width, channels))。SpatialDropout2D会随机丢弃整个通道,更适配卷积后的特征图,不会破坏空间结构。
修改示例:from tensorflow.keras.layers import SpatialDropout2D # 将所有Dropout(0.5)替换为 In_A = SpatialDropout2D(0.5)(In_A)修正模块命名笔误:代码中
Inspection_B应为Inception_B,这个错误可能导致模块输出形状异常,务必修正。
内容的提问来源于stack exchange,提问作者Anirudh Ta
相关产品推荐
相关产品推荐

