亲宝软件园·资讯

展开

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

IMWTJ 人气:0

使用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层

出现错误原因

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

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

其他人的处理方法

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

法一:配置.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)

注:此方法适用MaxPooling2D

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 shape:
    - 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 相当于给每一个样本每列的最大值

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

总结

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

加载全部内容

相关教程
猜你喜欢
用户评论