如何制作一个使用Keras中网络先前输出的自定义损失函数?

时间:2019-06-24 14:11:40

标签: python keras loss-function

我正在尝试构建一个自定义损失函数,该函数将从网络获取先前的输出(先前迭代的输出),并将其与当前输出一起使用。

这是我想要做的,但我不知道如何完成

def l_loss(prev_output):

    def loss(y_true, y_pred):

        pix_loss = K.mean(K.square(y_pred - y_true), axis=-1)

        pase = K.variable(100)

        diff = K.mean(K.abs(prev_output - y_pred))
        movement_loss = K.abs(pase - diff)
        total_loss = pix_loss + movement_loss

        return total_loss
    return loss

self.model.compile(optimizer=Adam(0.001, beta_1=0.5, beta_2=0.9),
 loss=l_loss(?))

希望你能帮助我。

1 个答案:

答案 0 :(得分:1)

这是我尝试过的:

from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential
from tensorflow.keras import backend as K

class MovementLoss(object):
  def __init__(self):
    self.var = None

  def __call__(self, y_true, y_pred, sample_weight=None):
    mse = K.mean(K.square(y_true - y_pred), axis=-1)
    if self.var is None:
      z = np.zeros((32,))
      self.var = K.variable(z)
    delta = K.update(self.var, mse - self.var)
    return mse + delta


def make_model():
  model = Sequential()
  model.add(Dense(1, input_shape=(4,)))
  loss = MovementLoss()
  model.compile('adam', loss)
  return model

model = make_model()
model.summary()


使用示例测试数据。

import numpy as np

X = np.random.rand(32, 4)

POLY = [1.0, 2.0, 0.5, 3.0]
def test_fn(xi):
  return np.dot(xi, POLY)

Y = np.apply_along_axis(test_fn, 1, X)

history = model.fit(X, Y, epochs=4)

我确实看到损失函数在我看来受到最后一批增量的影响。请注意,损失函数的详细信息与您的应用程序不同。

关键的一步是,K.update步骤必须是图形的一部分(据我所知)。

这是通过以下方式实现的:

delta = K.update(var, delta)
return x + delta