Итак, я вижу, что в вашем генераторе у вас один дим-вход и 2-дим-выход.
В вашей функции потерь вы индексируете неверным образом. Первый индекс обычно представляет собой индекс пакета, поэтому вам нужно указать, что вы пытаетесь рассчитать потери по всем пакетам.
Правильная реализация потерь будет выглядеть следующим образом:
return K.abs(y_true[:,:]-y_pred[:,0])+K.abs(y_true[:,:]-y_pred[:,1])
Я полагаю, вы получили ошибку из-за неправильной индексации, если это то, что вы имели в виду, то это решит проблему.
Наконец, количество выходов определяется единицами в последний слой. [Посмотрите на сводку вашей модели, вы увидите, что последний слой имеет форму (None,1)
, но вам нужно (None, 2)
там, поскольку у вас есть 2 выхода] Вы можете посмотреть сводку модели, вы передаете два значения b, c в вашем генераторе, но ваша модель имеет один выход (1 единица в конечном плотном слое). Чтобы исправить это, достаточно просто изменить единицы измерения в Dense (2).
from tensorflow.keras.layers import Input, Dense, Add, Activation, Flatten
from tensorflow.keras.models import Model, Sequential
import tensorflow as K
def custom_loss(y_true,y_pred):
print(y_true.shape)
print(y_pred.shape)
return K.abs(y_true[:,:]-y_pred[:,0])+K.abs(y_true[:,:]-y_pred[:,1])
return K.keras.losses.mse(y_true, y_pred) # this one works
def gen():
while True:
a = np.random.random()
b = 2*a
c = 3*a
yield (np.array([a]),np.array([b,c]))
model = Sequential()
model.add(Dense(2,input_dim=1))
model.compile('adam',custom_loss)
model.summary()
model.fit_generator(gen(),steps_per_epoch=20)
Model: "sequential_17"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_17 (Dense) (None, 2) 4
=================================================================
Total params: 4
Trainable params: 4
Non-trainable params: 0
_________________________________________________________________
(None, 1)
(None, 2)
(None, 1)
(None, 2)
20/20 [==============================] - 0s 2ms/step - loss: 2.8827
<tensorflow.python.keras.callbacks.History at 0x7f48e64f1d68>