Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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 函数中的嵌套渐变带(TF2.0)_Python_Tensorflow_Machine Learning_Deep Learning_Tensorflow2.0 - Fatal编程技术网

Python 函数中的嵌套渐变带(TF2.0)

Python 函数中的嵌套渐变带(TF2.0),python,tensorflow,machine-learning,deep-learning,tensorflow2.0,Python,Tensorflow,Machine Learning,Deep Learning,Tensorflow2.0,我尝试实现MAML。因此,我需要一份模型副本(模型副本)进行一步培训, 然后我需要我的meta_模型在丢失模型副本的情况下进行训练 我想在函数中对模型副本进行培训。 如果我把我的代码复制到函数中,我就得不到合适的梯度(它们都是零) 看起来,这些图是不相连的-我如何连接这些图 知道我做错了什么吗?我观察了很多变量,但这似乎没有什么区别。 以下是重现此问题的代码: 将tensorflow导入为tf 将tensorflow.keras导入为keras 导入tensorflow.keras.backen

我尝试实现MAML。因此,我需要一份模型副本(模型副本)进行一步培训, 然后我需要我的meta_模型在丢失模型副本的情况下进行训练

我想在函数中对模型副本进行培训。 如果我把我的代码复制到函数中,我就得不到合适的梯度(它们都是零)

看起来,这些图是不相连的-我如何连接这些图

知道我做错了什么吗?我观察了很多变量,但这似乎没有什么区别。

以下是重现此问题的代码:

将tensorflow导入为tf
将tensorflow.keras导入为keras
导入tensorflow.keras.backend作为keras\u后端
def复制_型号(型号):
复制的_model=keras.Sequential()
复制的_model.add(keras.layers.Dense(5,输入_形状=(1,))
复制的_模型添加(keras.layers.Dense(1))
已复制\u模型。设置\u权重(模型。获取\u权重())
返回模型
def计算损耗(型号,x,y):
logits=模型(x)#我的模型预测
mse=keras_backend.mean(keras.loss.mean_squared_error(y,logits))#计算预测和标签/真相之间的损失
返回mse,登录
#在外梯度带中学习的meta_模型
meta_模型=keras.Sequential()
meta_model.add(keras.layers.Dense(5,输入_形状=(1,))
meta_模型添加(keras.layers.Dense(1))
#培训优化器
optimizer=keras.optimizers.Adam()
#用于计算模型参数的函数
def do_计算(x、y、元模型):
使用tf.GradientTape()作为gg:
模型复制=复制模型(元模型)
gg.手表(x)
观察(元模型、可训练变量)
gg.watch(模型副本、可训练变量)
损失,=计算损失(模型副本,x,y)
梯度=gg梯度(损失、模型副本、可训练变量)
优化器。应用梯度(zip(梯度、模型副本、可训练的变量))
返回模型副本
#培训投入
x=tf.常数(3.0,形状=(1,1,1))
y=tf.常数(3.0,形状=(1,1,1))
将tf.GradientTape()作为g:
g、 手表(x)
g、 手表(y)
模型复制=计算(x,y,元模型)
g、 观察(模型副本。可训练变量)
#计算模型副本的损失
测试损耗,=计算损耗(模型副本,x,y)
#为meta_模型更新构建渐变
梯度=梯度(测试损失、元模型、可训练变量)
#渐变总是没有!?!!11精灵
优化器。应用梯度(zip(梯度、元、元模型、可训练的变量))
提前感谢您的帮助。

我找到了一个解决方案: 我需要以某种方式“连接”元模型和模型副本

有人能解释一下为什么这样做,以及我如何使用“合适的”优化器来实现这一点吗?

将tensorflow导入为tf
将tensorflow.keras导入为keras
导入tensorflow.keras.backend作为keras\u后端
def复制_型号(型号):
复制的_model=keras.Sequential()
复制的_model.add(keras.layers.Dense(5,输入_形状=(1,))
复制的_模型添加(keras.layers.Dense(1))
已复制\u模型。设置\u权重(模型。获取\u权重())
返回模型
def计算损耗(型号,x,y):
logits=模型(x)#我的模型预测
mse=keras_backend.mean(keras.loss.mean_squared_error(y,logits))#计算预测和标签/真相之间的损失
返回mse,登录
#在外梯度带中学习的meta_模型
meta_模型=keras.Sequential()
meta_model.add(keras.layers.Dense(5,输入_形状=(1,))
meta_模型添加(keras.layers.Dense(1))
#培训优化器
optimizer=keras.optimizers.Adam()
#用于计算模型参数的函数
def do_计算(元模型,x,y,gg,α=0.01):
模型复制=复制模型(元模型)
损失,=计算损失(模型副本,x,y)
梯度=gg梯度(损失、模型副本、可训练变量)
k=0
对于范围内的层(len(model_copy.layers)):
#通过梯度下降计算自适应参数
#\theta\u i'=\theta-\alpha*梯度
model_copy.layers[layer].kernel=tf.subtract(meta_model.layers[layer].kernel,
tf.乘法(α,梯度[k]))
模型\复制.layers[layer].bias=tf.subtract(元\模型.layers[layer].bias,
tf.乘法(α,梯度[k+1]))
k+=2
返回模型副本
将tf.GradientTape()作为g:
#培训投入
x=tf.常数(3.0,形状=(1,1,1))
y=tf.常数(3.0,形状=(1,1,1))
调整的_模型=[]
#模型复制=元模型
使用tf.GradientTape()作为gg:
模型复制=计算(元模型,x,y,gg)
#计算模型副本的损失
测试损耗,=计算损耗(模型副本,x,y)
#为meta_模型更新构建渐变
梯度=梯度(测试损失、元模型、可训练变量)
#渐变有效。为什么?
优化器。应用梯度(zip(梯度、元、元模型、可训练的变量))