«Операция имеет« Нет »для градиента» с пользовательской функцией потерь - PullRequest
1 голос
/ 16 апреля 2020

У меня, кажется, есть определенный c код, потому что я не смог найти то, что я хочу в Интернете, поэтому вот моя проблема:

Я кодировал NN, который принимает массив указанных c длина и должен дать мне единственное значение в качестве вывода:

    model = tf.keras.Sequential()
    model.add(layers.Embedding(input_dim=int(input_len_array), output_dim=8 * int(input_len_array)))

    model.add(layers.GRU(32 * int(input_len_array), return_sequences=True))

    # Last layer...
    model.add(layers.Dense(1, activation='tanh'))

После этого я создаю функцию Custom_loss:

    custom_loss(x_, y_):
        sess = tf.Session()
        Sortino = self.__backtest(x_, y_)

        def loss(y_true, y_pred):
            print('Sortino: ', Sortino)

            # The Optimizer will MAXIMIZE the Sortino so we compute -Sortino
            return tf.convert_to_tensor(-Sortino)

        return loss

После этого я компилирую свою модель и даю ей вся партия значений в тензоре X и Y:

self.model.compile(optimizer='adam', loss=custom_loss(x, y))

Внутри пользовательской потери я вызываю функцию self .__ backtest, которая определяется следующим образом:

def __backtest(self, x_: tf.Tensor, y_r: tf.Tensor, timesteps=40):     
    my_list = []
    sess = tf.Session()

    # Defining the Encoder
    # enc = OneHotEncoder(handle_unknown='ignore')
    # X = [[-1, 0], [0, 1], [1, 2]]
    # enc.fit(X)

    # sess.run(x_)[i, :] is <class 'numpy.ndarray'>
    print('in backest: int(x_.get_shape())', x_.get_shape())

    for i in range(int(x_.get_shape()[0])):
        output_of_nn = self.model.predict(sess.run(x_)[i, :] / np.linalg.norm(sess.run(x_)[i, :]))

        # categorical_output = tf.keras.utils.to_categorical(output_of_nn)

        my_list.append(scaled_output * sess.run(y_r)[i])
        if i < 10:
            print('First 10 scaled output: ', scaled_output)
        if i > 0:
            capital_evolution.append(capital_evolution[-1] * (my_list[-1] + 1))

    my_array = np.array(my_list)

    if len(my_array) < 10:
        return -10

    try:
        Sortino = my_array.mean() / my_array.std()
    except:
        Sortino = -10

    return Sortino

Компьютер является ' Я не могу запустить код и выдает мне эту ошибку:

ValueError: 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.

Я был бы очень признателен, если бы кто-то смог дать решение !! ОГРОМНОЕ СПАСИБО !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...