keras модель с несколькими выходами
Пытаюсь в выходном слое обьединить предсказание на 4 периода. Каждое предсказание должно делить на категорию (исход а, исход б), пробовал так, но вылетает ошибка. Как правильно построить выходной слой? вот кусок кода который я пытаюсь реализовать:
x = layers.Dense(4190, activation="relu", name='ma')(inputs)
y1 = layers.Dense(2, activation="softmax")(x)
y2 = layers.Dense(2, activation="softmax")(x)
y3 = layers.Dense(2, activation="softmax")(x)
y4 = layers.Dense(2, activation="softmax")(x)
outputs = layers.add([y1, y2, y3, y4])
вот файл целиком:
from lib.dev import see, wtf, save_obj, load_obj
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
inputs = keras.Input(shape=(4190), name="input")
x = layers.Dense(4190, activation="relu", name='ma')(inputs)
y1 = layers.Dense(2, activation="softmax")(x)
y2 = layers.Dense(2, activation="softmax")(x)
y3 = layers.Dense(2, activation="softmax")(x)
y4 = layers.Dense(2, activation="softmax")(x)
outputs = layers.add([y1, y2, y3, y4])
model = keras.Model(inputs, outputs, name="predict_4_periods")
# model.summary()
# exit()
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
data = load_obj(f'data_set0')
x_train = [x[0]+x[1]+x[2]+x[3]+x[4]+x[5]+x[6] for x in data]
x_train = tf.reshape(tf.cast(x_train,tf.float32), [-1, 4190])
y_train = [x[7] for x in data]
y_train = tf.reshape(tf.cast(y_train,tf.float32), [-1, 8])
y = model.predict(tf.expand_dims(x_train[0],axis=0))
model.fit(x_train, y_train, batch_size=64, epochs=16, validation_split=0.2)
Ошибка:
Traceback (most recent call last):
File "D:\python\pythonProject\tf_stady2\main.py", line 11, in <module>
import err
File "D:\python\pythonProject\tf_stady2\err.py", line 28, in <module>
model.fit(x_train, y_train, batch_size=64, epochs=16, validation_split=0.2)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
raise e.with_traceback(filtered_tb) from None
File "C:\Temp\__autograph_generated_filetz04zyt2.py", line 15, in tf__train_function
retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
ValueError: in user code:
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\training.py", line 1160, in train_function *
return step_function(self, iterator)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\training.py", line 1146, in step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\training.py", line 1135, in run_step **
outputs = model.train_step(data)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\training.py", line 994, in train_step
loss = self.compute_loss(x, y, y_pred, sample_weight)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\training.py", line 1052, in compute_loss
return self.compiled_loss(
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\engine\compile_utils.py", line 265, in __call__
loss_value = loss_obj(y_t, y_p, sample_weight=sw)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\losses.py", line 152, in __call__
losses = call_fn(y_true, y_pred)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\losses.py", line 272, in call **
return ag_fn(y_true, y_pred, **self._fn_kwargs)
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\losses.py", line 1990, in categorical_crossentropy
return backend.categorical_crossentropy(
File "D:\python\pythonProject\tf_stady2\venv\lib\site-packages\keras\backend.py", line 5529, in categorical_crossentropy
target.shape.assert_is_compatible_with(output.shape)
ValueError: Shapes (None, 8) and (None, 2) are incompatible
Ответы (1 шт):
Автор решения: Максим
→ Ссылка
после
outputs = layers.add([y1, y2, y3, y4])
нужно добавить
outputs = layers.Dense(8)(outputs )
и все заработало