我在使用 3D CNN 提供数据时遇到问题Keras http://keras.io和 Python 对 3D 形状进行分类。我有一个文件夹,其中包含一些 JSON 格式的模型。我将这些模型读入 Numpy 数组。模型为 25*25*25,表示体素化模型的占用网格(每个位置表示位置 (i,j,k) 中的体素是否有点),所以我只有 1 个输入通道,就像二维图像中的灰度图像一样。我的代码如下:
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 中
状态)文件“/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/contextlib.py”,
89 号线,在exit下一个(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(状态))tensorflow.python.framework.errors_impl.InvalidArgumentError:负数
'Conv3D' 的 1 减去 5 产生的尺寸大小(操作:
'Conv3D'),输入形状:[?,1,25,25,25],[5,5,5,25,32]。
在处理上述异常的过程中,又出现了一个异常:
回溯(最近一次调用最后一次):文件“CNN_3D.py”,第 76 行,位于
激活='relu'))文件“/usr/local/lib/python3.6/site-packages/keras/models.py”,第299行,在
添加
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 行,在callself.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线,通话中
filter_shape=self.W_shape)文件“/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”,
第 2831 行,在 conv3d 中
x = tf.nn.conv3d(x, 内核, 步幅, 填充) 文件 "/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_requireing 中
返回 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 中
raise ValueError(err.message) ValueError:由于输入的“Conv3D”(操作:“Conv3D”)从 1 减去 5 导致负尺寸大小
形状:[?,1,25,25,25],[5,5,5,25,32]。
我做错了什么才会出现这个错误?