【问题标题】:ValueError: Layer sequential_20 expects 1 inputs, but it received 2 input tensorsValueError: Layersequential_20 需要 1 个输入,但它接收到 2 个输入张量
【发布时间】:2021-07-06 07:42:56
【问题描述】:

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

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

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

完整代码:

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])

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    当我改变时它对我有帮助:
    validation_data=[X_val, y_val] 变成 validation_data=(X_val, y_val)
    其实还是想知道为什么?

    【讨论】:

      【解决方案2】:

      使用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))
      

      【讨论】:

        【解决方案3】:

        如 Keras API 参考 (link) 中所述,

        validation_data:...validation_data 可以是: - Numpy 数组或张量的 tuple (x_val, y_val) - Numpy 数组的 tuple (x_val, y_val, val_sample_weights) - dataset 。 ..

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

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

        【讨论】:

        • 我使用的是 Google Colab,但我在问题中遇到了同样的错误。输入 %tensorflow version 2.x 将 tensorflow 版本固定为 2.0 而不是 2.3,然后它就可以工作了! (使用( 而不是[)。使用 tensorflow 2.3 时如何解决这个问题?简单地更改括号不适用于 tf 2.3
        【解决方案4】:

        在解决方案中,有人说您需要将手镯改为括号,但它在 Colab 中不起作用。是的,将validation_data=[X_val, y_val] 转换为validation_data=(X_val, y_val) 应该可以工作,因为它是必需的格式,但是在 tf==2.5.0(在 Google Colab 中)它不能解决问题。我从功能 API 更改为顺序 API,解决了这个问题。奇怪。

        【讨论】:

          【解决方案5】:

          你已经给出了两次数据而不是标签:

          history = stacked_ae.fit(img_train, img_train, epochs=10,
                                   validation_data=[img_test, img_test])
          

          而不是

          history = stacked_ae.fit(img_train, label_train, epochs=10,
                                   validation_data=[img_test, label_test])
          

          【讨论】:

          • 这是半监督的自动编码器,不是典型的机器学习问题。这就是为什么不需要传递单独的标签。
          • 但这是自动编码器,所以标签不会在模型拟合时传递。
          猜你喜欢
          • 1970-01-01
          • 2020-07-15
          • 1970-01-01
          • 2021-12-20
          • 2021-09-02
          • 2021-07-14
          • 1970-01-01
          • 1970-01-01
          • 2022-09-28
          相关资源
          最近更新 更多