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

搭建果蝇3D图像二分类CNN时遇InvalidArgumentError错误求助

3D CNN分类果蝇癌变图像时的Graph执行错误解决

我正在搭建一个3D CNN模型,用于将果蝇的3D图像分类为癌变或非癌变类型。模型由多组包含2个卷积层、最大池化层和批量归一化层的模块,以及若干全连接层(FC层)和预测层组成,但训练时始终报错:InvalidArgumentError: Graph execution error。

模型定义代码

inputs = keras.Input(shape = InSize + (1,))

x = keras.layers.Conv3D(filters = 64, kernel_size = 3, activation = 'relu', name = '3DConv1')(inputs)
x = keras.layers.Conv3D(filters = 64, kernel_size = 3, activation = 'relu', name = '3DConv2')(x)
x = keras.layers.MaxPool3D(pool_size = 2, name = 'MaxPool1')(x)
x = keras.layers.BatchNormalization(name = 'BatchNorm1')(x)

# x = keras.layers.Conv3D(filters = 64, kernel_size = 3, activation = 'relu', name = '3DConv3')(x)
# x = keras.layers.Conv3D(filters = 64, kernel_size = 3, activation = 'relu', name = '3DConv5')(x)
# x = keras.layers.MaxPool3D(pool_size = 2, name = 'MaxPool2')(x)
# x = keras.layers.BatchNormalization(name = 'BatchNorm2')(x)

x = keras.layers.GlobalAveragePooling3D(name = 'GlobalNorm1')(x)
# x = keras.layers.Flatten()(x)
x = keras.layers.Dense(units = 50, activation = 'relu', name = 'FC1')(x)
x = keras.layers.Dense(units = 50, activation = 'relu', name = 'FC2')(x)
x = keras.layers.Dropout(0.3, name = 'Dropout1')(x)

outputs = keras.layers.Dense(units = 1, activation = 'sigmoid', name = 'Classifier')(x)

model = keras.Model(inputs, outputs)

model.summary()

model.compile(loss = loss,
              optimizer = keras.optimizers.legacy.Adam(learning_rate = LR),
              metrics = metrics)

生成的模型结构

Model: "3dcnn"

Layer (type) Output Shape Param

input_1 (InputLayer) [(None, 128, 128, 64, 1)] 0

conv3d (Conv3D) (None, 126, 126, 62, 64) 1792

max_pooling3d (MaxPooling3D) (None, 63, 63, 31, 64) 0

batch_normalization (BatchNo (None, 63, 63, 31, 64) 256

conv3d_1 (Conv3D) (None, 61, 61, 29, 64) 110656

max_pooling3d_1 (MaxPooling3 (None, 30, 30, 14, 64) 0

batch_normalization_1 (Batch (None, 30, 30, 14, 64) 256

conv3d_2 (Conv3D) (None, 28, 28, 12, 128) 221312

max_pooling3d_2 (MaxPooling3 (None, 14, 14, 6, 128) 0

batch_normalization_2 (Batch (None, 14, 14, 6, 128) 512

conv3d_3 (Conv3D) (None, 12, 12, 4, 256) 884992

max_pooling3d_3 (MaxPooling3 (None, 6, 6, 2, 256) 0

batch_normalization_3 (Batch (None, 6, 6, 2, 256) 1024

global_average_pooling3d (Gl (None, 256) 0

dense (Dense) (None, 512) 131584

dropout (Dropout) (None, 512) 0

dense_1 (Dense) (None, 1) 513

Total params: 1,352,897
Trainable params: 1,351,873
Non-trainable params: 1,024

输入数据说明

我的输入数据是形状为(30, 27, 54, 182)的NumPy数组,包含30张图像,元素为强度数据(最大值10965);标签是形状为(30,)的uint8类型NumPy数组。

训练代码

history = model.fit(
        xTrain, 
        yTrain,
        batch_size = batch_size,
        epochs = epochs,
        verbose = verbose,
        shuffle = shuffle,
        validation_data = (xVal,yVal), 
        class_weight = class_weight
    )

错误信息

InvalidArgumentError: 图执行错误:

发现2个根错误。
(0) INVALID_ARGUMENT: indices[0] = 1 不在 [0, 1) 范围内
[[{{node GatherV2}}]]
[[IteratorGetNext]]
[[IteratorGetNext/_2]]
(1) INVALID_ARGUMENT: indices[0] = 1 不在 [0, 1) 范围内
[[{{node GatherV2}}]]
[[IteratorGetNext]]
0个操作成功执行。
忽略0个衍生错误。[Op:__inference_train_function_21420]

问题解决

后续遇到相同问题的用户请注意:本次错误的原因是我误将class_weight定义为{0: 0.5, 0: 0.5},正确的写法应为{0:0.5, 1:0.5}。遇到同类问题请仔细检查class_weight字典的内容!


内容的提问来源于stack exchange,提问作者Joshua Arenson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:36:01