Как реализовать адаптивные потери в керасе? - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь использовать Keras для выполнения работы, выполненной в Общая и адаптивная функция робастной потери .Автор предоставляет код тензорного потока, который обрабатывает сложные детали.Я просто пытаюсь использовать его готовую функцию в Керасе.

Его пользовательская функция потерь учитывает параметр «альфа», который управляет формой функции потерь.Я хотел бы отслеживать «альфа» в дополнение к потере во время тренировки.

Я немного знаком с пользовательскими функциями потери Keras и использованием оболочек, но я не совсем уверен, как использовать обратные вызовы для отслеживания «альфы».Ниже я хотел бы наивно построить функцию потерь в Керасе.Однако я не уверен, как бы я тогда получил доступ к «альфе» для отслеживания.

Из предоставленного кода тензорного потока функция lossfun (x) возвращает кортеж.

def lossfun(x,
            alpha_lo=0.001,
            alpha_hi=1.999,
            alpha_init=None,
            scale_lo=1e-5,
            scale_init=1.,
            **kwargs):
    """
    Returns:
        A tuple of the form (`loss`, `alpha`, `scale`).
    """
def customAdaptiveLoss(): 
    def wrappedloss(y_true,y_pred):
        loss, alpha, scale = lossfun((y_true-y_pred))  #Author's function
        return loss
    return wrappedloss

Model.compile(optimizer = optimizers.Adam(0.001),
                        loss = customAdaptiveLoss,)

Опять же, на что я надеюсьdo - отслеживать переменную 'alpha' во время тренировки.

1 Ответ

1 голос
/ 26 июня 2019

В следующем примере альфа отображается как метрика. Проверено в колабе.

%%
!git clone https://github.com/google-research/google-research.git

%%
import sys
sys.path.append('google-research')
from robust_loss.adaptive import lossfun

# the robust_loss impl depends on the current workdir to load a data file.
import os
os.chdir('google-research')

import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K

class RobustAdaptativeLoss(object):
  def __init__(self):
    z = np.array([[0]])
    self.v_alpha = K.variable(z)

  def loss(self, y_true, y_pred, **kwargs):
    x = y_true - y_pred
    x = K.reshape(x, shape=(-1, 1))
    with tf.variable_scope("lossfun", reuse=True):
      loss, alpha, scale = lossfun(x)
    op = K.update(self.v_alpha, alpha)
    # The alpha update must be part of the graph but it should
    # not influence the result.
    return loss + 0 * op

  def alpha(self, y_true, y_pred):
    return self.v_alpha

def make_model():
  inp = Input(shape=(3,))
  out = Dense(1, use_bias=False)(inp)
  model = Model(inp, out)
  loss = RobustAdaptativeLoss()
  model.compile('adam', loss.loss, metrics=[loss.alpha])
  return model

model = make_model()
model.summary()

init_op = tf.global_variables_initializer()
K.get_session().run(init_op)

import numpy as np

FACTORS = np.array([0.5, 2.0, 5.0])
def target_fn(x):
  return np.dot(x, FACTORS.T)

N_SAMPLES=100
X = np.random.rand(N_SAMPLES, 3)
Y = np.apply_along_axis(target_fn, 1, X)

history = model.fit(X, Y, epochs=2, verbose=True)
print('final loss:', history.history['loss'][-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...