我在使用Keras和Python来分类3D形状时,遇到了一个问题,无法成功地喂养3D CNN。我有一个包含一些JSON格式模型的文件夹。我将这些模型读入Numpy数组中。这些模型是25*25*25的,表示体素化模型的占用网格(每个位置表示位置(i,j,k)中的体素是否具有点),因此我只有一个输入通道,类似于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_shapes.py”中,第670行,“_call_cpp_shape_fn_impl”函数中, status参数有问题,在“/usr/local/Cellar/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_impl.py”中,第469行,“raise_exception_on_not_ok_status”函数中, pywrap_tensorflow.TF_GetCode(status))参数有问题,导致“Conv3D”(op: 'Conv3D')的输入形状为[?,1,25,25,25],[5,5,5,25,32],从1减去5导致负数维度大小。 在处理上述异常期间,发生另一个异常:在“CNN_3D.py”的第76行, activation='relu')),在“/usr/local/lib/python3.6/site-packages/keras/models.py”中,第299行,“add”函数中,layer.create_input_layer(batch_input_shape, input_dtype)参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/engine/topology.py”中, 第401行,“create_input_layer”函数中,self(x)参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/engine/topology.py”中, 第572行,“call”函数中,self.add_inbound_node(inbound_layers, node_indices, tensor_indices)参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/engine/topology.py”中, 第635行,“add_inbound_node”函数中,Node.create_node(self, inbound_layers, node_indices, tensor_indices)参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/engine/topology.py”中, 第166行,“create_node”函数中,output_tensors = to_list(outbound_layer.call(input_tensors[0], mask=input_masks[0]))参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/layers/convolutional.py”中, 第1234行,“call”函数中,filter_shape=self.W_shape)参数有问题,在“/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”中, 第2831行,“conv3d”函数中,x = tf.nn.conv3d(x, kernel, strides, padding)参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/ops/gen_nn_ops.py”中, 第522行,“conv3d”函数中,strides=strides, padding=padding, name=name参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/op_def_library.py”中, 第763行,“apply_op”函数中,op_def=op_def参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”中, 第2397行,“create_op”函数中,set_shapes_for_outputs(ret)参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”中, 第1757行,“set_shapes_for_outputs”函数中,shapes = shape_func(op)参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/ops.py”中, 第1707行,“call_with_requiring”函数中,return call_cpp_shape_fn(op, require_shape_fn=True)参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/common_shapes.py”中, 第610行,“call_cpp_shape_fn”函数中,debug_python_shape_fn, require_shape_fn参数有问题,在“/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/common_shapes.py”中, 第675行,“_call_cpp_shape_fn_impl”函数中,err.message参数有问题,导致“Conv3D”(op: 'Conv3D')的输入形状为[?,1,25,25,25],[5,5,5,25,32],从1减去5导致负数维度大小。
我做错了什么导致出现这个错误?
X_train.reshape((-1, WIDTH, HEIGHT, 1))
。将其适应到你的情况,你可以尝试X_train = X_train.reshape((-1, img_rows, img_cols, img_depth, 1))
。而input_shape
应该是(img_rows, img_cols, img_depth, 1)
。 - Mattinput_shape =(5,img_rows,img_cols,img_depth)
)以克服或等于卷积滤波器的大小时,我可以通过创建层。但是我只有一个输入通道。我认为问题在Conv3D层的定义中。 - João Pedro Fontes