Estoy tratando de construir un Autoencoder simple usando el conjunto de datos KMNIST de Tensorflow y un código de muestra de un libro de texto que estoy usando, pero sigo recibiendo un error cuando intento ajustar el modelo.
El error dice ValueError: Layer sequential_20 expects 1 inputs, but it received 2 input tensors.
Soy realmente nuevo en TensorFlow, y toda mi investigación sobre este error me ha desconcertado, ya que parece involucrar cosas que no están en mi código. Este hilo no fue útil ya que solo estoy usando capas secuenciales.
Código completo:
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])En las soluciones, algunos dicen que necesita cambiar de brazalete a paréntesis, pero no funcionaba en Colab. Y sí, convertir validation_data=[X_val, y_val] en validation_data=(X_val, y_val) debería funcionar ya que es un formato requerido, pero en tf==2.5.0 (en Google Colab) no resuelve el problema. Cambié de API funcional a API secuencial, eso soluciona el problema. Extraño.
Ha proporcionado datos en lugar de etiquetas dos veces:
history = stacked_ae.fit(img_train, img_train, epochs=10, validation_data=[img_test, img_test])en lugar de
history = stacked_ae.fit(img_train, label_train, epochs=10, validation_data=[img_test, label_test])Use validation_data=(img_test, img_test) en lugar de validation_data=[img_test, img_test]
Aquí el ejemplo con codificador y decodificador combinados:
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))me ayudó cuando cambié:
validation_data=[X_val, y_val] en validation_data=(X_val, y_val)
En realidad todavía me pregunto por qué?
Como se indica en la referencia de la API de Keras ( enlace ),
datos_de_validación : ... los datos_de_validación podrían ser: -
tuple(x_val, y_val) de matrices o tensores Numpy -tuple(x_val, y_val, val_sample_weights) de matrices Numpy - conjunto de datos ...
Entonces, validation_data tiene que ser una tupla en lugar de una lista (de matrices o tensores Numpy). Deberíamos usar paréntesis (corchetes) (...) , no corchetes [...] .
Sin embargo, según mi experiencia limitada, TensorFlow 2.0.0 sería indiferente al uso de corchetes, pero TensorFlow 2.3.0 se quejaría de ello . Su secuencia de comandos estaría bien si se ejecuta bajo TF 2.0 en lugar de TF 2.3.