为“ max_pooling2d_8 / MaxPool”从1中减去3导致的负尺寸大小

时间:2020-01-05 12:07:56

标签: python tensorflow keras

在尝试实现AlexNet来解决GTSRB时,我收到了此错误消息:'max_pooling2d_8 / MaxPool'从1中减去3导致的负尺寸大小 错误位于标有#3的块中

代码:

def buildAlex(width, height, depth, classes, reg=0.0002):
    # initialize the model along with the input shape to be
    # "channels last" and the channels dimension itself
    model = keras.Sequential()
    inputShape = (height, width, depth)
    chanDim = -1

    # Block #1: first CONV => RELU => POOL layer set
    model.add(Conv2D(96, (11, 11), strides=(4, 4),
        input_shape=inputShape, padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #1
    model.add(Dropout(0.25))

    # Block #2: second CONV => RELU => POOL layer set
    model.add(Conv2D(256, (5, 5), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #2
    model.add(Dropout(0.25))

    # Block #3: CONV => RELU => CONV => RELU => CONV => RELU
    model.add(Conv2D(384, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(Conv2D(384, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(Conv2D(256, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #3
    model.add(Dropout(0.25))

    # Block #4: first set of FC => RELU layers
    model.add(Flatten())
    model.add(Dense(4096, kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))

    # Block #5: second set of FC => RELU layers
    model.add(Dense(4096, kernel_regularizer=l2(reg)))
    model.add(Activation("relu"))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))

    # softmax classifier
    model.add(Dense(classes, kernel_regularizer=l2(reg)))
    model.add(Activation("softmax"))

    # return the constructed network architecture
    return model

modelAlex = buildAlex(28, 28, 1, 43)

跟踪:

---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1550   try:
-> 1551     c_op = c_api.TF_FinishOperation(op_desc)
   1552   except errors.InvalidArgumentError as e:

InvalidArgumentError: Negative dimension size caused by subtracting 3 from 1 for 'max_pooling2d_8/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,256].

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-36-7205823f509c> in <module>
----> 1 modelAlex = buildAlex(28, 28, 1, 43)

<ipython-input-35-e4a6adb73a0a> in buildAlex(width, height, depth, classes, reg)
     36     model.add(Activation("relu"))
     37     model.add(BatchNormalization(axis=chanDim))
---> 38     model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #3
     39     model.add(Dropout(0.25))
     40 

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/training/tracking/base.py in _method_wrapper(self, *args, **kwargs)
    456     self._self_setattr_tracking = False  # pylint: disable=protected-access
    457     try:
--> 458       result = method(self, *args, **kwargs)
    459     finally:
    460       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/keras/engine/sequential.py in add(self, layer)
    191       # If the model is being built continuously on top of an input layer:
    192       # refresh its output.
--> 193       output_tensor = layer(self.outputs[0])
    194       if len(nest.flatten(output_tensor)) != 1:
    195         raise TypeError('All layers in a Sequential model '

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/keras/engine/base_layer.py in __call__(self, inputs, *args, **kwargs)
    660                     not base_layer_utils.is_in_eager_or_tf_function()):
    661                   with auto_control_deps.AutomaticControlDependencies() as acd:
--> 662                     outputs = call_fn(inputs, *args, **kwargs)
    663                     # Wrap Tensors in `outputs` in `tf.identity` to avoid
    664                     # circular dependencies.

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/keras/layers/pooling.py in call(self, inputs)
    246         strides=strides,
    247         padding=self.padding.upper(),
--> 248         data_format=conv_utils.convert_data_format(self.data_format, 4))
    249     return outputs
    250 

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/ops/nn_ops.py in max_pool(value, ksize, strides, padding, data_format, name, input)
   3750         padding=padding,
   3751         data_format=data_format,
-> 3752         name=name)
   3753 
   3754 

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/ops/gen_nn_ops.py in max_pool(input, ksize, strides, padding, data_format, name)
   5670   _, _, _op = _op_def_lib._apply_op_helper(
   5671         "MaxPool", input=input, ksize=ksize, strides=strides, padding=padding,
-> 5672                    data_format=data_format, name=name)
   5673   _result = _op.outputs[:]
   5674   _inputs_flat = _op.inputs

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/op_def_library.py in _apply_op_helper(self, op_type_name, name, **keywords)
    786         op = g.create_op(op_type_name, inputs, dtypes=None, name=scope,
    787                          input_types=input_types, attrs=attr_protos,
--> 788                          op_def=op_def)
    789       return output_structure, op_def.is_stateful, op
    790 

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/func_graph.py in create_op(***failed resolving arguments***)
    463     return super(FuncGraph, self).create_op(
    464         op_type, inputs, dtypes, input_types, name, attrs, op_def,
--> 465         compute_device=compute_device)
    466 
    467   def capture(self, tensor, name=None):

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/util/deprecation.py in new_func(*args, **kwargs)
    505                 'in a future version' if date is None else ('after %s' % date),
    506                 instructions)
--> 507       return func(*args, **kwargs)
    508 
    509     doc = _add_deprecated_arg_notice_to_docstring(

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in create_op(***failed resolving arguments***)
   3294           input_types=input_types,
   3295           original_op=self._default_original_op,
-> 3296           op_def=op_def)
   3297       self._create_op_helper(ret, compute_device=compute_device)
   3298     return ret

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in __init__(self, node_def, g, inputs, output_types, control_inputs, input_types, original_op, op_def)
   1712           op_def, inputs, node_def.attr)
   1713       self._c_op = _create_c_op(self._graph, node_def, grouped_inputs,
-> 1714                                 control_input_ops)
   1715 
   1716     # Initialize self._outputs.

~/Documents/Environments/my_env/lib/python3.7/site-packages/tensorflow/python/framework/ops.py in _create_c_op(graph, node_def, inputs, control_inputs)
   1552   except errors.InvalidArgumentError as e:
   1553     # Convert to ValueError for backwards compatibility.
-> 1554     raise ValueError(str(e))
   1555 
   1556   return c_op

ValueError: Negative dimension size caused by subtracting 3 from 1 for 'max_pooling2d_8/MaxPool' (op: 'MaxPool') with input shapes: [?,1,1,256].

1 个答案:

答案 0 :(得分:1)

好吧,不是吗?

原始AlexNet在(224,224,3)尺寸的图像上运行。在这里,您传递的(28,28,1)很小。错误的意思是,在模型中不远处,它以input size < 0结尾。更具体地说,这是缩小输出尺寸(height, width)的方式。

               (28, 28)
                   |
                   V
    model.add(Conv2D(96, (11, 11), strides=(4, 4), ...)
                   |
                   V
                (7, 7)
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #1
                   |
                   V
                (3, 3)
    model.add(Conv2D(256, (5, 5), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #2
                   |
                   V
                (1, 1)

    model.ad(Dropout(0.25))

    # Block #3: CONV => RELU => CONV => RELU => CONV => RELU
    # Block #3: CONV => RELU => CONV => RELU => CONV => RELU
    model.add(Conv2D(384, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Conv2D(384, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
    model.add(Conv2D(256, (3, 3), padding="same",
        kernel_regularizer=l2(reg)))
(Error) --->model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) #3
    model.add(Dropout(0.25))

在这里,最后一个MaxPooling2D层无法在(1,1)尺寸的图像上以步幅2进行操作。因此错误。另外请记住,MaxPooling2D默认具有padding='valid'

补救措施:

  • 增加输入大小,
  • 摆脱一些Maxpooling2D层。