Keras input_shape用于conv2d和手动加载的图像

时间:2017-05-10 14:41:56

标签: python tensorflow neural-network keras convolution

我是从多个384x286 b / w图像中手动创建数据集的。

我加载了这样的图片:

x = []
for f in files:
        img = Image.open(f)
        img.load()
        data = np.asarray(img, dtype="int32")
        x.append(data)
x = np.array(x)

这导致x是一个数组(num_samples,286,384)

print(x.shape) => (100, 286, 384)

阅读keras文档,并检查我的后端,我应该向卷积步骤提供由(行,列,通道)组成的input_shape

因为我不会随意知道样本大小,所以我原本希望将其作为输入大小传递,类似于

( None, 286, 384, 1 )

模型构建如下:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
# other steps...

传递为input_shape(286,384,1)会导致:

  

检查输入时出错:预期conv2d_1_input有4个维度,但得到的数组有形状(85,286,384)

传递as_input_shape(无,286,384,1)会导致:

  

输入0与图层conv2d_1不兼容:预期ndim = 4,发现ndim = 5

我在做错了什么?我如何重塑输入数组?

3 个答案:

答案 0 :(得分:11)

input_shape设置为(286,384,1)。现在模型需要一个4维的输入。这意味着您必须使用.reshape(n_images, 286, 384, 1)重塑图像。现在,您已添加了额外的维度而未更改数据,您的模型已准备好运行。基本上,您需要将数据重新整形为(n_imagesx_shapey_shapen_steps)。

检查以下示例。

很酷的是你也可以使用RGB图像作为输入。只需将n_steps更改为3。

import numpy as np
from keras.models import Sequential
from keras.layers.convolutional import Convolution2D
from keras.layers.core import Flatten, Dense, Activation
from keras.utils import np_utils

#Create model
model = Sequential()
model.add(Convolution2D(32, kernel_size=(3, 3), activation='relu', input_shape=(286,384,1)))
model.add(Flatten())
model.add(Dense(2))
model.add(Activation('softmax'))

model.compile(loss='binary_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])

#Create random data
n_images=100
data = np.random.randint(0,2,n_images*286*384)
labels = np.random.randint(0,2,n_images)
labels = np_utils.to_categorical(list(labels))

#add dimension to images
data = data.reshape(n_images,286,384,1)

#Fit model
model.fit(data, labels, verbose=1)

答案 1 :(得分:1)

你的input_shape维度是正确的,即input_shape(286,384,1)

将您的input_image重塑为4D [batch_size,img_height,img_width,number_of_channels]

input_image=input_image.reshape(85,286, 384,1)

期间的

model.fit(input_image,label)

答案 2 :(得分:0)

我认为以下可能会解决您的错误。

  1. 我们提供给第一个conv2d(顺序模型的第一层)的input_shape应该是(286,384,1)或(宽度,高度,通道)。对于batch_size,不需要“无”维度。

  2. 输入的形状可以是(batch_size,286,384,1)

  3. 这对你有帮助吗??