我想从以下层开始训练深度网络:
model = Sequential()
model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))
使用
history = model.fit_generator(get_training_data(),
samples_per_epoch=1, nb_epoch=1,nb_val_samples=5,
verbose=1,validation_data=get_validation_data()
使用以下生成器:
def get_training_data(self):
while 1:
for i in range(1,5):
image = self.X_train[i]
label = self.Y_train[i]
yield (image,label)
(验证生成器看起来很相似)。
在训练期间,我收到错误:
Error when checking model input: expected convolution2d_input_1 to have 4
dimensions, but got array with shape (32, 32, 3)
如何,第一层
model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))
答案 0 :(得分:34)
您定义的输入形状是单个样本的形状。模型本身需要一些样本数组作为输入(即使它是一个长度为1的数组)。
您的输出确实应该是4-d,第一维用于枚举样本。即对于单个图像,您应该返回(1,32,32,3)的形状。
您可以在" Convolution2D" /"输入形状"
下找到更多信息here答案 1 :(得分:2)
可能非常琐碎,但我通过将输入转换为 numpy array 来解决了。
对于神经网络架构,
model = Sequential()
model.add(Conv2D(32, (5, 5), activation="relu", input_shape=(32, 32, 3)))
输入时,
n_train = len(train_y_raw)
train_X = [train_X_raw[:,:,:,i] for i in range(n_train)]
train_y = [train_y_raw[i][0] for i in range(n_train)]
但是当我将其更改为
n_train = len(train_y_raw)
train_X = np.asarray([train_X_raw[:,:,:,i] for i in range(n_train)])
train_y = np.asarray([train_y_raw[i][0] for i in range(n_train)])
它解决了这个问题。
答案 2 :(得分:1)
在使用mnist数据集时遇到了同样的错误,看起来像是X_train的尺寸问题。我添加了另一个维度,它解决了目的。
X_train,X_test,\ y_train,y_test = train_test_split(X_reshaped, y_labels, train_size = 0.8, random_state = 42)
X_train = X_train.reshape(-1,28,28,1)
X_test = X_test.reshape(-1,28,28,1)
答案 3 :(得分:0)
x_train = x_train.reshape(-1,28, 28, 1) #Reshape for CNN - should work!!
x_test = x_test.reshape(-1,28, 28, 1)
history_cnn = cnn.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
输出:
训练60000个样本,验证10000个样本 时代1/5 60000/60000 [==============================]-157s 3ms / step-损耗:0.0981-acc:0.9692-val_loss :0.0468-val_acc:0.9861 时代2/5 60000/60000 [==============================]-157s 3ms / step-损耗:0.0352-acc:0.9892-val_loss :0.0408-val_acc:0.9879 时代3/5 60000/60000 [==============================]-159s 3ms / step-损耗:0.0242-acc:0.9924-val_loss :0.0291-val_acc:0.9913 时代4/5 60000/60000 [==============================]-165s 3ms / step-损耗:0.0181-acc:0.9945-val_loss :0.0361-val_acc:0.9888 时代5/5 60000/60000 [==============================]-168s 3ms / step-损耗:0.0142-acc:0.9958-val_loss :0.0354-val_acc:0.9906
答案 4 :(得分:0)
添加一个维度非常简单,因此我正在研究Siraj Rawal在CNN代码部署教程上讲授的教程,它在他的终端上运行,但是相同的代码在我的终端上不起作用,所以我对它做了一些研究并解决了,我不知道这是否对所有人都有效。在这里,我想出了解决方案;
未解决的代码行给您带来了问题:
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
print(x_train.shape)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols)
input_shape = (img_rows, img_cols, 1)
已解决的代码:
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
print(x_train.shape)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
如果对您有用,请在此处分享反馈。
答案 5 :(得分:0)
这取决于您实际对数据进行排序的方式,如果首先基于渠道,则应重塑数据: x_train = x_train.reshape(x_train.shape [0],通道,宽度,高度)
如果其频道最后一次: x_train = s_train.reshape(x_train.shape [0],宽度,高度,通道)
答案 6 :(得分:0)
您应该简单地将以下转换应用于输入数据数组。
input_data = input_data.reshape((-1, image_side1, image_side2, channels))
答案 7 :(得分:0)
是的,它接受四个参数的元组, 如果您的训练图像数(或其他)= 6000, 图片尺寸= 28x28 和灰度图像 您将拥有(6000,28,28,1)
最后一个参数对于灰度是1,对于彩色图像是3。
答案 8 :(得分:0)
遇到了同样的问题,没有答案对我有用。经过大量调试后,我发现一个图像的大小小于32
。这会导致数组的尺寸错误和上述错误。
要解决此问题,请确保所有图像具有正确的尺寸。