Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算Keras中多输出模型的梯度,并将其转换为Tensorflow数据类型错误_Python_Keras_Tensorflow2.0 - Fatal编程技术网

Python 计算Keras中多输出模型的梯度,并将其转换为Tensorflow数据类型错误

Python 计算Keras中多输出模型的梯度,并将其转换为Tensorflow数据类型错误,python,keras,tensorflow2.0,Python,Keras,Tensorflow2.0,我有一个Keras的多输出模型(精确地说是18个输出),每个输出都有一个损失函数。我试图在更快的RCNN中模仿区域建议网络。在培训之前,我想确保我的模型的梯度是有序的,我有一个片段,如下所示: with tf.GradientTape() as tape: loss = RegionProposalNetwork.evaluate(first_batch)[0] t = tape.watched_variables() grads = tape.gradient(loss, Re

我有一个Keras的多输出模型(精确地说是18个输出),每个输出都有一个损失函数。我试图在更快的RCNN中模仿区域建议网络。在培训之前,我想确保我的模型的梯度是有序的,我有一个片段,如下所示:

with tf.GradientTape() as tape:
    loss = RegionProposalNetwork.evaluate(first_batch)[0]
    t = tape.watched_variables()
grads = tape.gradient(loss, RegionProposalNetwork.trainable_variables)
print(grads)
变量
first\u batch
通过使用
take()
从tf.data对象获得。功能。返回值loss是一个大小为19的数组,其中loss[0]是所有损失函数的总和,也称为总损失。在打印渐变阵列之前,我收到了错误消息/跟踪:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.2\plugins\python-ce\helpers\pydev\pydevd.py", line 1448, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.2\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/Users/James/PycharmProjects/Masters/models/MoreTesting.py", line 469, in <module>
    grads = tape.gradient(loss, RegionProposalNetwork.trainable_variables)
  File "C:\Users\James\Anaconda3\envs\masters\lib\site-packages\tensorflow\python\eager\backprop.py", line 1034, in gradient
    if not backprop_util.IsTrainable(t):
  File "C:\Users\James\Anaconda3\envs\masters\lib\site-packages\tensorflow\python\eager\backprop_util.py", line 30, in IsTrainable
    dtype = dtypes.as_dtype(dtype)
  File "C:\Users\James\Anaconda3\envs\masters\lib\site-packages\tensorflow\python\framework\dtypes.py", line 650, in as_dtype
    (type_value,))
TypeError: Cannot convert value 29.614826202392578 to a TensorFlow DType.
回溯(最近一次呼叫最后一次):
文件“C:\Program Files\JetBrains\PyCharm Community Edition 2020.2\plugins\python ce\helpers\pydev\pydevd.py”,第1448行,在_exec中
pydev_imports.execfile(文件、全局、局部)#执行脚本
文件“C:\Program Files\JetBrains\PyCharm Community Edition 2020.2\plugins\python ce\helpers\pydev\\u pydev\u imps\\u pydev\u execfile.py”,第18行,在execfile中
exec(编译(内容+“\n”,文件,'exec'),全局,loc)
文件“C:/Users/James/PycharmProjects/Masters/models/MoreTesting.py”,第469行,在
梯度=磁带.梯度(损失,区域建议网络.可训练变量)
文件“C:\Users\James\Anaconda3\envs\masters\lib\site packages\tensorflow\python\eager\backprop.py”,第1034行,渐变
如果不是backprop_util.IsTrainable(t):
文件“C:\Users\James\Anaconda3\envs\masters\lib\site packages\tensorflow\python\eager\backprop\u util.py”,第30行,可编辑
dtype=dtypes.as\u dtype(dtype)
文件“C:\Users\James\Anaconda3\envs\masters\lib\site packages\tensorflow\python\framework\dtypes.py”,第650行,as\u dtype
(类型_值,))
TypeError:无法将值29.614826202392578转换为TensorFlow数据类型。
其中,float
29.614826202392578
是对模型求值函数调用的总体损失。我不确定这个错误是什么意思。作为参考,所有输入数据类型和中间层结果都是tf.float32值的张量。任何见解都值得赞赏


编辑:如果我尝试使用
tf.convert_to_tensor
将损失转换为张量,我将不再得到错误,但是返回的梯度都是零。我已经测试过,我的模型权重已更新,将调用
fit()
,因此出现问题。

我遇到的问题是返回值如下所述:

返回标量测试损失(如果模型只有一个输出且没有 度量)或标量列表(如果模型有多个输出和/或 指标)。属性model.metrics\u名称将显示 标量输出的标签

不是张量。类似地,model.predict()也不起作用,因为结果是一个numpy数组,破坏了梯度计算。为了计算梯度,如果我只是调用测试输入数据上的模型,然后计算关于地面真值的损失函数,即

with tf.GradientTape() as tape:
     model_output = model(input)
     loss = loss_fn(output, model_output)
gradients = tape.gradient(loss, model.trainable_variables)

# And if you are using a generator, 
batch = data_iterator.get_next()
input = batch[0]
output = batch[1]