繁体   English   中英

tf.gradients() 返回 [None] 的列表

[英]tf.gradients() returns a list of [None]

对不起,如果这听起来像重复。 我已经解决了所有相关问题,但没有找到适合我的问题背景的解决方案。

我正在尝试构建一个生成的 model,它输出 COVID 的每个跟踪日的概率,以输入基于 SEIR 的流行病学 model。

一代工作。 但是,我不知道如何训练 model。 我必须编写一个自定义损失 function,它通过一个步骤 function 运行每日参数,用于流行病学 model 的每个“已删除”数据集和“将填充” 然后,我将该数据与John Hopkin 在 GitHub 上的 COVID 数据集中记录的“确认”和“删除”数据进行比较。

我使用平均绝对误差根据生成的概率和 JHU 数据集中的实际值来计算“确认”和“删除”之间的损失。 我遇到的问题是,当我调用the tf.gradient() function 时,它返回None的列表。 我被困在这里,任何帮助将不胜感激。

这是我正在使用的代码:

训练步骤

# 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))

错误 output

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

loss_valuegenerator.trainable_weights按预期填充。

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

在计算np.array(...)的损失(特别是在y_pred上)之前,尝试将您的调用更改为tf.convert_to_tensor(...) 您需要通过将所有内容保存为tf.Tensor来构建适当的符号图。 事实上,确保在 model 参数和损失之间的计算链中的任何地方都没有将任何东西转换为非张量。

我还建议将您的训练过程包装在@tf.function中,以便 Tensorflow 可以将其编译成 static 图表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM