我是从多个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
答案 0 :(得分:11)
将input_shape
设置为(286,384,1)。现在模型需要一个4维的输入。这意味着您必须使用.reshape(n_images, 286, 384, 1)
重塑图像。现在,您已添加了额外的维度而未更改数据,您的模型已准备好运行。基本上,您需要将数据重新整形为(n_images
,x_shape
,y_shape
,n_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)
我认为以下可能会解决您的错误。
我们提供给第一个conv2d(顺序模型的第一层)的input_shape应该是(286,384,1)或(宽度,高度,通道)。对于batch_size,不需要“无”维度。
输入的形状可以是(batch_size,286,384,1)
这对你有帮助吗??