Keras输入形状排序是(宽度,高度,ch)?

时间:2017-09-04 03:03:42

标签: tensorflow keras

我使用带有TensorFlow的Keras2作为后端,并尝试将水平矩形图像(宽度:150 x高度:100 x ch:3)添加到网络中。

我使用cv2预处理图像和cv2& TensorFlow将图像的形状视为[ height,width,ch ]排序(在我的情况下,,它是[100,150,3] 这种格式相反of (宽度:150 x高度:100 x ch:3),但不是错误。)

所以我将Keras模型API输入定义为以下代码,但它发生了错误。

img = cv2.imread('input/train/{}.jpg'.format(id))
img = cv2.resize(img, (100, 150))

inputs = Input(shape=(100, 150, 3))
x = Conv2D(8, (3, 3), padding='same', kernel_initializer='he_normal')(inputs)
~~~

错误信息在

之下
ValueError: Error when checking input: expected input_4 to have shape
(None, 100, 150, 3) but got array with shape (4, 150, 100, 3)

顺便说一句input = Input((150, 100, 3))可以运行。

我对Keras与他之间的差异感到奇怪。 TensorFlow,所以我怀疑它没有发生错误,它无法正常工作。

任何人都可以解释一下吗?我无法在Keras Document中找到输入形状排序。

3 个答案:

答案 0 :(得分:2)

您可以根据需要更改尺寸排序。 您可以打印和更改尺寸顺序,如下所示:

from keras import backend as K
print(K.image_data_format()) # print current format
K.set_image_data_format('channels_last') # set format

如果您想永久更改维度排序,则应在keras.json文件中进行修改,通常位于~/.keras/keras.json

"image_data_format": "channels_last"

答案 1 :(得分:2)

我的问题出现在cv2.resize()参数的宽度和高度的顺序上。 cv2.resize()接受类似cv2.resize(img, (width, height))的参数,而numpy则处理(高度,宽度)的图像数组顺序。

答案 2 :(得分:0)

取自https://keras.io/api/layers/convolution_layers/convolution2d/

参数

...

数据格式:字符串,channels_last(默认)或 Channels_first。输入中尺寸的顺序。 channels_last对应于形状为(batch_size,height, 宽度,通道),而channels_first对应于具有形状的输入 (batch_size,通道,高度,宽度)。默认为 在您的Keras配置文件中找到的image_data_format值位于 〜/ .keras / keras.json。如果您从未设置,那么它将是 channels_last。

...

就是这样:(batch_size, height, width, channels)(默认情况下)