Моя модель имеет два входа, и я хочу рассчитать потери для этих двух входов отдельно, потому что потерю входа 2 нужно умножить на вес. Затем сложите эти две потери как окончательную потерю модели. Структура примерно такая:
введите описание изображения здесь
Это моя модель:
def final_loss(y_true, y_pred):
loss = x_loss_value.output + y_model.output*weight
return loss
def mymodel(input_shape): #pooling=max or avg
img_input1 = Input(shape=(input_shape[0], input_shape[1], input_shape[2], ))
image_input2 = Input(shape=(input_shape[0], input_shape[1], input_shape[2], ))
#for input1
x = Conv2D(32, (3, 3), strides=(2, 2))(img_input1)
x_dense = Dense(2, activation='softmax', name='predictions')(x)
x_loss_value = my_categorical_crossentropy_layer(x)[input1_y_true, input1_y_pred]
x_model = Model(inputs=img_input1, outputs=x_loss_value)
#for input2
y = Conv2D(32, (3, 3), strides=(2, 2))(image_input2)
y_dense = Dense(2, activation='softmax', name='predictions')(y)
y_loss_value = my_categorical_crossentropy_layer(y)[input2_y_true, input2_y_pred]
y_model = Model(inputs=img_input2, outputs=y_loss_value)
concat = concatenate([x_model.output, y_model.output])
final_dense = Dense(2, activation='softmax')(concat)
# Create model.
model = Model(inputs=[img_input1,image_input2], output = final_dense)
return model
model.compile(optimizer = optimizers.adam(lr=1e-7), loss = final_loss, metrics = ['accuracy'])
Большинство связанных решений, которые я нашел, просто настраивают окончательную потерю и меняют ее в Model.complie(loss=customize_loss)
.
Однако мне нужно применить разные потери для разных входов. Я пытаюсь использовать настраиваемый слой, подобный этому, и получить мое значение потерь для окончательного расчета потерь:
class my_categorical_crossentropy_layer1(Layer):
def __init__(self, **kwargs):
self.is_placeholder = True
super(my_categorical_crossentropy_layer1, self).__init__(**kwargs)
def my_categorical_crossentropy_loss(self, y_true, y_pred):
y_pred = K.constant(y_pred) if not K.is_tensor(y_pred) else y_pred
y_true = K.cast(y_true, y_pred.dtype)
return K.categorical_crossentropy(y_true, y_pred, from_logits=from_logits)
def call(self, y_true, y_pred):
loss = self.my_categorical_crossentropy_loss(y_true, y_pred)
self.add_loss(loss, inputs=(y_true, y_pred))
return loss
Но внутри модели keras я не могу понять, как получить y_true
и y_pred
текущей эпохи / пакета для моего слоя потерь. Поэтому я не могу добавить x = my_categorical_crossentropy_layer()[y_true, y_pred]
в свою модель.
Есть ли способ сделать такой расчет переменных в модели keras?
Кроме того, может ли Керас пройти обучение предыдущей эпохи потеря или потеря стоимости во время тренировочного процесса? Я хочу использовать потерю тренировок предыдущей эпохи как свой вес в окончательной потере.