TensorFlow急切执行:AttributeError:';非类型';对象没有属性'_磁带&x27;

TensorFlow急切执行:AttributeError:';非类型';对象没有属性'_磁带&x27;,tensorflow,keras,attributeerror,Tensorflow,Keras,Attributeerror,我正在尝试运行一个自定义构建模型,其中TF处于急切执行状态,但收到以下错误,我真的不知道如何解释: AttributeError回溯(最近一次调用) 在() 17 answer=tf.转换为张量(answers\u train[i],dtype=tf.float32) 18 --->19个等级=等级(模型、发送、任务、回答) 20优化器。应用_梯度(zip(梯度、模型、变量), 21全局\u步骤=tf.train.get\u或\u create\u global\u步骤() 等级(模型、发送、任

我正在尝试运行一个自定义构建模型,其中TF处于急切执行状态,但收到以下错误,我真的不知道如何解释:

AttributeError回溯(最近一次调用)
在()
17 answer=tf.转换为张量(answers\u train[i],dtype=tf.float32)
18
--->19个等级=等级(模型、发送、任务、回答)
20优化器。应用_梯度(zip(梯度、模型、变量),
21全局\u步骤=tf.train.get\u或\u create\u global\u步骤()
等级(模型、发送、任务、目标)
2使用tfe.GradientTape()作为磁带:
3损失值=损失(模型、发送、任务、目标)
---->4返回磁带梯度(损耗值、模型变量)
/Users/sdoneva/anaconda/lib/python3.6/site-packages/tensorflow/python/eager/backprop.py in\uuuuuuuu exit\uuuuuu(self、typ、value、traceback)
715
716定义退出(自身、类型、值、回溯):
-->717磁带。pop_磁带(自动磁带)
718
719 def手表(自我、张量):
/pop_磁带(磁带)中的Users/sdoneva/anaconda/lib/python3.6/site-packages/tensorflow/python/eager/tape.py
60 def pop_磁带(磁带):
61“弹出堆栈中的顶部磁带(如果有)。”
--->62 pywrap_tensorflow.TFE_Py_TapeSetRemove(tape._tape)#pylint:disable=受保护的访问
63
64
AttributeError:“非类型”对象没有属性“\u磁带”
我的输入是转换为张量的数组:

sent=tf.convert\u to\u tensor(上下文\u train[i],dtype=tf.float32)
quest=tf.convert\u to\u tensor(问题训练[i],dtype=tf.float32)
answer=tf.convert\u to\u tensor(answers\u train[i],dtype=tf.float32)
这就是我定义梯度和损失函数的方法:

def梯度(型号、发送、任务、目标):
使用tfe.GradientTape()作为磁带:
损失值=损失(模型、发送、任务、目标)
返回磁带.梯度(损耗值,模型.变量)
def丢失(型号、已发送、任务、y):
预测=模型。预测(发送,任务)
返回tf.keras.loss.categorical_交叉熵(y,预测)
我如何称呼培训:

grads=grad(模型、发送、任务、答案)
优化器。应用梯度(zip(梯度、模型、变量),
全局\u步骤=tf.train.get\u或\u create\u global\u步骤()
为完整起见,以下是模型:

类模型(tf.keras.Model):
定义初始化(自):
超级(模型,自我)。\uuuu初始化
self.embed=tf.keras.layers.embeding(42,50)
self.grucell=tf.keras.layers.grucell(50)
self.rnn=tf.keras.layers.rnn(self.grucell)
self.density=tf.keras.layers.density(42,activation=tf.nn.softmax)
自衰减=tf.keras.layers.dropout(0.3)
def预测(自我、句子、问题):
编码的句子=self.embed(句子)
编码的句子=tf.keras.backend.expand\u dims(编码的句子,轴=-1)
编码的句子=self.rnn(编码的句子)
编码的句子=自我辍学(编码的句子)
编码的问题=self.embed(问题)
encoded_question=tf.keras.backend.expand_dims(encoded_question,axis=-1)
编码的问题=self.rnn(编码的问题)
编码问题=自我辍学(编码问题)
merged=tf.keras.layers.concatenate([编码的句子,编码的问题])
pred=自密实(合并)
pred=tf.keras.backend.expand_dims(pred,axis=1)
返回pred

如果能得到一些帮助来了解背景中发生了什么,那就太好了。

您需要调用
tape.gradient
,在
块的范围之外。特别是,将
grad
功能更改为以下内容:

def grad(model, sent, quest, targets):
    with tfe.GradientTape() as tape:
      loss_value = loss(model, sent, quest, targets)
    return tape.gradient(loss_value, model.variables)

确实是这样,谢谢。然而,由于某些原因,与在本地TF中实现的相同模型相比,该训练极其缓慢。。。