ValueError:“ conv2d”层的输入0与该层不兼容:预期min_ndim = 4,发现ndim = 3。收到完整的形状:(28,28,1)

发布于 2025-02-08 23:07:08 字数 2318 浏览 4 评论 0原文

我继续获得与输入形状有关的错误。任何帮助将不胜感激。谢谢!

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忘年祭陌 2025-02-15 23:07:08

放轻松,只是input_fn()中的一个小

def input_fn(images, labels, epochs, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices((images, labels))

    SHUFFLE_SIZE = 5000
    # In-place changes do not work so add `dataset = `
    dataset = dataset.shuffle(SHUFFLE_SIZE).repeat(epochs).batch(batch_size)
    dataset = dataset.prefetch(None)

    return dataset

错误。因此,任何就地(例如更改)不起作用。

Take it easy, just a little mistake in input_fn() that cause your problem:

def input_fn(images, labels, epochs, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices((images, labels))

    SHUFFLE_SIZE = 5000
    # In-place changes do not work so add `dataset = `
    dataset = dataset.shuffle(SHUFFLE_SIZE).repeat(epochs).batch(batch_size)
    dataset = dataset.prefetch(None)

    return dataset

P.S.: tf.data.Dataset's methods always return an Iterable obj instead of the original data pipeline. So any In-place like changes do not work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文