开发者

使用tf.keras.MaxPooling1D出现错误问题及解决

目录
  • 使用tf.keras.MaxPooling1D出现错误
    • 错误如下
    • 首先了解MaxPooling1D
    • 出现错误原因
    • 其他人的处理方法
    • 我的处理方法
  • MaxPooling1D和GlobalMaxPooling1D区别
    • 总结

      使用tf.keras.MaxPooling1D出现错误

      错误如下

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

      首先了解MaxPooling1D

      tf.layers.max_pooling1d(
        inputs,
        pool_size,
        strides,
        padding='valid',
        data_format='channels_last',
        name=None
      )

      用于1维输入的MaxPooling层

      • pool_size:表示pooling window的大小
      • strides:指定pooling操作的步长
      • padding:一个字符串。padding的方法:string,valid或same,大小写不敏感。
      • data_format:一个字符串,channels_last(默认)或channels_first中的一个,输入中维度的排序,chwww.devze.comannels_last对应于具有形状(BATch, length, channels)的输入,而channels_first对应于具有形状(batch, channels, length)的输入。
      • name:一个字符串,表示层的名称。

      出现错误原因

      是图片通道的问题,也就是”channels_last”和”channels_first”数据格式的问题。

      input_shape=(3,28,28)是theano的写法,而tensorflow需要写出:(28,28,3)

      其他人的处理http://www.devze.com方法

      查了很多方法我的问题都没有解决:

      法一:配置.keras下的keras.json文件,将channels_last修改为channels_first

      {
      "image_data_format"编程客栈 : "channels_first",
      "epsilon": 1e-07,
      "floatx": "float32",
      "backend": "tensorflow"
      }

      法二:在运行代码前面加两行代码:

      from keras import backend as K 
      K.set_image_dim_ordering('tf')

      我的处理方法

      直接在出现错误的代码中补充一个参数,加上data_format='channels_first'就可以啦,,

      pool_4 = MaxPooling1D(pool_size=2, name='pool_4',data_format='channels_first')(conv_4)

      注:此方法适用MaxPooling2Djavascript

      MaxPooling1D和GlobalMaxPooling1D区别

      import tensorflow as tf
      
      from tensorflow import keras
      input_shape = (2, 3, 4)
      x = tf.random.normal(input_shape)
      print(x)
      
      y=keras.layers.GlobalMaxPool1D()(x)
      print("*"*20)
      
      print(y)
      '''
        """Global average pooling operation for temporal data.
      
        Examples:
      
        >>>编程客栈 input_shape = (2, 3, 4)
        >>> x = tf.random.normal(input_shape)
        >>> y = tf.keras.layers.GlobalAveragePooling1D()(x)
        >>> print(y.shape)
        (2, 4)
      
        Arguments:
          data_format: A string,
            one of `channels_last` (default) or `channels_first`.
            The ordering of the dimensions in the inputs.
            `channels_last` corresponds to inputs with shape
            `(batch, steps, features)` while `channels_first`
            corresponds to inputs with shape
            `(batch, features, steps)`.
      
        Call arguments:
          inputs: A 3D tensor.
          mask: Binary tensor of shape `(batch_size, steps)` indicating whether
            a given step should be masked (excluded from the average).
      
        Input sha开发者_开发教程pe:
          - If `data_format='channels_last'`:
            3D tensor with shape:
            `(batch_size, steps, features)`
          - If `data_format='channels_first'`:
            3D tensor with shape:
            `(batch_size, features, steps)`
      
        Output shape:
          2D tensor with shape `(batch_size, features)`.
        """
      '''
      
      print("--"*20)
      
      input_shape = (2, 3, 4)
      x = tf.random.normal(input_shape)
      print(x)
      
      y=keras.layers.MaxPool1D(pool_size=2,strides=1)(x)  # strides 不指定 默认等于 pool_size
      print("*"*20)
      
      print(y)
      

      输出如下图 上图GlobalMaxPool1D 相当于给每一个样本每列的最大值

      使用tf.keras.MaxPooling1D出现错误问题及解决

      而MaxPool1D就是普通的对每一个样本进行一个窗口(1D是一维列窗口)滑动取最大值。

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜