python - 在构建和训练 3D Keras U-NET 时遇到 ValueError
问题描述
在使用 keras 训练我为 3D Unet 构建的模型时,我收到ValueError:Conv3d_46 层的输入 0 与该层不兼容:预期 ndim=5,发现 ndim=6。收到的完整形状:[None, 2, 256, 256, 120, 4]。我的数据的形状大小为 (2, 256, 256, 120, 4)。
模型:
data = Input(shape=inp_shape)
flt=32
conv1 = Conv3D(flt, (3, 3, 3), activation='relu', padding='same')(data)
conv1 = Conv3D(flt, (3, 3, 3), activation='relu', padding='same')(conv1)
pool1 = MaxPooling3D(pool_size=(2, 2, 2))(conv1)
conv2 = Conv3D(flt*2, (3, 3, 3), activation='relu', padding='same')(pool1)
conv2 = Conv3D(flt*2, (3, 3, 3), activation='relu', padding='same')(conv2)
pool2 = MaxPooling3D(pool_size=(2, 2, 2))(conv2)
conv3 = Conv3D(flt*4, (3, 3, 3), activation='relu', padding='same')(pool2)
conv3 = Conv3D(flt*4, (3, 3, 3), activation='relu', padding='same')(conv3)
pool3 = MaxPooling3D(pool_size=(2, 2, 2))(conv3)
conv4 = Conv3D(flt*8, (3, 3, 3), activation='relu', padding='same')(pool3)
conv4 = Conv3D(flt*8, (3, 3, 3), activation='relu', padding='same')(conv4)
pool4 = MaxPooling3D(pool_size=(2, 2, 2))(conv4)
conv5 = Conv3D(flt*16, (3, 3, 3), activation='relu', padding='same')(pool4)
conv5 = Conv3D(flt*8, (3, 3, 3), activation='relu', padding='same')(conv5)
up6 = concatenate([Conv3DTranspose(flt*8, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv5), conv4], axis=-1)
conv6 = Conv3D(flt*8, (3, 3, 3), activation='relu', padding='same')(up6)
conv6 = Conv3D(flt*4, (3, 3, 3), activation='relu', padding='same')(conv6)
up7 = concatenate([Conv3DTranspose(flt*4, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv6), conv3], axis=-1)
conv7 = Conv3D(flt*4, (3, 3, 3), activation='relu', padding='same')(up7)
conv7 = Conv3D(flt*2, (3, 3, 3), activation='relu', padding='same')(conv7)
up8 = concatenate([Conv3DTranspose(flt*2, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv7), conv2], axis=4)
conv8 = Conv3D(flt*2, (3, 3, 3), activation='relu', padding='same')(up8)
conv8 = Conv3D(flt, (3, 3, 3), activation='relu', padding='same')(conv8)
up9 = concatenate([Conv3DTranspose(flt, (2, 2, 2), strides=(2, 2, 2), padding='same')(conv8), conv1], axis=4)
conv9 = Conv3D(flt, (3, 3, 3), activation='relu', padding='same')(up9)
conv9 = Conv3D(flt, (3, 3, 3), activation='relu', padding='same')(conv9)
conv10 = Conv3D(2, (1,1,1), activation='sigmoid')(conv9)
model = Model(inputs=[data], outputs=[conv10])
训练模型的代码如下:-
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['binary_accuracy'])
解决方案
目标标签的最后一维为 2。模型的输出的最后一维为 1。感谢@Shubham Panchal
推荐阅读
- ajax - 在 Asp.net core 2.1 上使用 Boostrap Modal 上传文件
- sql - Oracle SQL - 无效的 Alter Table 选项
- sql - MS SQL (SAP B1) “当子查询没有用 EXISTS 引入时,只能在选择列表中指定一个表达式...”
- ansible - 即使在使用本地连接运行 playbook 时将 delegate_to 设置为 remote,Ansible 也会在控制机器中创建目录
- c++ - objc 运行时源代码中类 ExplicitInit 的用途
- asp.net-core - .NET Core 3.1 Kestrel/Apache 停止响应请求
- heroku - 如何在 Heroku Review 应用程序中设置 cookie?
- php - WordPress - How to select specific values from a table column
- charts - 在matlab中绘制指数函数
- import - PostGIS:将数百个不同表中的 GEOM 多边形数据导入一张?