tf.gradients()返回一个[无]列表



如果这听起来像是重复,很抱歉。我已经研究了所有相关的问题,但没有找到合适的解决方案来解决我的问题。

我正试图建立一个生成模型,输出每追踪一天的新冠肺炎概率,以输入到基于SEIR的流行病学模型中。

一代人在工作。然而,我不知道如何训练这个模型。我必须编写一个自定义损失函数,该函数通过流行病学模型的阶跃函数来运行逐日参数;确认的";以及";移除";每天。然后我将该数据与记录的";确认的";以及";移除";来自John Hopkin在GitHub上的新冠病毒数据集。

我使用平均绝对误差来计算";确认的";以及";移除";基于生成的概率和来自JHU数据集的实际值。我遇到的问题是,当我调用the tf.gradient()函数时,它会返回一个Nones的列表。我被困在这里,如果有任何帮助,我们将不胜感激。

这是我正在使用的代码:

培训步骤

# Define function to train the model based on one input
loss_fn = MeanAbsoluteError()
optimizer = Adam(learning_rate=0.005)
@tf.function
def train_step(x, y):
y_pred = np.zeros((3, latent_dim))
N = tf.constant(int(7_000_000_000), dtype=tf.float64)
E0 = tf.Variable(int(1000), trainable=False, dtype=tf.float64)
I0 = tf.Variable(covid_df.iloc[0]["Confirmed"], trainable=False, dtype=tf.float64)
R0 = tf.Variable(covid_df.iloc[0]["Removed"], trainable=False, dtype=tf.float64)
S0 = tf.Variable(N - E0 - I0 - R0, trainable=False, dtype=tf.float64)
u0 = tf.Variable(0, trainable=False, dtype=tf.float64)
SuEIRs = tf.stack([S0,u0,E0,I0,R0])
with tf.GradientTape() as tape:
logits = generator(tf.reshape(x, (batch_size, 4, latent_dim)), training=True)
betas = logits[0][0]
sigmas = logits[0][1]
mus = logits[0][2]
gammas = logits[0][3]
for t in range(latent_dim):
SuEIR_diffs = SuEIR_step(SuEIRs, t, N, betas, sigmas, mus, gammas)
SuEIRs = SuEIRs + SuEIR_diffs
confirmed = SuEIRs[3]
removed = SuEIRs[4]
# update y_pred
y_pred[0,t] = float(t+1)
y_pred[1,t] = confirmed.numpy()
y_pred[2,t] = removed.numpy()
# Convert predictions
y_pred = tf.convert_to_tensor(y_pred)
# Calculate loss
loss_value = loss_fn(y[1], y_pred[1]) + loss_fn(y[2], y_pred[2])
# Calculate the gradient
grads = tape.gradient(loss_value, generator.trainable_weights)
print(grads) ##==>> outputs [None, None, None, None]
# Apply gradients to model
optimizer.apply_gradients(zip(grads, generator.trainable_weights))
return loss_value

训练循环

import time
epochs = 2
for epoch in range(epochs):
print("nStart of epoch %d" % (epoch,))
start_time = time.time()
# Iterate over the batches of the dataset.
for step in range(sample_size):
loss_value = train_step(x_input[step], y_true)
# Log every 5 batches.
if step % 5 == 0:
print(
"Training loss (for one batch) at step %d: %.4f"
% (step, float(loss_value))
)
print("Time taken: %.2fs" % (time.time() - start_time))

错误输出

ValueError: No gradients provided for any variable: ['dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].

CCD_ 3和CCD_。

编辑:更新代码以反映Myrl Marmarelis的建议和TensorFlow自定义训练循环指南的架构。仍然具有梯度是None的列表的相同问题。

在将损失(尤其是在y_pred上)计算为tf.convert_to_tensor(...)之前,请尝试将调用更改为np.array(...)。你需要通过将所有内容都保持为tf.Tensors来构建一个合适的符号图。事实上,确保在模型参数和损失之间的计算链上的任何地方都没有将任何内容转换为非张量。

我还建议将您的训练过程封装在@tf.function中,以便Tensorflow可以将其编译为静态图。

相关内容

  • 没有找到相关文章

最新更新