ValueError:“ conv2d”层的输入0与该层不兼容:预期min_ndim = 4,发现ndim = 3。收到完整的形状:(28,28,1)
我继续获得与输入形状有关的错误。任何帮助将不胜感激。谢谢!
import tensorflow as tf
import numpy as np
import os
import time
LABEL_DIMENSION = 10
(X_train, Y_train), (X_test, Y_test) = tf.keras.datasets.fashion_mnist.load_data()
Training_size = len(X_train)
Test_size = len(X_test)
X_train = np.asarray(X_train, dtype=np.float32)/255
X_train = X_train.reshape((Training_size, 28, 28, 1))
X_test = np.asarray(X_test, dtype=np.float32)/255
X_test = X_test.reshape((Test_size, 28, 28, 1))
Y_train = tf.keras.utils.to_categorical(Y_train, LABEL_DIMENSION)
Y_test = tf.keras.utils.to_categorical(Y_test, LABEL_DIMENSION)
Y_train = Y_train.astype(np.float32)
Y_test = Y_test.astype(np.float32)
inputs= tf.keras.Input(shape=(28, 28, 1))
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(inputs)
x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu")(x)
x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu")(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(64, activation="relu")(x)
predictions = tf.keras.layers.Dense(LABEL_DIMENSION, activation="softmax")(x)
model = tf.keras.Model(inputs=inputs, outputs=predictions)
model.summary()
optim = tf.keras.optimizers.SGD()
model.compile(loss="categorical_crossentropy", optimizer=optim, metrics=["accuracy"])
strategy = None
#strategy = tf.distribute.MirroredStrategy()
configs = tf.estimator.RunConfig(train_distribute=strategy)
estimator = tf.keras.estimator.model_to_estimator(model, config=configs)
def input_fn(images, labels, epochs, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((images, labels))
SHUFFLE_SIZE = 5000
dataset.shuffle(SHUFFLE_SIZE).repeat(epochs).batch(batch_size)
dataset = dataset.prefetch(None)
return dataset
BATCH_SIZE = 512
EPOCHS = 50
estimator_train_result = estimator.train(input_fn=lambda: input_fn(X_train, Y_train, epochs=EPOCHS, batch_size=BATCH_SIZE))
print(estimator_train_result)
estimator.evaluate(lambda: input_fn(X_test, Y_test, epochs=1, batch_size=BATCH_SIZE))
value error:“ conv2d”层的输入0与图层不兼容:预期min_ndim = 4,发现ndim = 3。收到完整的形状:(28,28,1)
I keep on getting this error related to input shape. Any help would be highly appreciated. Thanks!
import tensorflow as tf
import numpy as np
import os
import time
LABEL_DIMENSION = 10
(X_train, Y_train), (X_test, Y_test) = tf.keras.datasets.fashion_mnist.load_data()
Training_size = len(X_train)
Test_size = len(X_test)
X_train = np.asarray(X_train, dtype=np.float32)/255
X_train = X_train.reshape((Training_size, 28, 28, 1))
X_test = np.asarray(X_test, dtype=np.float32)/255
X_test = X_test.reshape((Test_size, 28, 28, 1))
Y_train = tf.keras.utils.to_categorical(Y_train, LABEL_DIMENSION)
Y_test = tf.keras.utils.to_categorical(Y_test, LABEL_DIMENSION)
Y_train = Y_train.astype(np.float32)
Y_test = Y_test.astype(np.float32)
inputs= tf.keras.Input(shape=(28, 28, 1))
x = tf.keras.layers.Conv2D(filters=32, kernel_size=(3, 3), activation="relu")(inputs)
x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu")(x)
x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)
x = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), activation="relu")(x)
x = tf.keras.layers.Flatten()(x)
x = tf.keras.layers.Dense(64, activation="relu")(x)
predictions = tf.keras.layers.Dense(LABEL_DIMENSION, activation="softmax")(x)
model = tf.keras.Model(inputs=inputs, outputs=predictions)
model.summary()
optim = tf.keras.optimizers.SGD()
model.compile(loss="categorical_crossentropy", optimizer=optim, metrics=["accuracy"])
strategy = None
#strategy = tf.distribute.MirroredStrategy()
configs = tf.estimator.RunConfig(train_distribute=strategy)
estimator = tf.keras.estimator.model_to_estimator(model, config=configs)
def input_fn(images, labels, epochs, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((images, labels))
SHUFFLE_SIZE = 5000
dataset.shuffle(SHUFFLE_SIZE).repeat(epochs).batch(batch_size)
dataset = dataset.prefetch(None)
return dataset
BATCH_SIZE = 512
EPOCHS = 50
estimator_train_result = estimator.train(input_fn=lambda: input_fn(X_train, Y_train, epochs=EPOCHS, batch_size=BATCH_SIZE))
print(estimator_train_result)
estimator.evaluate(lambda: input_fn(X_test, Y_test, epochs=1, batch_size=BATCH_SIZE))
ValueError: Input 0 of layer "conv2d" is incompatible with the layer: expected min_ndim=4, found ndim=3. Full shape received: (28, 28, 1)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
放轻松,只是
input_fn()
中的一个小错误。因此,任何
就地(例如
更改)不起作用。Take it easy, just a little mistake in
input_fn()
that cause your problem:P.S.: tf.data.Dataset's methods always return an
Iterable
obj instead of the original data pipeline. So anyIn-place like
changes do not work.