使用 3D CNN 进行 3D 图像分类
Posted
技术标签:
【中文标题】使用 3D CNN 进行 3D 图像分类【英文标题】:3D image classification using 3D CNN 【发布时间】:2020-04-01 03:00:46 【问题描述】:我设计了一个 CNN 网络,以便在 keras 中使用“cifar10”数据集。 这是我的代码:
input_layer = Input(shape=(32,32,3))
x = Conv3D(32,(5,5,3),activation='relu',padding='same')(input_layer)
x = Conv3D(32,(5,5,3),activation='relu',padding='same')(x)
x = MaxPool3D(pool_size=2, padding='same')(x)
x = Conv3D(32,(5,5,3),activation='relu',padding='same')(x)
x = Conv3D(32,(5,5,3),activation='relu',padding='same')(x)
x = MaxPool3D(pool_size=2, padding='same')(x)
x = Flatten()(x)
x = Dense(128,kernel_initializer='random_normal', bias_initializer='zeros')(x)
x = Dense(128,kernel_initializer='random_normal', bias_initializer='zeros')(x)
output_layer = Dense(10,activation='softmax',kernel_initializer='random_normal', bias_initializer='zeros')(x)
Cifar10_CNN = Model(input_layer, output_layer)
当我构建模型时出现此错误:
Input 0 is incompatible with layer conv3d_5: expected ndim=5, found ndim=4
我该如何解决这个问题?
【问题讨论】:
将 ndim=5 的正确输入提供给函数 conv3d_5,而不是 ndim=4 的输入。问题:函数 conv_3d_5 在哪里?哪个函数调用最后一个?你调查了吗? 另一种解决方案可能是使用函数 conv3d_4。它存在吗?好吧,你有很多不同的方法可以解决这个问题:) 深入了解其余代码 @Leos313 是的,下划线后面的数字不能确定是哪一层导致错误。我第一次运行代码时它是“1”,我认为它指的是第一个 Conv3D 层。我更改了参数,但仍然得到相同的错误。在多次运行代码而不更改代码后,数字只是增加了。在“11”运行后它得到“11”。所以它不涉及任何层。我想知道它是什么。 这能回答你的问题吗? Keras ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5 可能重复***.com/questions/47665391/… 【参考方案1】:您可能应该阅读有关differences between Conv2D, Conv3D 的信息。尽管可能会令人困惑(假设图像实际上是 3 维的),但它们仍然被认为是 2D 的(在考虑 Keras 中的卷积时,您不会考虑通道维度。卷积无论如何都发生在通道维度上)。所以图片不需要Conv3D
,你需要Conv2D
。
from tensorflow.keras.layers import Input, Dense, Conv2D, MaxPool2D, Flatten
from tensorflow.keras.models import Model
input_layer = Input(shape=(32,32,3))
x = Conv2D(32,(5,5),activation='relu',padding='same')(input_layer)
x = Conv2D(32,(5,5),activation='relu',padding='same')(x)
x = MaxPool2D(pool_size=2, padding='same')(x)
x = Conv2D(32,(5,5),activation='relu',padding='same')(x)
x = Conv2D(32,(5,5),activation='relu',padding='same')(x)
x = MaxPool2D(pool_size=2, padding='same')(x)
x = Flatten()(x)
x = Dense(128,kernel_initializer='random_normal', bias_initializer='zeros')(x)
x = Dense(128,kernel_initializer='random_normal', bias_initializer='zeros')(x)
output_layer = Dense(10,activation='softmax',kernel_initializer='random_normal', bias_initializer='zeros')(x)
Cifar10_CNN = Model(input_layer, output_layer)
print(Cifar10_CNN.summary())
【讨论】:
非常感谢。那么我们在哪里使用 Conv3D? 您可以阅读我附在答案中的那个链接。但简短的回答,例如关于激光雷达(激光)数据,实际上有 4 个维度(高度、宽度、深度、通道)。以上是关于使用 3D CNN 进行 3D 图像分类的主要内容,如果未能解决你的问题,请参考以下文章