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)
.
我有一个问题,同时还有一个疑问。我想使用 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)
.