Не удается передача в модель входных данных и меток (Functional API с несколькими входами)

Имеется модель для многоклассовой классификации с тремя входными параметрами: текстовое описание компонентов и два категориальных признака, переведенные в числовые с помощью pd.get_dummies.

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

      Epoch 1/2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-314-3276718247> in <cell line: 0>()
----> 1 model.fit({'part': X2_train, 'body': X1_train, 'manufacturer': X3_train},
      2           {'TVEND': y_train},
      3           epochs=2,
      4           batch_size=32)

1 frames
/usr/local/lib/python3.11/dist-packages/optree/ops.py in tree_map(func, tree, is_leaf, none_is_leaf, namespace, *rests)
    764     leaves, treespec = _C.flatten(tree, is_leaf, none_is_leaf, namespace)
    765     flat_args = [leaves] + [treespec.flatten_up_to(r) for r in rests]
--> 766     return treespec.unflatten(map(func, *flat_args))
    767 
    768 

TypeError: Expected float32, but got TVEND of type 'str'.
"

и

    Epoch 1/2
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-259-561034663> in <cell line: 0>()
----> 1 model.fit([X3_train, X1_train],
      2           y_train,
      3           epochs=2,
      4           batch_size=32)

1 frames
/usr/local/lib/python3.11/dist-packages/keras/src/backend/tensorflow/trainer.py in multi_step_on_iterator(iterator)
    130             if self.steps_per_execution == 1:
    131                 return tf.experimental.Optional.from_value(
--> 132                     one_step_on_data(iterator.get_next())
    133                 )
    134 

ValueError: Creating variables on a non-first call to a function decorated with tf.function.

Хотя все подаваемые на обучение данные - это списки массивов Numpy входных данных и меток.

Подскажите, в чем может быть ошибка при подаче данных в модель на обучение?

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

part_num = 906  # Количество партий
manufacturer_num = 150 # Количество производителей
vocab_size = vocab_size # Размер словаря полученный в результате предобработки 
    текстовых данных Word2vec
num_TVEND = 11  # Количество TNVED кодов для предсказаний

body_input = keras.Input(shape=(None,), name='body') 
manufacturer_input = keras.Input(shape=(manufacturer_num,), name='manufacturer')
part_num_input = keras.Input(shape=(part_num,), name='part_num')

body_features = layers.Embedding(vocab_size, 64)(body_input)

body_features = layers.LSTM(32)(body_features)

x = layers.concatenate([manufacturer_input, body_features, part_num_input])

TVEND_pred = layers.Dense(num_TVEND, activation='softmax', name='TVEND')(x)

model = keras.Model(inputs=[manufacturer_input, body_input, part_num_input],
                outputs=[TVEND_pred])

model.compile(optimizer=keras.optimizers.RMSprop(1e-3),
          loss=['categorical_crossentropy'],
          metrics=['f1_score', 'precision', 'recall', 'accuracy'])

model.fit({'part_num': X2_train, 'body': X1_train, 'manufacturer': X3_train},
      {'TVEND': y_train},
      epochs=2,
      batch_size=32)

Текстовые описания компонентов преобразованы в векторы чисел:

  • Размерность X1_train: (736, 276)
  • Размерность X1_test: (185, 276)
  • Размерность X2_train: 736
  • Размерность X2_test: 185
  • Размерность X3_train: 736
  • Размерность X3_test: 185
  • y_train shape: (736, 11)
  • y_test shape: (185, 11)

Формат загружаемых данных:

Категориальные признаки в формате:

array([[0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 0, 0],
       ...,
       [0, 0, 0, ..., 0, 0, 0],
       [1, 0, 0, ..., 0, 0, 0],
       [0, 0, 0, ..., 0, 1, 0]])

Текст в формате:

array([[   0,    0,    0, ...,  140,   26,    1],
       [   0,    0,    0, ...,  240, 5060,  103],
       [   0,    0,    0, ...,   25,   13,   17],
       ...,
       [   0,    0,    0, ...,   84, 1526,    8],
       [   0,    0,    0, ...,  155,   52,   73],
       [   0,    0,    0, ..., 1030,   25,   10]], dtype=int32)

Целевая переменная в формате:

array([[0., 0., 0., ..., 0., 0., 1.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 1., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)

Ответы (1 шт):

Автор решения: SVBazuev

Получилось воспроизвести первую проблему:

Epoch 1/2
Ошибка во время обучения модели: Expected float32, but got TVEND of type 'str'.

Лечится это так:

try:
    model.fit(
        {'part_num': X2_train, 'body': X1_train, 'manufacturer': X3_train},
        y_train,
        epochs=2,
        batch_size=32)
except Exception as e:
    print("Ошибка во время обучения модели:", e)

А вот такой код:

try:
    model.fit(
        {'part_num': X2_train, 'body': X1_train, 'manufacturer': X3_train},
        {'TVEND': y_train},
        epochs=2,
        batch_size=32)
except Exception as e:
    print("Ошибка во время обучения модели:", e)
    model.fit(
        {'part_num': X2_train, 'body': X1_train, 'manufacturer': X3_train},
        y_train,
        epochs=2,
        batch_size=32)

^^^ Повторный вызов model.fit() — приводит ко второй ошибке.

Успехов!

→ Ссылка