【问题标题】:Keras: ValueError: Negative dimension size caused by subtracting 5 from 1Keras:ValueError:由1减去5引起的负尺寸大小
【发布时间】:2018-04-29 16:35:20
【问题描述】:

当我尝试定义我的模型时,我收到以下错误消息:ValueError: Negative dimension size caused by subtracting 5 from 1 for 'conv2d_19/convolution' (op: 'Conv2D') with input shapes: [?,1,1,32], [5,5,32,64].

这里是重现问题的代码 sn-p:

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D, AveragePooling2D
import numpy as np

nb_filters = 32
batch_size = 128
epochs = 5
nb_classes = 10

pool_size = (3, 3)
kernel_size = (5, 5)

img_rows = 32
img_cols = 32

input_shape = (img_rows, img_cols, 1)

model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size,
                        input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Convolution2D(nb_filters, kernel_size))
model.add(Activation('relu'))
model.add(AveragePooling2D(pool_size=pool_size))
model.add(Convolution2D(nb_filters*2, kernel_size))
model.add(Activation('relu'))
model.add(AveragePooling2D(pool_size=pool_size))
model.add(Flatten())
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

该问题已在 MacOS、Python 2.7.11 和 Keras 2.1.1 上观察到。

我构建模型的方式有什么问题吗?

这是我要构建的架构:

  1. 具有 32 个大小为 5 × 5 的滤波器、3 × 3 区域的最大池化和 ReLU 激活的卷积层
  2. 具有 32 个大小为 5 × 5 的滤波器、ReLU 激活和 3 × 3 区域的平均池化的卷积层
  3. 具有 64 个大小为 5 × 5 的滤波器、ReLU 激活和 3 × 3 区域的平均池化的卷积层
  4. 使用 softmax 的全连接层。

【问题讨论】:

  • 请指定输入形状..
  • 输入形状在代码 sn-p 中给出,为 (32, 32, 1)。你是说输入形状吗?
  • 你在使用 tensorflow 后端吗?
  • 是 tensorflow==1.4.0
  • 你使用的是 RGB 图像,对吗?还是灰度。?

标签: python keras


【解决方案1】:

对于模型中应用的所有池,您的输入形状太小了。

让我们看看你的模型:

model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size, input_shape=input_shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Convolution2D(nb_filters, kernel_size))
model.add(Activation('relu'))
model.add(AveragePooling2D(pool_size=pool_size))

直到这里一切都很好。 AveragePooling2D 层的输出形状为 (1, 1, 32)。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 28, 28, 32)        832       
_________________________________________________________________
activation_1 (Activation)    (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 9, 9, 32)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 5, 5, 32)          25632     
_________________________________________________________________
activation_2 (Activation)    (None, 5, 5, 32)          0         
_________________________________________________________________
average_pooling2d_1 (Average (None, 1, 1, 32)          0         
=================================================================

现在您想应用另一个内核大小为 3 的 Convolution2D 层,尽管最后一层的输出仅为 (1, 1, 32)。所以你想学习一个大小为 (3, 3) 的内核,它实际上比你想学习它的数据要小。

现在您可以增加数据的输入形状((79, 79, ?) 是适用于您的模型的最小形状)或更改您的模型。

  • 减小池大小
  • 通过向卷积层添加 padding='same' 来应用填充
  • 减少你的模型

干杯

【讨论】:

  • 好点。我应该使用 model.summary() 来检查图层的形状。
猜你喜欢
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2020-07-12
  • 2018-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多