_biubiubiu_ 2021-09-28 11:02 采纳率: 0%
浏览 81

tensorflow2.x 更新时梯度为none的问题

问题如下图,部分操作简化,最近在尝试实现meta SGD方法,使用tf.GrandientTape 时遇到梯度为none的问题,去百度找了一圈还是找不到哪里出错,各位仙男仙女们帮忙看看,感激不尽
下面为代码

with tf.GradientTape() as tape:
    with tf.GradientTape() as tape_1:
        loss_1 = operation_A  # 计算损失
    grads_1 = tape_1.gradient(loss_1, meta_model.trainable_variables)  # 此处梯度没问题

    # 更新权重
    # task_lr形状与grads相同(也就是和trainable_variables形状完全相同),且为变量,对模型权重进行更新
    adapted_params = []
    for i in range(len(task_lr)):
        adapted_params.append(
            meta_model.trainable_variables[i] - tf.multiply(task_lr[i], grads_1[i]))  # 步骤1

    weights = operation_C   # 载入更新的权重adapted_params
    loss = operation_B  # 在新权重下计算损失

# 对 meta_model.trainable_variables 和 task_lr 计算梯度
# 这次更新不只对trainable_variables,并且对task_lr
# 查看梯度, 其中属于trainable_variables的梯度均正常,但是task_lr的梯度全部为none

grads = tape.gradient(loss, meta_model.trainable_variables + task_lr)
optimizer.apply_gradients(zip(grads, meta_model.trainable_variables + task_lr))

# task_lr 形状与trainable_variables完全一样且类型为变量,并且在上面“步骤1”处也使用了(也仅在步骤1处使用),
# 且上述操作均在 “ with tf.GradientTape() as tape: ” 下进行,为什么求不出task_lr梯度呢?
# 是因为task_lr没有直接参与loss计算么?

梯度图如下

img

  • 写回答

1条回答 默认 最新

  • 「已注销」 2021-09-28 13:25
    关注

    你这个代码写的有问题啊

    评论

报告相同问题?

问题事件

  • 创建了问题 9月28日

悬赏问题

  • ¥20 指导如何跑通以下两个Github代码
  • ¥15 大家知道这个后备文件怎么删吗,为啥这些文件我只看到一份,没有后备呀
  • ¥15 C++为什么这个代码没报错运行不出来啊
  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题