Формат нескольких входов x для обучения функциональной модели keras с несколькими входами

Итак, в настоящее время я пытаюсь понять, какие форматы ожидает модель с несколькими входами keras, и не понимаю, как использовать несколько форматов.

from tensorflow.keras.models import Model
import tensorflow.keras
import tensorflow as tf

first_input = Input(2)
second_input = Input(2)
concat_layer= Concatenate()([first_input, second_input ])
hidden= Dense(2, activation="relu")(concat_layer)
output = Dense(1, activation="sigmoid")(hidden)
model = Model(inputs=[first_input, second_input], outputs=output)
model.summary()
model.compile(loss='mean_squared_error', metrics=['mean_squared_error'], optimizer='adam')

# I managed to get the format for prediction and single training data correct
# this works
inp = [np.array([[0,2]]), np.array([[0,2]])]
model.predict(inp)
model.fit(inp,np.array([42]), epochs=3, )

# I don´t get why this isn´t working
# this doesn´t work
model.fit(np.array([inp,inp]),np.array([42, 43]), epochs=3, )´

Прочитав документ keras о функции соответствия, я действительно не понимаю, почему моя версия не работает:

x: вектор, матрица или массив обучающих данных (или список, если модель имеет несколько входов). Если все входы в модели названы, вы также можете передать список имен входов, отображающих данные. x может иметь значение NULL (по умолчанию) при подаче из собственных тензоров фреймворка (например, тензоров данных TensorFlow).

Потому что я буквально даю ему массив списков.

Последняя строка кода приводит к следующей ошибке:

ValueError: модель слоя ожидает 2 входных данных, но получила 1 входной тензор. Полученные входные данные: [‹tf.Tensor 'IteratorGetNext: 0' shape = (None, 2, 1, 2) dtype = int64›]

Любая помощь приветствуется.


person SegmentationFaultLover    schedule 22.05.2021    source источник


Ответы (1)


При создании модели

model = Model(inputs=[first_input, second_input], outputs=output)

Это означает, что ожидается, что входные данные будут списком из 2 тензоров с формами (2,) и одним выходом с формой (1,) (как определено последним плотным слоем).

Итак, когда вы используете в качестве аргументов:

inp = [np.array([[0,2]]), np.array([[0,2]])]

Это список с двумя массивами формы (1, 2)

А также

np.array([42])

который представляет собой массив с формой (1)

Это соответствует определению вашей модели. [На самом деле результат должен иметь форму (1, 1)]

Линия

model.fit(np.array([inp,inp]),np.array([42, 43]))

Пытается передать список списков массивов с общей формой [2, 2, 1, 2] и целью с формой [2]. Это не соответствует определению модели.

Поскольку легко ошибиться, я предпочитаю сначала строить аргументы для вызова .fit или predic, а затем явно печатать их формы ...

e.g.

x_train = [a, b] # where a and b are np.arrays
print([x.shape for x in x_train])

Например, попробуйте:

x_first = np.random.rand(8, 2) # batch_size 8, feature_size 2
x_second = np.random.rand(8, 2)
x_train = [a, b]

y_true = np.random.rand(8)

model.fit(x_train, y_true)
person Pedro Marques    schedule 22.05.2021
comment
Что ж, спасибо за ответ, но как теперь будет выглядеть правильно отформатированный ввод? - person SegmentationFaultLover; 22.05.2021
comment
В настоящее время я пытаюсь понять тензорные формы, и вы написали, что целевая форма np.array ([42, 43]) была (1,2), но на самом деле это не просто (2), или я что-то упустил? - person SegmentationFaultLover; 22.05.2021
comment
Вы правы: np.array ([42, 43]) - это форма (2,), моя ошибка. - person Pedro Marques; 22.05.2021
comment
@SegmentationFaultLover добавил пример вызова с использованием случайных значений. - person Pedro Marques; 22.05.2021
comment
Большое спасибо, это очень помогает! - person SegmentationFaultLover; 22.05.2021