You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决方法

  1. 替换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)
    
  2. 修正模块命名笔误:代码中Inspection_B应为Inception_B,这个错误可能导致模块输出形状异常,务必修正。

内容的提问来源于stack exchange,提问作者Anirudh Ta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:27:08