首页 > 解决方案 > 我的损失函数会按照我希望的方式工作吗?(凯拉斯)

问题描述

所以我用这段代码实现了一个神经网络:

self.model = keras.Sequential()
self.model.add(keras.Input(shape=(self.wejscia,), name="Input"))
self.model.add(layers.Dense(64, activation="relu", name="dense_1"))
self.model.add(layers.Dense(64, activation="relu", name="dense_2"))
self.model.add(layers.Dense(8, activation="softmax", name="predictions"))

但我想让它可以只在输出向量的一个选定位置上执行梯度下降。我这样做的方式是这样的:

首先,我创建了一个这样的类:

class CustomMSE(keras.losses.Loss):
    def __init__(self, my_output, name="custom_mse"):
        super().__init__(name=name)
        self.my_output = my_output

    def call(self, y_true, y_pred):
        mse = tf.math.reduce_mean(tf.square(y_true[0,self.my_output] - y_pred[0,self.my_output]))
        return mse

然后我只是应用了这样的编译方法:

self.model.compile(optimizer=keras.optimizers.Adam(), loss=CustomMSE(i))

我不确定两件事。

第一:.fit 方法是否会修改第二个隐藏层和第 j 个输出之间的工资 j !=i (我希望不会)

第二:指令 self.model.compile(optimizer=keras.optimizers.Adam(), loss=CustomMSE(i)) 对不同的 i 值多次应用会影响模型的当前工资,还是只会改变应用 .fit 方法后网络的进一步行为?

标签: pythontensorflowkerasloss-function

解决方案


使用您拥有的代码,它不会按预期工作,因为您正在使用 tf. 函数而不是 keras.backend 函数来创建损失函数。以下是如何创建自定义损失函数的示例:

import tensorflow.keras.backend as kb
def custom_loss(y_actual,y_pred):
    custom_loss=kb.square(y_actual-y_pred)
    return custom_loss

你可以像这样使用这个损失函数:

model.compile(loss=custom_loss,optimizer=optimizer)

当然,这与您实现的损失函数不同,但它显示了方法论。


推荐阅读