Не удается передача в модель входных данных и меток (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 шт):
Получилось воспроизвести первую проблему:
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() — приводит ко второй ошибке.