栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

自定义损失函数通过梯度下降在每一步进行更新

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义损失函数通过梯度下降在每一步进行更新

创建一个自定义层来保存可训练参数。该层不会在调用中返回输入,但是我们将使用输入来遵守如何创建层。

class TrainableLossLayer(Layer):    def __init__(self, a_initializer, **kwargs):        super(TrainableLossLayer, self).__init__(**kwargs)        self.a_initializer = keras.initializers.get(a_initializer)    #method where weights are defined    def build(self, input_shape):        self.kernel = self.add_weight(name='kernel_a',  shape=(1,), initializer=self.a_initializer, trainable=True)        self.built=True    #method to define the layers operation (only return the weights)    def call(self, inputs):        return self.kernel    #output shape    def compute_output_shape(self, input_shape):        return (1,)

使用模型中的图层获取

a
任何输入(这与顺序模型不兼容):

a = TrainableLossLayer(a_init, name="somename")(anyInput)

现在,您可以尝试以某种丑陋的方式定义损失:

def customLoss(yTrue,yPred):    return (K.log(yTrue) - K.log(yPred))**2+a*yPred

如果这可行,那就准备好了。


您也可以尝试使用更复杂的模型(如果您不希望

a
像这样在损失中使用跳过层,这可能会导致模型保存/加载问题)

在这种情况下,您将需要将其

y_train
作为输入而不是输出:

y_true_inputs = Input(...)

您的损失函数将进入一个

Lambda
正确接受所有参数的层:

def lambdaLoss(x):    yTrue, yPred, alpha = x    return (K.log(yTrue) - K.log(yPred))**2+alpha*yPredloss = Lambda(lambdaLoss)([y_true_inputs, original_model_outputs, a])

您的模型将输出以下损失:

model = Model([original_model_inputs, y_true_inputs], loss)

您将具有虚拟损失功能:

def dummyLoss(true, pred):    return predmodel.compile(loss = dummyLoss, ...)

并训练为:

model.fit([x_train, y_train], anything_maybe_None_or_np_zeros ,....)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/661111.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号