web-dev-qa-db-ja.com

3D畳み込みニューラルネットワークの入力形状

Keras およびPythonを使用して3D形状を分類する)を使用して3DCNNにフィードする際に問題が発生しました。JSON形式のモデルを含むフォルダーがあります。これらのモデルを読みました。モデルは25 * 25 * 25であり、ボクセル化されたモデルの占有グリッドを表します(各位置は、位置(i、j、k)のボクセルにポイントがあるかどうかを表します)。 2D画像のグレースケール画像のような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 status)ファイル "/ usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6/contextlib.py "、89行目、exitnext(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))tensorflow。 python.framework.errors_impl.InvalidArgumentError:入力形状が[?、1,25,25,25]、[5,5,5]の「Conv3D」(op:「Conv3D」)の1から5を引いたために発生した負のディメンションサイズ、25、32]。

上記の例外の処理中に、別の例外が発生しました。

トレースバック(最後の最後の呼び出し):ファイル "CNN_3D.py"、76行目、activation = '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/loc al/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_outputsshapes = 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 raise ValueError(err.message)ValueError:負の寸法サイズが発生しました入力形状が[?、1,25,25,25]、[5,5,5,25,32]の場合、「Conv3D」(op:「Conv3D」)の1から5を減算します。

このエラーを取得するために私は何を間違っていますか?

6

問題は、Theanoの順序で入力形状を設定しているのに、TensorflowバックエンドとTensorflowimgの順序でKerasを使用していることだと思います。さらに、y_train配列をカテゴリカルラベルに変換する必要があります。

更新されたコード:

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)

この行を追加すると修正されます。

7