Tensorflow: пользовательская функция потерь приводит к тому, что вне кода ошибки построения функции - PullRequest
1 голос
/ 19 февраля 2020

Я использую Tensorflow для написания NN-модели для аппроксимации функции синуса, и я хотел бы использовать вторую производную по входу в функции потерь для моей модели.

Мой код не включает производную, но я просто добавил входной тензор в свою функцию потерь (в качестве первого шага) и использовал этот ответ в качестве первого подхода.

Мой код в настоящее время выглядит следующим образом

import tensorflow as tf
import numpy as np

from tensorflow import keras
from numpy import random

# --- Settings
x_min = 0
x_max = 2*np.pi

n_train = 64
n_test = 64

# --- Generate dataset
x_train = random.uniform(x_min, x_max, n_train)
y_train = np.sin(x_train)

x_test = random.uniform(x_min, x_max, n_test)
y_test = np.sin(x_test)

# --- Create model
model = keras.Sequential()

model.add(keras.layers.Dense(64, activation="tanh", input_dim=1))
model.add(keras.layers.Dense(64, activation="tanh"))

model.add(keras.layers.Dense(1, activation="tanh"))

def custom_loss_wrapper(input_tensor):

    def custom_loss(y_true, y_pred):
        return keras.losses.mean_squared_error(y_true, y_pred) + keras.backend.mean(input_tensor)

    return custom_loss

# --- Configure learning process
model.compile(
        optimizer=keras.optimizers.Adam(0.01),
        loss=custom_loss_wrapper(model.input),
        metrics=['MeanSquaredError'])

# --- Train from dataset
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_test, y_test))

model.evaluate(x_test, y_test)

Моя пользовательская функция потерь просто вычисляет среднеквадратичную ошибку и добавляет входное значение. Это не должно быть проблемой, но я получаю сообщение об ошибке

TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
For example, the following function will fail:
  @tf.function
  def has_init_scope():
    my_constant = tf.constant(1.)
    with tf.init_scope():
      added = my_constant * 2
The graph tensor has name: dense_input:0

Кто-нибудь знает, почему это происходит?

1 Ответ

1 голос
/ 24 апреля 2020

Поскольку TensorFlow версии 2.0 и выше по умолчанию работает в активном режиме, Tensorflow op проверит, имеют ли входные данные тип "tenenflow. python .framework.ops.EagerTensor" и поскольку Keras реализован, входные данные для активного режима будут иметь "tenorflow. python .framework.ops.Tensor" , и это выдает ошибку

TypeError: An op outside of the function building code is being passed
a "Graph" tensor. It is possible to have Graph tensors
leak out of the function building context by including a
tf.init_scope in your function building code.
For example, the following function will fail:
  @tf.function
  def has_init_scope():
    my_constant = tf.constant(1.)
    with tf.init_scope():
      added = my_constant * 2

Вы можете изменить тип ввода на EagerTensor, явно указав TensorFlow для запуска в режиме ожидания для Keras. Установка этого значения в true решит проблему

tf.config.experimental_run_functions_eagerly(True)
...