繁体   English   中英

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

[英]ValueError: Input 0 of layer "conv2d" is incompatible with the layer: expected min_ndim=4, found ndim=3. Full shape received: (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))

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

放轻松,只是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

PS:tf.data.Dataset 的方法总是返回一个Iterable obj 而不是原始数据管道。 因此,任何In-place like更改都不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM