【发布时间】:2017-02-10 10:45:50
【问题描述】:
我正在尝试在 keras 中复制 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(最近调用 最后)在() 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 在 add(self, 层) 306 输出形状=[self.输出[0]._keras_shape]) 307 其他: --> 308 output_tensor = layer(self.outputs[0]) 309 如果类型(输出张量)是列表: 310 raise Exception('顺序模型中的所有层'
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 在 调用(自我、x、面具) 512 如果入站层: 513 # 如果需要,这将调用 layer.build() --> 514 self.add_inbound_node(inbound_layers, node_indices, tensor_indices) 第515章 第516章
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 在 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章
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc 在 create_node(cls, outbound_layer, inbound_layers, node_indices, 张量索引) 147 148 如果 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 呼叫(自我,x,面具) 160 步=self.strides, 第161章 --> 162 dim_ordering=self.dim_ordering) 163返回输出 164
/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc _pooling_function(self,inputs,pool_size,strides,border_mode,dim_ordering) 210 边界模式,暗淡排序): 211 输出 = K.pool2d(输入,池大小,步幅, --> 212 边界模式,dim_ordering,pool_mode='max') 213返回输出 214
/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc 在 pool2d(x,pool_size,strides,border_mode,dim_ordering,pool_mode) 1699 1700 如果 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 在 max_pool(值,ksize,步幅,填充,data_format,名称)1391 填充=填充,1392
数据格式=数据格式, -> 1393 姓名=姓名)1394 1395/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc 在 _max_pool(输入,ksize,步幅,填充,data_format,名称)
第1593章 ksize=ksize, 1594 strides=strides, 填充=填充, -> 1595 data_format=data_format, name=name) 1596 返回结果 1597/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc 在 apply_op(self, op_type_name, name, **keywords) 第747章 第748章 --> 749 op_def=op_def) 750 个输出 = op.outputs 第751章
/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc 在 create_op(self, op_type, 输入, dtypes, input_types, name, attrs, op_def、compute_shapes、compute_device) 2388
original_op=self._default_original_op, op_def=op_def) 2389 如果 计算形状: -> 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 在 set_shapes_for_outputs(op) 1783 中引发 RuntimeError("否 为标准操作注册的形状函数:%s" 1784
% 操作类型) -> 1785 形状 = shape_func(op) 1786 如果形状为无:1787 引发 RuntimeError(/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc 在 call_cpp_shape_fn(op, input_tensors_needed, debug_python_shape_fn) 594状态) 595 除了错误。InvalidArgumentError 作为错误: --> 596 引发 ValueError(err.message) 597 598 # 在 output_shapes 中转换 TensorShapeProto 值。
ValueError:由 1 减去 2 导致的负维度大小 'MaxPool_7'(操作:'MaxPool'),输入形状:[?,1,112,128]。
【问题讨论】:
标签: python neural-network tensorflow deep-learning keras