我正在使用Tensorflow编写一个NN模型来近似正弦函数,我想使用二阶导数w.r.t.到我模型的损失函数中的输入。
我的代码还没有包含导数,但是我只是在我的损失函数中添加了输入张量(作为第一步),并使用了this作为第一种方法。
我的代码当前看起来像这样
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
有人知道为什么会这样吗?
答案 0 :(得分:2)
由于默认情况下TensorFlow 2.0及更高版本在急切模式下运行, Tensorflow op将检查输入的类型是否为 “ tensorflow.python.framework.ops.EagerTensor” ,并且由于已实现Keras, 急切模式的输入将为“ tensorflow.python.framework.ops.Tensor” ,这将引发错误
class CustomScrollView: UIScrollView {
private var oldContentSize: CGSize = .zero
override var contentOffset: CGPoint {
set {
if oldContentSize == contentSize {
super.contentOffset = newValue
} else {
super.contentOffset = super.contentOffset
oldContentSize = contentSize
}
}
get {
return super.contentOffset
}
}
}
您可以通过明确告诉TensorFlow在Keras的急切模式下运行来将输入类型更改为EagerTensor。 将此设置为true将解决问题
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