【发布时间】:2020-11-24 22:19:13
【问题描述】:
我正在使用 TF2 (2.3.0) NN 来逼近求解 ODE 的函数 y:y'+3y=0
我已经定义了 cutsom 损失类和函数,在其中我试图区分单个输出相对于单个输入,因此等式成立,前提是 y_true 为零:
from tensorflow.keras.losses import Loss
import tensorflow as tf
class CustomLossOde(Loss):
def __init__(self, x, model, name='ode_loss'):
super().__init__(name=name)
self.x = x
self.model = model
def call(self, y_true, y_pred):
with tf.GradientTape() as tape:
tape.watch(self.x)
y_p = self.model(self.x)
dy_dx = tape.gradient(y_p, self.x)
loss = tf.math.reduce_mean(tf.square(dy_dx + 3 * y_pred - y_true))
return loss
但运行以下 NN:
import tensorflow as tf
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense
from tensorflow.keras import Input
from custom_loss_ode import CustomLossOde
num_samples = 1024
x_train = 4 * (tf.random.uniform((num_samples, )) - 0.5)
y_train = tf.zeros((num_samples, ))
inputs = Input(shape=(1,))
x = Dense(16, 'tanh')(inputs)
x = Dense(8, 'tanh')(x)
x = Dense(4)(x)
y = Dense(1)(x)
model = Model(inputs=inputs, outputs=y)
loss = CustomLossOde(model.input, model)
model.compile(optimizer=Adam(learning_rate=0.01, beta_1=0.9, beta_2=0.99),loss=loss)
model.run_eagerly = True
model.fit(x_train, y_train, batch_size=16, epochs=30)
现在我从第一个时代得到 0 损失,这没有任何意义。
我已经从函数中打印了y_true 和y_test,它们看起来还可以,所以我怀疑问题出在我没有成功打印的渐变中。
感谢任何帮助
【问题讨论】:
-
当您将
model.input作为您的custpm 损失的x传递时,您到底想达到什么目的?model.input是一个符号张量,它不包含任何数据。 -
@Lescurel 正如我所说:我正在尝试定义一个损失函数,该损失函数对(单个)网络输出相对于(单个)网络输入的导数进行了忏悔。你能解释一下我该怎么做吗?