Python Tensorflow:tape.gradient()为GRU层返回None
我使用以下代码构建模型(tensorflow==1.14):Python Tensorflow:tape.gradient()为GRU层返回None,python,tensorflow,recurrent-neural-network,Python,Tensorflow,Recurrent Neural Network,我使用以下代码构建模型(tensorflow==1.14): 类模型(tf.keras.Model): 定义初始化(自): 超级(模型,自我)。\uuuu初始化 self.embedding=tf.keras.layers.embedding(10,5) self.rnn=tf.keras.layers.GRU(100)#GRU和LSTM都不起作用 自最终_层=tf.keras.layers.致密(10) self.loss\u obj=tf.keras.loss.sparsecategoric
类模型(tf.keras.Model):
定义初始化(自):
超级(模型,自我)。\uuuu初始化
self.embedding=tf.keras.layers.embedding(10,5)
self.rnn=tf.keras.layers.GRU(100)#GRU和LSTM都不起作用
自最终_层=tf.keras.layers.致密(10)
self.loss\u obj=tf.keras.loss.sparsecategoricalcross熵(from\u logits=True,reduce='none')
def呼叫(自我,inp):
inp_em=自嵌入(inp)#(批量大小,顺序,嵌入大小)
inp_enc=self.rnn(inp_em)#(批量大小,隐藏大小)
logits=self.final_layer(inp_enc)#(批量大小,类数)
返回登录
模型=模型()
inp=np.random.randint(0,10[5,50],dtype=np.int32)
out=np.random.randint(0,10[5],dtype=np.int32)
使用tf.GradientTape()作为磁带:
logits=模型(inp)
损耗=模型损耗\u对象(out,logits)
打印(丢失)
梯度=磁带梯度(tf.减少平均值(损失),模型.可训练变量)
打印('================可训练变量==============')
对于模型中的v.trainable_变量:
印刷品(五)
打印('===============================')
对于梯度中的g:
印刷品(g)
但当我打印Grident时,输出是:
Tensor(“分类交叉熵/加权损失/Mul:0”,shape=(5,),dtype=float32)
=============可训练变量==========
=============渐变==========
没有一个
没有一个
没有一个
没有一个
张量(“MatMul:0”,shape=(100,10),dtype=float32)
张量(“biaaddgrad:0”,shape=(10,),dtype=float32)
最后一层的Grident运行良好,但GRU层的Grident不工作,等等
我已经尝试了tf.keras.layers.LSTM
和tf.keras.layers.GRU
,同样的问题也存在
更新
最后,我将tf.GradientTape().gradient()
替换为tf.graidents()
:
logits=model(inp)
损耗=模型损耗\u对象(out,logits)
梯度=tf.梯度(tf.减少平均值(损失),模型可训练变量)
渐变效果很好。但是我仍然不知道这两种工具之间有什么区别。我想我需要用磁带观察一些张量。watch()。但我不知道它在哪里,也不知道怎么做。也许会有帮助?