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

Sto*_*son 7 python convolution neural-network keras tensorflow

我是从多个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)
Run Code Online (Sandbox Code Playgroud)

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

print(x.shape) => (100, 286, 384)
Run Code Online (Sandbox Code Playgroud)

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

因为我不随意知道样本大小,我本来希望传递一个类似的输入大小

( None, 286, 384, 1 )
Run Code Online (Sandbox Code Playgroud)

该模型构建如下:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
# other steps...
Run Code Online (Sandbox Code Playgroud)

传递为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

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

Wil*_*ren 13

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

请查看以下示例.

很酷的是你也可以使用RGB图像作为输入.只需更改channels为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)
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我错过了重塑部分。通俗地说,对于将来关注此讨论的任何人,在表示数据时,像素值必须是 1 元素数组,因此例如单行像素而不是像 [ 100,101,140,​​ ... ] 必须是[ [100], [101], [140],... ] (5认同)