人体识别3D CNN模型开发报错:Convolution3D缺少kernel_size参数
3DCNN模型定义报错:缺少必填参数
kernel_size修复 报错现象
开发人体识别任务的3DCNN模型时,模型构建阶段触发如下错误:
TypeError: __init__() missing 1 required positional argument: 'kernel_size'
报错根因
该错误由Keras API版本不兼容导致:
- 代码使用的是Keras 1.x版本的
Convolution3D层参数写法,在Keras 2.x及以上版本(含TensorFlow 2.x内置的tf.keras)中,3D卷积层不再支持nb_depth/nb_row/nb_col三个独立参数传递卷积核尺寸,强制要求传入三维元组形式的kernel_size作为必填位置参数。 - 代码中Dense层使用的
init参数是旧版API的权重初始化参数,新版中已更名为kernel_initializer,不修改的话后续会触发新的参数不存在报错。
修复方案
按照新版Keras接口规范调整参数即可,具体修改点:
- 删除
Convolution3D层的nb_depth/nb_row/nb_col参数,替换为kernel_size=(卷积核深度, 卷积核行高, 卷积核列宽) - 将所有Dense层的
init参数替换为kernel_initializer - 可将旧类名
Convolution3D替换为新版通用别名Conv3D,二者功能完全一致。
修正后的完整代码如下:
# 各层卷积核数量 nb_filters = [32, 32] # 各层池化窗口尺寸 (POOL x POOL x POOL) nb_pool = [3, 3] # 各层卷积核尺寸 (CONV x CONV x CONV) nb_conv = [5,5] # 数据预处理 train_set = train_set.astype('float32') train_set -= np.mean(train_set) train_set /= np.max(train_set) # 模型定义 model = Sequential() # 修正3D卷积层参数 model.add(Conv3D(nb_filters[0], kernel_size=(nb_conv[0], nb_conv[0], nb_conv[0]), input_shape=(1, img_rows, img_cols, patch_size), activation='relu')) model.add(MaxPooling3D(pool_size=(nb_pool[0], nb_pool[0], nb_pool[0]))) model.add(Dropout(0.5)) model.add(Flatten()) # 修正全连接层初始化参数名 model.add(Dense(128, kernel_initializer='normal', activation='relu')) model.add(Dropout(0.5)) model.add(Dense(nb_classes, kernel_initializer='normal')) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='RMSprop')
补充注意:如果你的Keras后端为TensorFlow,默认使用
channels_last数据格式,需要将input_shape调整为(img_rows, img_cols, patch_size, 1)(通道维度放在最后),否则会触发维度不匹配报错。
内容的提问来源于stack exchange,提问作者mohammad Nadeem Ahangar
相关产品推荐
相关产品推荐

