(x_train, y_train), (x_test, y_test) = tf.keras.datasets.fashion_mnist.load_data()x_train = x_train.astype('float32') / 255x_test = x_test.astype('float32') / 255x_train.shape #Shape is (60000, 28, 28)然后模型确保输入形状为 28,28,1,因为 60k 是样本。model2 = tf.keras.Sequential()# Must define the input shape in the first layer of the neural networkmodel2.add(tf.keras.layers.Conv2D(filters=64, kernel_size=2, padding='same', activation='relu', input_shape=(28,28,1))) model2.add(tf.keras.layers.MaxPooling2D(pool_size=2))model2.add(tf.keras.layers.Dropout(0.3))model2.add(tf.keras.layers.Conv2D(filters=32, kernel_size=2, padding='same', activation='relu'))model2.add(tf.keras.layers.MaxPooling2D(pool_size=2))model2.add(tf.keras.layers.Dropout(0.3))model2.add(tf.keras.layers.Flatten())model2.add(tf.keras.layers.Dense(256, activation='relu'))model2.add(tf.keras.layers.Dropout(0.5))model2.add(tf.keras.layers.Dense(10, activation='softmax'))model2.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])model2.fit(x_train, y_train, batch_size=64, epochs=25,)我收到错误:ValueError:检查输入时出错:预期 conv2d_19_input 有 4 个维度,但得到了形状为 (60000, 28, 28) 的数组就像每次我尝试理解输入形状时一样,我会更加困惑。就像我在这一点上对 conv2d 和密集的输入形状感到困惑。无论如何,为什么这是错误的?
2 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
是的,这是正确的,参数input_shape
准备取 3 个值。然而,该函数Conv2D
需要一个 4D 数组作为输入,包括:
样本数
通道数
图像宽度
图像高度
而该函数load_data()
是一个由宽度、高度和样本数量组成的 3D 数组。
您可以期望通过简单的重塑来解决该问题:
train_X = train_X.reshape(-1, 28,28, 1) test_X = test_X.reshape(-1, 28,28, 1)
来自 keras 文档的更好定义:
输入形状:4D 张量,形状:(batch,channels,rows,cols)如果 data_format 是“channels_first”或 4D 张量,形状:(batch,rows,cols,channels)如果 data_format 是“channels_last”。
慕尼黑8549860
TA贡献1818条经验 获得超11个赞
您缺少通道维度(值为 1),可以通过重塑数组轻松纠正:
x_train = x_train.reshape((-1, 28, 28, 1)) x_test = x_test.reshape((-1, 28, 28, 1))
添加回答
举报
0/150
提交
取消