【问题标题】:3D CNN model throwing a Negative dimension error-- dimension issue3D CNN 模型抛出负维度错误——维度问题
【发布时间】:2021-09-05 03:18:42
【问题描述】:

我正在创建一个高度 = 128、宽度 = 128、通道 = 3 的 3D CNN 模型。3D CNN 的代码-

def get_model(width=128, height=128, depth=3):
  """
  Build a 3D convolutional neural network
  """
  inputs = tf.keras.Input((width, height, depth, 1))

  x = layers.Conv3D(filters=64, kernel_size=3, activation="relu")(inputs)
  x = layers.MaxPool3D(pool_size=2)(x)
  x = layers.BatchNormalization()(x)

  x = layers.Conv3D(filters=128, kernel_size=3, activation="relu")(x)
  x = layers.MaxPool3D(pool_size=2)(x)
  x = layers.BatchNormalization()(x)

  x = layers.Conv3D(filters=256, kernel_size=3, activation="relu")(x)
  x = layers.MaxPool3D(pool_size=2)(x)
  x = layers.BatchNormalization()(x)

  x = layers.GlobalAveragePooling3D()(x)
  x = layers.Dense(units=512, activation="relu")(x)

  x = layers.Dropout(0.3)(x)

  outputs = layers.Dense(units=4, activation='softmax')(x)

  model= keras.Model(inputs, outputs, name="3DCNN")
  return model

所以在创建模型函数后,当我尝试构建模型时,它会引发值错误

-ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling3d_5/MaxPool3D}} = MaxPool3D[T=DT_FLOAT, data_format="NDHWC", ksize=[1, 2, 2, 2, 1], padding="VALID", strides=[1, 2, 2, 2, 1]](Placeholder)' with input shapes: [?,126,126,1,64].

构建模型的代码:- #构建模型

model = get_model(width=128, height=128, depth=3)
model.summary()

完全错误-

   InvalidArgumentError                      Traceback (most recent call last)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs, op_def)
       1879   try:
    -> 1880     c_op = pywrap_tf_session.TF_FinishOperation(op_desc)
       1881   except errors.InvalidArgumentError as e:
    
    InvalidArgumentError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling3d_5/MaxPool3D}} = MaxPool3D[T=DT_FLOAT, data_format="NDHWC", ksize=[1, 2, 2, 2, 1], padding="VALID", strides=[1, 2, 2, 2, 1]](Placeholder)' with input shapes: [?,126,126,1,64].
    
    During handling of the above exception, another exception occurred:
    
    ValueError                                Traceback (most recent call last)
    14 frames
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs, op_def)
       1881   except errors.InvalidArgumentError as e:
       1882     # Convert to ValueError for backwards compatibility.
    -> 1883     raise ValueError(str(e))
       1884 
       1885   return c_op
    
    ValueError: Negative dimension size caused by subtracting 2 from 1 for '{{node max_pooling3d_5/MaxPool3D}} = MaxPool3D[T=DT_FLOAT, data_format="NDHWC", ksize=[1, 2, 2, 2, 1], padding="VALID", strides=[1, 2, 2, 2, 1]](Placeholder)' with input shapes:

 [?,126,126,1,64].

这个错误是什么意思??我的维度有问题吗??

提前谢谢!!!!!!

【问题讨论】:

    标签: tensorflow keras deep-learning conv-neural-network tensorflow2.0


    【解决方案1】:

    不指定data_format 参数,Conv3D 层将输入形状视为:

    batch_shape + (conv_dim1, conv_dim2, conv_dim3, channels)

    您已指定为:

    batch_shape + (width=128, height=128, depth=3, channels=1)

    因此,您有一个数据,其形状为 (128,128,3) 并且有 1 个通道。

    由于卷积操作适用于前 3 个维度,即 (128,128,3),在第一次卷积 kernel_size=3 之后,第 3 个维度(您指定为 depth=3 的维度)收缩到 1。然后在下一层 ( MaxPooling3D) 它无法通过 2 进行池化,因为形状不适合。因此,请考虑将深度尺寸更改为更大的数字或更改kernel_size 参数。例如,输入形状可以是 (128,128,128,1)kernel_size 应该更改为 (3,3,1) 之类的其他内容。

    P.S:如果你有一个 RGB 图像,那么通道数是 3,最后一个维度应该设置为 3。在 3D 图像中还有另一个概念,称为深度(另一个维度),它与通道不同。所以:

    • 3D 图像 RGB:(width, height, depth, 3)
    • 3D图像灰度:(width, height, depth, 1)
    • 2D 图像 RGB:(width, height, 3)
    • 二维图像灰度:(width, height, 1)

    【讨论】:

    • 所以如果我有 3 个 RGB 通道,那么我设置通道 = 3?
    • 是的。您使用了适合 3D 数据的 Conv3D。例如,如果你有 3D 图像,你可能有超过 3 个深度(形状可能是 (128,128,128,3) 。但是如果你有常规图像 (2D) 使用 Conv2D 层,输入将是 (128,128,3)
    • 我正在尝试预测手势,这就是我使用 3D Conv 的原因。如果我的通道是不同的东西,RGB 是 3,那么深度是多少,我只有 1 个困惑。我曾经以为深度就是渠道
    • 如果你有一个 RGB 图像,那么通道数是 3,最后一个维度应该设置为 3。在 3D 图像中,我们有另一个概念,称为深度(另一个维度),它与通道不同。所以,在 3D 图像中你有(宽度、高度、深度、通道)和在 2D 图像中你有(宽度、高度、通道)。如果是灰度,则通道为 1,如果是 RGB,则通道为 3。
    • 只是一个问题,我可以将图像数量作为深度
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2016-11-18
    • 2020-11-07
    • 2018-09-24
    • 2023-03-05
    • 1970-01-01
    • 2023-03-30
    • 2017-10-22
    相关资源
    最近更新 更多