【问题标题】:Keras Implementation of Customized Loss Function that need internal layer output as label需要内部层输出作为标签的自定义损失函数的 Keras 实现
【发布时间】:2017-05-30 23:21:22
【问题描述】:

在 keras 中,我想自定义我的损失函数,它不仅需要 (y_true, y_pred) 作为输入,还需要使用网络内部层的输出作为输出层的标签。这张图显示了Network Layout

这里,内部输出是xn,它是一个一维特征向量。在右上角,输出为xn',即xn的预测。换句话说,xn 是 xn' 的标签。

而 [Ax, Ay] 传统上称为 y_true,而 [Ax',Ay'] 是 y_pred。

我想将这两个损失分量合二为一,共同训练网络。

非常感谢任何想法或想法!

【问题讨论】:

    标签: keras loss


    【解决方案1】:

    首先你应该使用Functional API。然后你应该将网络输出定义为输出加上内部层的结果,将它们合并为一个输出(通过连接),然后制作一个自定义损失函数,然后将合并的输出分成两部分并进行损失计算靠自己。

    类似:

    def customLoss(y_true, y_pred):
        #loss here
        internalLayer = Convolution2D()(inputs) #or other layers
        internalModel = Model(input=inputs, output=internalLayer)
        tmpOut = Dense(...)(internalModel)
        mergedOut = merge([tmpOut, mergedOut], mode = "concat", axis = -1)
        fullModel = Model(input=inputs, output=mergedOut)
    
        fullModel.compile(loss = customLoss, optimizer = "whatever")
    

    【讨论】:

    • 感谢您的回复!我认为我主要关心的是如何形成我的损失函数。是的,我们可以将两个输出合二为一,但是在计算内部输出 (xn') 的损失时,customLoss 需要访问模型本身才能获得内部输出 (xn) 的标签。 xn 不是训练数据,而是模型处理的训练数据的某种变换。
    • @LiJuekun 你不能把“内部标签”放到你传递给 fit 的 y 值中吗?
    • 好像sn-p代码有缩进问题?
    【解决方案2】:

    我已经找到了一条出路,以防万一有人在寻找相同的方法,我在此处发布(基于本文中给出的网络):

    想法是定义自定义的损失函数并将其用作网络的输出。 (注解:A是变量A的真实标签,A'是变量A的预测值)

    def customized_loss(args):
        #A is from the training data
        #S is the internal state
        A, A', S, S' = args 
        #customize your own loss components
        loss1 = K.mean(K.square(A - A'), axis=-1)
        loss2 = K.mean(K.square(S - S'), axis=-1)
        #adjust the weight between loss components
        return 0.5 * loss1 + 0.5 * loss2
    
     def model():
         #define other inputs
         A = Input(...) # define input A
         #construct your model 
         cnn_model = Sequential()
         ...
         # get true internal state
         S = cnn_model(prev_layer_output0)
         # get predicted internal state output
         S' = Dense(...)(prev_layer_output1)
         # get predicted A output
         A' = Dense(...)(prev_layer_output2)
         # customized loss function
         loss_out = Lambda(customized_loss, output_shape=(1,), name='joint_loss')([A, A', S, S'])
         model = Model(input=[...], output=[loss_out])
         return model
    
      def train():
          m = model()
          opt = 'adam'
          model.compile(loss={'joint_loss': lambda y_true, y_pred:y_pred}, optimizer = opt)
          # train the model 
          ....
    

    【讨论】:

    • 我知道这已经有一段时间了,但你能解释一下 A 和 A' 是什么吗? A'是A的预测不是吗? A 应该是实际的预期结果,那么为什么将它定义为输入而不是接受值的 numpy 数组?
    • 为什么将loss_out作为模型的输出给出
    【解决方案3】:

    我对此实施持保留意见。在合并层计算的损失被传播回两个合并的分支。通常,您希望仅通过一层传播它。

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多