当前位置: 首页 > 知识库问答 >
问题:

三维卷积神经网络输入形状

花飞扬
2023-03-14

我在使用Keras和Python对3D形状进行分类时遇到了一个问题。我有一个文件夹,里面有一些JSON格式的模型。我将这些模型读入Numpy数组。模型是25*25*25,表示体素化模型的占用网格(每个位置表示位置(i、j、k)中的体素是否有点),因此我只有1个输入通道,就像2D图像中的灰度图像一样。我拥有的代码如下:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution3D, MaxPooling3D
from keras.optimizers import SGD
from keras.utils import np_utils
from keras import backend as K

# Number of Classes and Epochs of Training
nb_classes = 3 # cube, cone or sphere
nb_epoch = 100
batch_size = 2

# Input Image Dimensions
img_rows, img_cols, img_depth = 25, 25, 25

# Number of Convolutional Filters to use
nb_filters = 32

# Convolution Kernel Size
kernel_size = [5,5,5]

X_train, Y_train = [], []

# Read from File
import os
import json

i=0
for filename in os.listdir(os.path.join(os.getcwd(), 'models')):
    with open(os.path.join(os.getcwd(), 'models', filename)) as f:
        file = f.readlines()
        json_file = '\n'.join(file)
        content = json.loads(json_file)
        occupancy = content['model']['occupancy']
        form = []
        for value in occupancy:
            form.append(int(value))
        final_model = [ [ [ 0 for i in range(img_rows) ]
                              for j in range(img_cols) ]
                              for k in range(img_depth) ]
        a = 0
        for i in range(img_rows):
            for j in range(img_cols):
                for k in range(img_depth):
                    final_model[i][j][k] = form[a]
                    a = a + 1
        X_train.append(final_model)
        Y_train.append(content['model']['label'])

X_train = np.array(X_train)
Y_train = np.array(Y_train)

# (1 channel, 25 rows, 25 cols, 25 of depth)
input_shape = (1, img_rows, img_cols, img_depth)

# Init
model = Sequential()

# 3D Convolution layer
model.add(Convolution3D(nb_filters, kernel_size[0], kernel_size[1], kernel_size[2],
                        input_shape=input_shape,
                        activation='relu'))

# Fully Connected layer
model.add(Flatten())
model.add(Dense(128,
          init='normal',
          activation='relu'))
model.add(Dropout(0.5))

# Softmax Layer
model.add(Dense(nb_classes,
                init='normal'))
model.add(Activation('softmax'))

# Compile
model.compile(loss='categorical_crossentropy',
              optimizer=SGD())

# Fit network
model.fit(X_train, Y_train, nb_epoch=nb_epoch,
         verbose=1)

在此之后,我得到以下错误

使用TensorFlow后端。回溯(最后一次调用):文件“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/common\u shapes.py”,第670行,在\u call\u cpp\u shape\u fn\u impl status)文件“/usr/local/cillar/python3/3.6.0/Frameworks/python.framework/Versions/3.6/lib/python3.6/contextlib.py”第89行,在exit next(self.gen)文件“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/errors\u impl.py”的第469行中,在raise\u exception\u not\u ok\u status pywrap\u tensorflow中。TF\u GetCode(状态))tensorflow。蟒蛇框架错误\u impl。InvalidArgumentError:输入形状为[?,1,25,25,25],[5,5,25,32]的“Conv3D”(op:“Conv3D”)从1中减去5,导致尺寸为负。

在处理上述异常时,发生了另一个异常:

回溯(最后一次调用):文件“CNN\u 3D.py”,第76行,在activation='relu')中;文件“/usr/local/lib/python3.6/site packages/keras/models.py”,第299行,在add layer中。在调用self中的create\u input\u layer self(x)文件“/usr/local/lib/python3.6/site packages/keras/engine/topology.py”中的第401行中创建\u input\u layer(batch\u input\u shape,input\u dtype)文件“/usr/local/lib/python3.6/site packages/keras/engine/topology.py”,第572行。在add\u inbound\u节点中添加\u inbound\u节点(inbound\u layers、node\u index、tensor\u index)文件“/usr/local/lib/python3.6/site packages/keras/engine/topology.py”,第635行。创建\u节点(self、inbound\u layers、node\u index、tensor\u index)文件“/usr/local/lib/python3.6/site packages/keras/engine/topology.py”,第166行,在create\u node output\u tensors=to\u list(outbound\u layer.call(input\u tensors[0],mask=input\u masks[0])文件“/usr/local/lib/python3.6/site packages/keras/layers/coulsional.py”,第1234行,在call filter\u shape=self中。W\u shape)File“/usr/local/lib/python3.6/site packages/keras/backend/tensorflow\u backend.py”,第2831行,conv3d x=tf。nn。conv3d(x,kernel,strips,padding)文件“/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/gen\u nn\u ops.py”,第522行,在conv3d-strips=strips,padding=padding,name=name)文件“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/op\u def\u library.py”,第763行,在apply\u-op\u-def)文件中python/framework/ops.py“,第2397行,在create\u op set\u shapes\u for\u outputs(ret)文件“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/ops.py”中,第1757行,在set\u shapes\u for\u outputs shapes=shape\u func(op)文件“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/ops.py”中,第1707行,在call\u with\u required return call\u cpp\u shape\u fn(op,require\u shape\u fn=True)File“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/common\u shapes.py”中,第610行,在call\u cpp\u shape\u fn debug\u python\u shape\u fn,require\u shape\u fn)File“/usr/local/lib/python3.6/site packages/tensorflow/python/framework/common\u shapes.py”中,第675行,在\u call\u cpp\u shape\u fn\u impl raise ValueError(错误消息)ValueError:输入形状为[?,1,25,25,25],[5,5,25,32]的“Conv3D”(op:“Conv3D”)从1中减去5导致尺寸为负。

我做错了什么才得到这个错误?

共有1个答案

陆正德
2023-03-14

我认为问题在于,您正在No ordering中设置输入形状,但您正在将Keras与Tensorflow backend和Tensorflow img ordering一起使用。此外,必须将y\U列数组转换为类别标签。

更新的代码:

from keras.utils import np_utils
from keras import backend as K

if K.image_dim_ordering() == 'th':
    X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols, img_depth)
    input_shape = (1, img_rows, img_cols, img_depth)
else:
    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, img_depth, 1)
    input_shape = (img_rows, img_cols, img_depth, 1)

Y_train = np_utils.to_categorical(Y_train, nb_classes)

添加此行应该可以修复它。

 类似资料:
  • 我正在尝试为数字数据集构建1D CNN。我的数据集有520行和13个特征。下面是代码。 它给出了“ValueError:layer sequential\u 21的输入0与layer不兼容::expected min\u ndim=3,found ndim=2。接收到的完整形状:(1,13)”错误。 我需要如何设置输入形状,还是必须重塑X\U列?非常感谢您的帮助。

  • 我正在尝试创建一个CNN来对数据进行分类。我的数据是X[N\u数据,N\u特征]我想创建一个能够对其进行分类的神经网络。我的问题是关于keras后端Conv1D的输入形状。 我想在上面重复一个过滤器。。假设有10个特征,然后为接下来的10个特征保持相同的权重。对于每个数据,我的卷积层将创建N\U特征/10个新神经元。我该怎么做?我应该在input\u形状中放置什么? 有什么建议吗?非常感谢。

  • ​尽管 IBM 的深蓝超级计算机在1996年击败了国际象棋世界冠军 Garry Kasparvo,直到近几年计算机都不能可靠地完成一些看起来较为复杂的任务,比如判别照片中是否有狗以及识别语音。为什么这些任务对于人类而言如此简单?答案在于感知主要发生在我们意识领域之外,在我们大脑中的专门视觉,听觉和其他感官模块内。当感官信息达到我们的意识时,它已经被装饰了高级特征;例如,当你看着一只可爱的小狗的照片

  • 我有32760个音频频谱,计算维度=72(#帧)x 40(#频段),我试图将其输入“宽”卷积神经网络(第一层是4个不同conv层的合奏)。这些频谱没有深度,因此它们可以表示为72 x 40 2D数字浮点数组,因此分类器的X输入是一个32760个元素长的数组,每个元素都是这些72 x 40 x 1频谱之一。Y输入是一个标签数组,一个热编码,有32760个元素。 当尝试使用 我得到以下错误: 以下是我

  • 我正在试图理解卷积神经网络中的维度是如何表现的。在下图中,输入为带1个通道的28乘28矩阵。然后是32个5乘5的过滤器(高度和宽度步幅为2)。所以我理解结果是14乘14乘32。但是在下一个卷积层中,我们有64个5×5的滤波器(同样是步幅2)。那么为什么结果是7乘7乘64而不是7乘7乘32*64呢?我们不是将64个滤波器中的每一个应用于32个通道中的每一个吗?

  • 注意: 本教程适用于对Tensorflow有丰富经验的用户,并假定用户有机器学习相关领域的专业知识和经验。 概述 对CIFAR-10 数据集的分类是机器学习中一个公开的基准测试问题,其任务是对一组大小为32x32的RGB图像进行分类,这些图像涵盖了10个类别: 飞机, 汽车, 鸟, 猫, 鹿, 狗, 青蛙, 马, 船以及卡车。 想了解更多信息请参考CIFAR-10 page,以及Alex Kriz