我使用带有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中找到输入形状排序。
答案 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)
(默认情况下)