私はケラでVGG16モデルを複製しようとしています、次は私のコードです:
model = Sequential()
model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2))) ###This line gives error
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(4096, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1000, activation='softmax'))
Maxpooling2dレイヤーはコメントされている行でエラーを出します
エラーは言います:
ValueError: Negative dimension size caused by subtracting 2 from 1 for 'MaxPool_7' (op: 'MaxPool') with input shapes: [?,1,112,128].
この背後にある理由は何でしょうか?これを解決するには?
編集:より詳細なエラーログ:
ValueError Traceback(最新の最後の呼び出し)in()12 model.add(Convolution2D(128、3、3、activation = 'relu'))13 ---> 14 model.add(MaxPooling2D((2,2)、strides) =(2,2)))15 16 model.add(ZeroPadding2D((1,1)))
/usr/local/lib/python2.7/dist-packages/keras/models.pyc in add(self、layer)306 output_shapes = [self.outputs [0] ._ keras_shape])307 else:-> 308 output_tensor = layer(self.outputs [0])309 type(output_tensor)がリストの場合:310 raise Exception( 'Sequentialモデルのすべてのレイヤー'
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in call(self、x、mask)512 if inbound_layers:513#これはlayer.buildを呼び出します()必要に応じて-> 514 self.add_inbound_node(inbound_layers、node_indices、tensor_indices)515 input_added = True 516
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in add_inbound_node(self、inbound_layers、node_indices、tensor_indices)570#ノードを作成すると、self.inbound_nodes 571#およびoutbound_nodesが自動的に更新されますインバウンド層。 -> 572 Node.create_node(self、inbound_layers、node_indices、tensor_indices)573 574 def get_output_shape_for(self、input_shape):
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in create_node(cls、outbound_layer、inbound_layers、node_indices、tensor_indices)147148 if len(input_tensors)== 1:-> 149 output_tensors = to_list(outbound_layer.call(input_tensors [0]、mask = input_masks [0]))150 output_masks = to_list(outbound_layer.compute_mask(input_tensors [0]、input_masks [0]))151#TODO:自動推論しようget_output_shape_forによって例外が発生した場合の形状
/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc in call(self、x、mask)160 strides = self.strides、161 border_mode = self.border_mode、-> 162 dim_ordering = self.dim_ordering)163 return 164
/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc in _pooling_function(self、input、pool_size、strides、border_mode、dim_ordering)210 border_mode、dim_ordering):211 output = K.pool2d(入力、pool_size、ストライド、-> 212 border_mode、dim_ordering、pool_mode = 'max')213 return output 214
/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc in pool2d(x、pool_size、strides、border_mode、dim_ordering、pool_mode)1699 1700 if pool_mode == 'max':-> 1701 x = tf.nn.max_pool(x、pool_size、strides、padding = padding)1702 Elif pool_mode == 'avg':1703
x = tf.nn.avg_pool(x、pool_size、strides、padding = padding)/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc in max_pool(value、ksize、strides、padding、data_format、name)1391 padding = padding、1392
data_format = data_format、-> 1393 name = name)1394 1395/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc in _max_pool(input、ksize、strides、padding、data_format、name)
1593 result = _op_def_lib.apply_op( "MaxPool"、input = input、ksize = ksize、1594 strides = strides、padding = padding、-> 1595 data_format = data_format、name = name)1596 return result 1597/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc in apply_op(self、op_type_name、name、** keywords)747 op = g.create_op(op_type_name、inputs、output_types、 name = scope、748 input_types = input_types、attrs = attr_protos、-> 749 op_def = op_def)750出力= op.outputs 751 return _Restructure(ops.convert_n_to_tensor(outputs)、
/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc in create_op(self、op_type、inputs、dtypes、input_types、name、attrs、op_def、compute_shapes、compute_device)2388
original_op = self._default_original_op、op_def = op_def)2389 compute_shapesの場合:-> 2390 set_shapes_for_outputs(ret)2391 self._add_op(ret)2392
self._record_op_seen_by_control_dependencies(ret)/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc in set_shapes_for_outputs(op)1783 raise RuntimeError( "標準opの形状関数が登録されていません:%s" 1784
%op.type)-> 1785 shapes = shape_func(op)1786 shapeがNoneの場合:1787 raiseErrorError(/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc in call_cpp_shape_fn(op、input_tensors_needed、debug_python_shape_fn)594 status)エラーを除く595エラー:-> 596 raise ValueError (err.message)597 598#output_shapesのTensorShapeProto値を変換します。
ValueError:入力形状:[?、1,112,128]の 'MaxPool_7'(op: 'MaxPool')の1から2を引くことにより、負の次元サイズが発生しました。
github に記載されている回答を引用して、ディメンションの順序を指定する必要があります。
KerasはTheanoまたはTensorflowライブラリのラッパーです。 Kerasは、設定変数_image_dim_ordering
_を使用して、入力レイヤーがTheano形式かTensorflow形式かを判断します。この設定は2つの方法で指定できます-
'tf'
_のように_'th'
_または_~/.keras/keras.json
_を指定してください-_image_dim_ordering: 'th'
_注:これは jsonファイル です。image_dim_ordering
_を次のように指定します:model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
付録:_image_dim_ordering
_ _'th'
_モードでは、チャンネルの次元(深さ)はインデックス1(3、256、256など)にあります)。 _'tf'
_モードでは、インデックス3になります(例:256、256、3)。コメントから@naokoを引用します。
(3、x、y)はinput_shape = x、y、3に変更する必要があるため、入力形状を使用しています
TensorFlowを使用したケラについては、次を試してください。
model.add(ZeroPadding2D((1, 1), input_shape=(img_rows, img_cols, channel)))
受け入れられた答えは機能します。ただし、次のこともできます。
_ model.add(MaxPooling2D((2, 2), name='block1_pool', data_format='channels_last')
_
Kerasは、TensorFlowバックエンドでは_(width, height, channels)
_、Theanoバックエンドでは_(channel, width, height)
_であると想定しています。 input_shape=(3,224,224)
なので、_data_format='channels_last'
_を指定するとうまくいくはずです。
dim_ordering
を追加すると、エラーが解決します:
model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
訓練された[〜#〜] vgg [〜#〜]モデルをロードしているときにも同じ問題が発生しました。そのため、テスト画像の転置を行っただけです。実際のコマンドは次のとおりです。
kerasImage = kerasImage.transpose(1,2,0)