Мне удалось воспроизвести вашу ошибку, используя приведенный ниже код. Ошибка не связана с множественным вводом / выводом на Keras. Эта ошибка появляется, когда мы передаем входные данные как list of array
, array of list
или dict
типу model.fit()
. Я использую tensorflow version 2.2.0
.
Код для воспроизведения ошибки -
import numpy as np
import tensorflow as tf
from tensorflow import keras
data_a = [300, 455, 350, 560, 700, 800, 200, 250]
labels = [455, 350, 560, 700, 800, 200, 250, 300]
data_a = np.reshape(data_a, (8, 1, 1))
inputs = keras.layers.Input(shape=(1, 1))
x = keras.layers.Dense(40, activation='relu')(inputs)
output = keras.layers.Dense(1, activation='sigmoid')(x)
model = keras.models.Model(inputs=inputs, outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(data_a,labels, epochs=10, steps_per_epoch=4)
Вывод -
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-85-2b4ecdfa5a74> in <module>()
17 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
18
---> 19 model.fit(data_a,labels, epochs=10, steps_per_epoch=4)
3 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/data_adapter.py in select_data_adapter(x, y)
961 "Failed to find data adapter that can handle "
962 "input: {}, {}".format(
--> 963 _type_name(x), _type_name(y)))
964 elif len(adapter_cls) > 1:
965 raise RuntimeError(
ValueError: Failed to find data adapter that can handle input: <class 'numpy.ndarray'>, (<class 'list'> containing values of types {"<class 'int'>"})
Также, если вы передадите данные как list of arrays
, как показано ниже -
data_a = [np.array(300), np.array(455), np.array(350), np.array(560), np.array(700), np.array(800), np.array(200), np.array(250)]
, вы получите ошибку как -
ValueError: Failed to find data adapter that can handle input: (<class 'list'> containing values of types {"<class 'numpy.ndarray'>"}), (<class 'list'> containing values of types {"<class 'int'>"}).
Также, если вы передадите данные как тип dict -
data_a = {'a':300, 'b':455, 'c':350, 'd':560, 'e':700, 'f':800, 'g':200, 'h':250}
, то вы получите ошибку как -
ValueError: Failed to find data adapter that can handle input: (<class 'dict'> containing {"<class 'str'>"} keys and {"<class 'int'>"} values), (<class 'list'> containing values of types {"<class 'int'>"})
Решение - Ошибка была исправлена, когда я преобразовал данные в тот же тип - array of array
или list of list
.
Изменено,
data_a = [300, 455, 350, 560, 700, 800, 200, 250]
labels = [455, 350, 560, 700, 800, 200, 250, 300]
до
data_a = np.array([300, 455, 350, 560, 700, 800, 200, 250])
labels = np.array([455, 350, 560, 700, 800, 200, 250, 300])
Фиксированный код -
import numpy as np
import tensorflow as tf
from tensorflow import keras
data_a = np.array([300, 455, 350, 560, 700, 800, 200, 250])
labels = np.array([455, 350, 560, 700, 800, 200, 250, 300])
data_a = np.reshape(data_a, (8, 1, 1))
inputs = keras.layers.Input(shape=(1, 1))
x = keras.layers.Dense(40, activation='relu')(inputs)
output = keras.layers.Dense(1, activation='sigmoid')(x)
model = keras.models.Model(inputs=inputs, outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(data_a,labels, epochs=10, steps_per_epoch=4, verbose=0)
print("Ran Successfully")
Выход -
Ran Successfully
Также, чтобы ответить на ваш другой вопрос,
Если я не ошибаюсь, я считаю, что Сеть не принимает одну горячую кодировку в качестве подходящий выход. Кто-нибудь знает решение этой ошибки?
Ниже приведен простой пример, где я делаю Ytrain = np_utils.to_categorical(Ytrain)
Полный код -
import tensorflow as tf
print(tf.__version__)
import numpy as np
from tensorflow.keras import utils as np_utils
Xtrain = np.random.randint(0, 100, size=(150, 10, 1))
Ytrain = np.random.choice([0,1, 2], size=(150, 1))
Ytrain = np_utils.to_categorical(Ytrain)
print(Ytrain.shape)
input_shape = (10, 1)
input_layer = tf.keras.layers.Input(input_shape)
conv_x = tf.keras.layers.Conv1D(filters=32, kernel_size=10, strides = 1, padding='same')(input_layer)
conv_x = tf.keras.layers.BatchNormalization()(conv_x)
conv_x = tf.keras.layers.Activation('relu')(conv_x)
g_pool = tf.keras.layers.GlobalAvgPool1D()(conv_x)
output_layer = tf.keras.layers.Dense(3, activation='softmax')(g_pool)
model = tf.keras.models.Model(inputs= input_layer, outputs = output_layer)
model.summary()
model.compile(loss='categorical_crossentropy', optimizer= tf.keras.optimizers.Adam(),
metrics=['accuracy'])
hist = model.fit(Xtrain, Ytrain, batch_size= 5, epochs= 10, verbose= 0)
print("Ran Successfully")
Вывод -
2.2.0
(150, 3)
Model: "model_13"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_21 (InputLayer) [(None, 10, 1)] 0
_________________________________________________________________
conv1d_9 (Conv1D) (None, 10, 32) 352
_________________________________________________________________
batch_normalization_15 (Batc (None, 10, 32) 128
_________________________________________________________________
activation_9 (Activation) (None, 10, 32) 0
_________________________________________________________________
global_average_pooling1d_9 ( (None, 32) 0
_________________________________________________________________
dense_14 (Dense) (None, 3) 99
=================================================================
Total params: 579
Trainable params: 515
Non-trainable params: 64
_________________________________________________________________
Ran Successfully
Надеюсь, это ответит на ваш вопрос. Удачного обучения.