我正在尝试使用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])
答案 0 :(得分:12)
当我改变时它对我有帮助:
从Error running query: column "BrandProfile" does not exist LINE 31: ...s"."height" = 760 AND "images"."imageable_type" = "BrandProf... ^
SELECT "brand_profiles"."company_name",
"users"."full_name",
"brand_profiles"."location",
"brand_profiles"."company_website",
"brand_profiles"."description",
"images"."processed_url"
FROM "brand_profiles"
INNER JOIN "users" ON "users"."id" = "brand_profiles"."user_id"
INNER JOIN "images" ON "images"."imageable_id" = "brand_profiles"."id" AND "images"."height" = 760 AND "images"."imageable_type" = "BrandProfile"
WHERE "brand_profiles"."deleted_at" IS NULL
AND "brand_profiles"."marketplace" = true
到validation_data=[X_val, y_val]
其实还是想知道为什么吗?
答案 1 :(得分:6)
我建议您一次性使用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))
答案 2 :(得分:6)
如Keras API参考(link)中所述,
validation_data :... validation_data可能是:-Numpy数组或张量的
tuple
(x_val,y_val)-Numpy的tuple
(x_val,y_val,val_sample_weights)数组-数据集...
因此, validation_data 必须是一个元组,而不是(Numpy数组或张量的)列表。我们应该使用括号({})而不是括号(...)
。
但是,根据我有限的经验,TensorFlow 2.0.0会与方括号的使用无关,但TensorFlow 2.3.0会对此有所抱怨。如果您的脚本在TF 2.3的TF 2.0 intead下运行,那就很好了。
答案 3 :(得分:0)
在解决方案中,有人说您需要将手镯更改为括号,但这在 Colab 中不起作用。是的,将 validation_data=[X_val, y_val]
变成 validation_data=(X_val, y_val)
应该可以工作,因为它是必需的格式,但是在 tf==2.5.0(在 Google Colab 中)它不能解决问题。我从功能 API 更改为顺序 API,解决了问题。奇怪。
答案 4 :(得分:-1)
您两次提供了数据而不是标签:
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])