ValueError:层顺序_20 需要 1 个输入,但它收到 2 个输入张量

mim*_*yoo 28 python machine-learning deep-learning keras tensorflow

我正在尝试使用来自 Tensorflow 的 KMNIST 数据集和我正在使用的教科书中的一些示例代码构建一个简单的自动编码器,但是当我尝试拟合模型时,我不断收到错误消息。

错误说 ValueError: Layer sequential_20 expects 1 inputs, but it received 2 input tensors.

我对 TensorFlow 真的很陌生,我对这个错误的所有研究都让我感到困惑,因为它似乎涉及我的代码中没有的东西。 这个线程没有帮助,因为我只使用顺序层。

完整代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras
import tensorflow_datasets as tfds
import pandas as pd
import matplotlib.pyplot as plt

#data = tfds.load(name = 'kmnist')

(img_train, label_train), (img_test, label_test) = tfds.as_numpy(tfds.load(
    name = 'kmnist',
    split=['train', 'test'],
    batch_size=-1,
    as_supervised=True,
))

img_train = img_train.squeeze()
img_test = img_test.squeeze()

## From Hands on Machine Learning Textbook, chapter 17

stacked_encoder = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dense(100, activation="selu"),
    keras.layers.Dense(30, activation="selu"),
])

stacked_decoder = keras.models.Sequential([
    keras.layers.Dense(100, activation="selu", input_shape=[30]),
    keras.layers.Dense(28 * 28, activation="sigmoid"),
    keras.layers.Reshape([28, 28])
])

stacked_ae = keras.models.Sequential([stacked_encoder, stacked_decoder])
stacked_ae.compile(loss="binary_crossentropy",
                   optimizer=keras.optimizers.SGD(lr=1.5))

history = stacked_ae.fit(img_train, img_train, epochs=10,
                         validation_data=[img_test, img_test])
Run Code Online (Sandbox Code Playgroud)

小智 30

当我改变时它帮助了我:
validation_data=[X_val, y_val] 变成validation_data=(X_val, y_val)
实际上仍然不知道为什么?


Mar*_*ani 13

使用validation_data=(img_test, img_test)代替validation_data=[img_test, img_test]

这是将编码器和解码器组合在一起的示例:

stacked_ae = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dense(100, activation="selu"),
    keras.layers.Dense(30, activation="selu"),
    keras.layers.Dense(100, activation="selu"),
    keras.layers.Dense(28 * 28, activation="sigmoid"),
    keras.layers.Reshape([28, 28])
])

stacked_ae.compile(loss="binary_crossentropy",
                   optimizer=keras.optimizers.SGD(lr=1.5))

history = stacked_ae.fit(img_train, img_train, epochs=10,
                         validation_data=(img_test, img_test))
Run Code Online (Sandbox Code Playgroud)


Li-*_*uan 12

正如 Keras API 参考(链接)中所述,

validation_data : ... validation_data 可以是: - tuple(x_val, y_val) of Numpy arrays or tupletensors - (x_val, y_val, val_sample_weights) of Numpy arrays - dataset ...

因此,validation_data必须是一个元组而不是一个列表(Numpy 数组或张量)。我们应该使用括号(圆括号)(...),而不是方括号[...]

然而,根据我有限的经验,TensorFlow 2.0.0 对方括号的使用会无动于衷,但 TensorFlow 2.3.0 会抱怨它。如果您的脚本在 TF 2.0 而不是 TF 2.3 下运行,它会很好。