在 keras 中为 (60000, 28, 28) 数组定义输入形状时出错
Error defining an input shape in keras for (60000, 28, 28) array
我正在使用 keras 和 tensorflow 建立我的第一个神经网络。我将我的输入输入到一个形状数组 (60000, 28, 28) 中,但是当我尝试将其提供给模型时,出现输入形状错误的错误。
我尝试了多种不同的输入形状,包括 (60000, 28, 28) (1, 28, 28) (28, 28) (28, 28, 1) 但 none 似乎有效.
model = kr.Sequential()
model.add(InputLayer(input_shape=(60000, 28, 28)))
model.add(Dense(units=784, activation='relu'))
model.add(Dense(units=392, activation='relu'))
model.add(Dense(units=196, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
training = model.fit(x=images_array, y=labels_array, epochs=10, batch_size=256)
我希望它适用于输入形状 (60000, 28, 28),但我总是收到此错误:
ValueError: Error when checking input: expected input_1 to have 4
dimensions, but got array with shape (60000, 28, 28)
编辑:
感谢所有回答的人。 cho_uc 答案确实有效,这就是我接受它的原因。
我应该在 post 中提到的是,我正在尝试构建一个仅由 Dense 层组成的模型,因此我可以将其用作未来模型的基准。
我解决了输入层问题:
images_array = images_array.reshape(-1, 28 * 28)
model.add(InputLayer(input_shape=(784, )))
Keras Conv2D
层执行卷积运算。它要求它的输入是一个 4 维数组。
我们必须根据您的设置和后端(theano 或 tensorlow 图像布局约定)将输入重塑为 ( , 1, 28, 28) 或可能为 ( , 28, 28, 1)。
from keras import backend as K
if K.image_data_format() == 'channels_first' :
input_shape = (1, 28, 28)
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
else:
input_shape = (28, 28, 1)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
因此,您应该将数据重塑为 (60000, 28, 28, 1) 或 (60000, 1, 28, 28)
需要更正两次。
- TF 和 Keras 期望图像尺寸为(宽度、高度、通道),RGB 图像的通道为 3,灰度图像的通道为 1。
model.add(InputLayer(input_shape=(28, 28, 1)))
fit()
方法的训练输入必须具有维度(样本数、宽度、高度、通道)。
assert images_array.shape == (60000, 28, 28, 1)
我正在使用 keras 和 tensorflow 建立我的第一个神经网络。我将我的输入输入到一个形状数组 (60000, 28, 28) 中,但是当我尝试将其提供给模型时,出现输入形状错误的错误。
我尝试了多种不同的输入形状,包括 (60000, 28, 28) (1, 28, 28) (28, 28) (28, 28, 1) 但 none 似乎有效.
model = kr.Sequential()
model.add(InputLayer(input_shape=(60000, 28, 28)))
model.add(Dense(units=784, activation='relu'))
model.add(Dense(units=392, activation='relu'))
model.add(Dense(units=196, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='Adam', metrics=['accuracy'])
training = model.fit(x=images_array, y=labels_array, epochs=10, batch_size=256)
我希望它适用于输入形状 (60000, 28, 28),但我总是收到此错误:
ValueError: Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (60000, 28, 28)
编辑:
感谢所有回答的人。 cho_uc 答案确实有效,这就是我接受它的原因。 我应该在 post 中提到的是,我正在尝试构建一个仅由 Dense 层组成的模型,因此我可以将其用作未来模型的基准。
我解决了输入层问题:
images_array = images_array.reshape(-1, 28 * 28)
model.add(InputLayer(input_shape=(784, )))
Keras Conv2D
层执行卷积运算。它要求它的输入是一个 4 维数组。
我们必须根据您的设置和后端(theano 或 tensorlow 图像布局约定)将输入重塑为 ( , 1, 28, 28) 或可能为 ( , 28, 28, 1)。
from keras import backend as K
if K.image_data_format() == 'channels_first' :
input_shape = (1, 28, 28)
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
else:
input_shape = (28, 28, 1)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
因此,您应该将数据重塑为 (60000, 28, 28, 1) 或 (60000, 1, 28, 28)
需要更正两次。
- TF 和 Keras 期望图像尺寸为(宽度、高度、通道),RGB 图像的通道为 3,灰度图像的通道为 1。
model.add(InputLayer(input_shape=(28, 28, 1)))
fit()
方法的训练输入必须具有维度(样本数、宽度、高度、通道)。
assert images_array.shape == (60000, 28, 28, 1)