Keras 输入形状 ValueError

Keras input shape ValueError

我有一个问题,同时还有一个疑问。我想使用 Theano 作为后端和顺序模型使用 Keras 制作图像分类器。

>>> keras.__version__
'2.0.1'  
>>> theano.__version__
'0.9.0'

我输入的形状:INPUT_SHAPE = (3, 28, 28) #depth, size, size

让我们来解决我的问题。如果我 运行 我的脚本在 Windows 7 32 位,它会给我以下错误:

ValueError: ('The specified size contains a dimension with value <= 0', (-1024, 512))

如果运行它与输入形状:INPUT_SHAPE = (28, 28, 3) #size, size, depth
它在下面给出了这个错误:

ValueError: Error when checking model input: expected conv2d_1_input to have shape (None, 48, 48, 3) but got array with shape (1000, 3, 48, 48)

如果我 运行 Elementary OS 64 位上的代码,它 运行 没有任何问题 (INPUT_SHAPE = (3, 28, 28))。

我的 keras.json 文件 windows 是:

{
  "backend": "theano",
  "epsilon": 1e-07,
  "floatx": "float32",
  "image_dim_ordering": "tf"
}

所以,我的问题是:不同操作系统之间是否存在如此大的差异,或者我的错误在哪里?提醒一下,我为两个系统使用了完全相同的代码。

您遇到的问题与预期的维度排序有关。

  • Tensorflow 排序 (tf):形状预计为 (size_lines,size_columns,channel)
  • Theano 排序 (th):形状预计为 (channel,size_lines,size_columns)

如果您将 keras.json 文件中的排序行更改为 "image_dim_ordering":"th" 它应该可以工作。 (我敢打赌这就是你的小学 OS keras.json)。

如果您的问题还没有解决,请尝试使用: from keras import backend as K K.set_image_dim_ordering('th') 如果你想使用 theano 后端并且必须使用通道优先配置来进行图像维度排序,这会很好用。

要切换到另一个后端,您可以更改位于以下位置的配置文件:

  • Linux: $HOME/.keras/keras.json
  • Windows: %USER_PROFILE%/.keras/keras.json

这是 theano 后端的 keras.json 文件:

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "theano",
    "image_data_format": "channels_first"
}

这是 tensorflow 后端的 keras.json 文件:

{
    "floatx": "float32",
    "epsilon": 1e-07,
    "backend": "tensorflow",
    "image_data_format": "channels_last"
}

这是文档 https://keras.io/backend/image_data_format 属性 的描述:

image_data_format: string, either "channels_last" or "channels_first". It specifies which data format convention Keras will follow. (keras.backend.image_data_format() returns it.)

For 2D data (e.g. image), "channels_last" assumes (rows, cols, channels) while "channels_first" assumes (channels, rows, cols).

For 3D data, "channels_last" assumes (conv_dim1, conv_dim2, conv_dim3, channels) while "channels_first" assumes (channels, conv_dim1, conv_dim2, conv_dim3).