Проблема пользовательских потерь: следует рассчитывать с использованием предыдущих прогнозов - PullRequest
0 голосов
/ 20 апреля 2020

Вот мой тип данных и то, что я хочу сделать: у меня есть тензор X, содержащий все входные данные для обучения (весь пакет), и тензор Y, содержащий своего рода «целевые значения» для каждого X_entry.

Затем я хочу создать NN на основе GRU, но сейчас я только что попробовал с простым одиночным нейронным слоем, который дает мне результат с активацией tanh.

visible = Input(shape=(input_len_array,))
output_layer = Dense(1, activation='tanh')(visible)
model = Model(inputs=visible, outputs=output_layer)
# Prints the shape of the NN
print(model.summary())

Мой X-тензор выглядит так:

My x :  Tensor("transpose_2:0", shape=(3672, 8), dtype=float32)

Я хотел бы взять целые данные, X-тензор (который можно рассматривать как пакет), и для каждого входа в тензор я предсказываю значение, я умножаю его на значение Y (целевое значение ), Я, наконец, хочу, чтобы между средним () и стандартным значением () этих значений было ТО, что это моя потеря, указанная для партии.

Пока я пробовал a для l oop, но он сказал мне, что это не дифференцируемо («Операция имеет None для градиента»).

Кто-то сказал мне, что это связано с для l oop, поэтому я попробовал эту реализацию:

    def custom_loss(x_, y_):
        predicted_array = model.predict_on_batch(x_)  # steps=int(x_.get_shape()[0])
        predicted_array = tf.convert_to_tensor(predicted_array)
        neg_Sharpe = -(K.mean(tf.multiply(predicted_array, y_)) / (0.001 + K.std(tf.multiply(predicted_array, y_))))


        def loss(y_true, y_pred):
            return neg_Sharpe

        return loss

    # I previously defined my X and Y tensors and now I feed them into the compile funct
    self.model.compile(optimizer='adam', loss=custom_loss(x, y))
    #It works until here without visible error... then I try:

    for epoch in range(self.__n_epoch):
        self.model.train_on_batch(x, y)

И тогда он останавливается и говорит:

An operation has `None` for gradient. Please make sure that all of your ops have a gradient defined (i.e. are differentiable). Common ops without gradient: K.argmax, K.round, K.eval.

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

Я был бы более чем благодарен за вашу помощь !! СПАСИБО!

...