1

我正在尝试在我的Keras模型(TensorFlow 2)中使用自定义损失函数。这种自定义损失(理想情况下)将计算数据损失加上物理方程的残差(例如,扩散方程、Navier Stokes 等)。这个残差是基于模型输出导数 wrt 它的输入,我想使用GradientTape.

在这个 MWE 中,我删除了数据损失项和其他方程损失,只使用了输出对第一个输入的导数。数据集可以在这里找到。

from numpy import loadtxt
from keras.models import Sequential
from keras.layers import Dense
import tensorflow as tf #tf.__version__ = '2.3.0'
# tf.compat.v1.disable_eager_execution()
# load the dataset
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=',')
# split into input (X) and output (y) variables
X = dataset[:,0:8] #X.shape = (768, 8)
y = dataset[:,8]

def customLoss(yTrue,yPred):
    x_tensor = tf.convert_to_tensor(model.input, dtype=tf.float32)
    x_tensor = tf.cast(x_tensor, tf.float32)
    with tf.GradientTape() as t:
        t.watch(x_tensor)
        output = model(x_tensor)
    DyDX = t.gradient(output, x_tensor)    
    dy_t = DyDX[:, 5:6][0]
    R_pred=dy_t
    # loss_data = tf.reduce_mean(tf.square(yTrue - yPred), axis=-1)
    loss_PDE = tf.reduce_mean(tf.square(R_pred))
    return loss_PDE

model = Sequential()
model.add(Dense(12, input_dim=8, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(12, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss=customLoss, optimizer='adam', metrics=['accuracy'])

model.fit(X, y, epochs=15, batch_size=10)

执行后,我得到这个_SymbolicException

_SymbolicException: Inputs to eager execution function cannot be Keras symbolic tensors, but found [<tf.Tensor 'dense_6_input:0' shape=(None, 8) dtype=float32>]

当我取消注释tf.compat.v1.disable_eager_execution()时,问题似乎消失了,模型开始训练。我想知道为什么我会得到这个_SymbolicException,以及如何在不禁用急切执行的情况下解决它。有任何想法吗?

4

0 回答 0