搭建果蝇3D图像二分类CNN时遇InvalidArgumentError错误求助
我正在搭建一个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

