Python 3.x Tensorflow梯度带在两次计算同一梯度时给出不同的结果

Python 3.x Tensorflow梯度带在两次计算同一梯度时给出不同的结果,python-3.x,tensorflow2.0,eager-execution,gradienttape,Python 3.x,Tensorflow2.0,Eager Execution,Gradienttape,我正在试验TF2.0。 我想记录我的神经网络的梯度和权重标准。为此,我使用以下代码 def get_weights_norm(层,优化,log=False): """ 计算层权重的范数并将其保存为tf.summary 如果log=true,它也会打印它 """ w_l=层可训练重量 name=layer.name 如果记录: 打印(“图层”+名称) 对于w/U l中的w: shape=str(w.shape.as_list()) norm=tf.norm(w.numpy(),name=“norm

我正在试验TF2.0。 我想记录我的神经网络的梯度和权重标准。为此,我使用以下代码

def get_weights_norm(层,优化,log=False):
"""
计算层权重的范数并将其保存为tf.summary
如果log=true,它也会打印它
"""
w_l=层可训练重量
name=layer.name
如果记录:
打印(“图层”+名称)
对于w/U l中的w:
shape=str(w.shape.as_list())
norm=tf.norm(w.numpy(),name=“norm”).numpy()
s_name=name+“_layer_norm/shape-”+shape
标量(s_名称,norm,step=optim_iters)
如果记录:
打印(“\t重量标准:%s形状:%s”%(标准,形状))
def get_grad_norm(g_磁带、损耗值、层、优化、日志=False):
"""
计算关于层权重的损失梯度范数,并将其保存为tf.summary
如果log=true,它也会打印它
"""
梯度=g_带。梯度(损失值,层。可训练重量)
name=layer.name
如果记录:
打印(“图层”+名称)
对于w级:
shape=str(w.shape.as_list())
norm=tf.norm(w.numpy(),name=“norm”).numpy()
s_name=name+“_layer\u grad\u norm/shape-”+shape
标量(s_名称,norm,step=optim_iters)
如果记录:
打印(“\tGrad范数:%s形状:%s”%(范数,形状))
打印(“{.2E}”。格式(标准))
以下是培训循环:

用于范围内的历元(历元):
打印('纪元%d'(纪元,)的开始)
#迭代数据集的批处理。
对于枚举(序列数据集)中的步骤(x\u批次序列,y\u批次序列):
#打开GradientTape以记录运行的操作
#在前进过程中,这将启用自动微分。
使用tf.GradientTape(persistent=True)作为磁带:
#运行该层的向前传递。
logits=模型(x_批量列车)#此小批量的logits
#计算此小批量的损失值。
损耗值=损耗fn(批量生产,物流)
#使用渐变带自动检索
#可训练变量相对于损失的梯度。
梯度=胶带.梯度(损失值,模型.可训练重量)
优化器。应用梯度(zip(梯度、模型、可训练的权重))
g_bidi=磁带.梯度(损失值,模型.获取层(“bi_lstm”).可训练的重量)
g_out=磁带梯度(损耗值、模型获取层(“输出”)。可训练权重)
g_稠密=磁带.梯度(损失_值,模型.获取_层(“稠密”).可训练的_权重)
打印(“输出层”)
w_out=模型。获取层(“输出”)。可训练权重
打印(model.get_层(“输出”).name)
打印(float(tf.norm(w_out[0].numpy(),name=“norm”))
打印(“\tWeights norm:%s shape:%s”%(tf.norm(w_out[0].numpy(),name=“norm”),w_out[0].shape))
打印(“\tWeights norm:%s shape:%s”%(tf.norm(w_out[1].numpy(),name=“norm”),w_out[1].shape))
打印()
打印(“\t||dE/dw|out | |=%s形状:%s”%(tf.norm(g|out[0].numpy(),name='norm'),g|out[0].shape))
打印(“\t||dE/db|u out | |=%s形状:%s”%(tf.norm(g|u out[1].numpy(),name='norm'),g|u out[1].shape))
get_weights_norm(model.get_layer(“输出”)、optimizer.iterations、True)
get_grad_norm(磁带、损耗值、模型.get_层(“输出”)、optimizer.iterations、True)
打印()
打印()
打印(“双向”)
w_bid=模型。获取层(“bi_lstm”)。可训练重量
打印(“\tWeights fwd norm:%s形状%s:”%(tf.norm(w_bid[0].numpy(),name=“norm”),w_bid[0].shape))
打印(“\tWeights fwd_rec norm:%s形状%s:”%(tf.norm(w_bid[1].numpy(),name=“norm”),w_bid[1].shape))
打印(“\tWeights fwd bias norm:%s shape%s:”%(tf.norm(w_bid[2].numpy(),name=“norm”),w_bid[2].shape))
打印(“\t宽度bwd规范:%s形状%s:”%(tf.norm(w_bid[3].numpy(),name=“norm”),w_bid[3].shape))
打印(“\tWeights bwd_rec norm:%s shape%s:”%(tf.norm(w_bid[4].numpy(),name=“norm”),w_bid[4].shape))
打印(“\t宽度bwd偏差规范:%s形状%s:”%(tf.norm(w_bid[5].numpy(),name=“norm”),w_bid[5].shape))
打印()
打印(“\t||dE/dw|forw||=%s形状:%s”%(tf.norm(g|u bidi[0].numpy(),name='norm'),g|u bidi[0].shape))
打印(“\t | | dE/dw | forw | | | | rec | |=%s形状:%s”%(tf.norm(g|u bidi[1].numpy(),name='norm'),g|bidi[1].shape))
打印(“\t | | dE/dw | forw | | | |=%s形状:%s”%(tf.norm(g|u bidi[2].numpy(),name='norm'),g|bidi[2].shape))
打印(“\t||dE/dw|bckw | |=%s形状:%s”%(tf.norm(g|u bidi[3].numpy(),name='norm'),g|u bidi[3].shape))
打印(“\t||dE/dw|bkw|rec||=%s形状:%s”%(tf.norm(g|u bidi[4].numpy(),name='norm'),g|bidi[4].shape))
打印(“\t | | dE/dw | bkw | u bias | | |=%s形状:%s”%(tf.norm(g|u bidi[5].numpy(),name='norm'),g|bidi[5].shape))
get_weights_norm(model.get_layer(“bi_lstm”)、optimizer.iterations、True)
get_grad_norm(磁带、损耗值、模型、get_层(“bi_lstm”)、optimizer.iterations、True)
问题: 运行脚本时,我得到的输出层的梯度范数值相同,但双向层的范数值不同(bi_lstm)

以下是输出:

    Weights norm: tf.Tensor(0.33847392, shape=(), dtype=float32) shape: (64, 1)
    Weights norm: tf.Tensor(88.14, shape=(), dtype=float32) shape: (1,)

     ||dE/dw_out|| = tf.Tensor(1.7349662, shape=(), dtype=float32) shape: (64, 1)
     ||dE/db_out|| = tf.Tensor(0.31759995, shape=(), dtype=float32) shape: (1,)
Layer output
    Weights norm: 0.33847392 shape: [64, 1]
    Weights norm: 88.14 shape: [1]


Bidirect
    Weights fwd norm: tf.Tensor(13.112313, shape=(), dtype=float32) shape (256, 128):
    Weights fwd_rec norm: tf.Tensor(5.691354, shape=(), dtype=float32) shape (32, 128):
    Weights fwd bias norm: tf.Tensor(11.340048, shape=(), dtype=float32) shape (128,):
    Weights bwd norm: tf.Tensor(13.147353, shape=(), dtype=float32) shape (256, 128):
    Weights bwd_rec norm: tf.Tensor(5.685838, shape=(), dtype=float32) shape (32, 128):
    Weights bwd bias norm: tf.Tensor(11.3102255, shape=(), dtype=float32) shape (128,):

     ||dE/dw_forw|| = tf.Tensor(9.418793e-07, shape=(), dtype=float32) shape: (256, 128)
     ||dE/dw_forw_rec|| = tf.Tensor(3.8971484e-06, shape=(), dtype=float32) shape: (32, 128)
     ||dE/dw_forw_bias|| = tf.Tensor(1.0172046e-06, shape=(), dtype=float32) shape: (128,)
     ||dE/dw_bckw|| = tf.Tensor(9.837944e-07, shape=(), dtype=float32) shape: (256, 128)
     ||dE/dw_bkw_rec|| = tf.Tensor(4.134917e-06, shape=(), dtype=float32) shape: (32, 128)
     ||dE/dw_bkw_bias|| = tf.Tensor(1.0577168e-06, shape=(), dtype=float32) shape: (128,)
Layer bi_lstm
    Weights norm: 13.112313 shape: [256, 128]
    Weights norm: 5.691354 shape: [32, 128]
    Weights norm: 11.340048 shape: [128]
    Weights norm: 13.147353 shape: [256, 128]
    Weights norm: 5.685838 shape: [32, 128]
    Weights norm: 11.3102255 shape: [128]
Layer bi_lstm
    Grad norm: 0.0 shape: [256, 128]
0.00E+00
    Grad norm: 0.0 shape: [32, 128]
0.00E+00
    Grad norm: 0.0 shape: [128]
0.00E+00
    Grad norm: 0.0 shape: [256, 128]
0.00E+00
    Grad norm: 0.0 shape: [32, 128]
0.00E+00
    Grad norm: 0.0 shape: [128]
0.00E+0
我错过了什么

提前谢谢