为什么model.get_weights()为空是Tensorflow错误?
我正在尝试实现MAML。我有一个问题,所以我写了一个简单的版本,可以显示我的困惑。 如果您使用“optimizer.apply_gradients”更新梯度,它可以通过“model.get_weights()”获得模型权重。但如果您自己更新梯度,它只会通过“model.get_weights()”获得空列表为什么model.get_weights()为空是Tensorflow错误?,tensorflow,gradient-descent,Tensorflow,Gradient Descent,我正在尝试实现MAML。我有一个问题,所以我写了一个简单的版本,可以显示我的困惑。 如果您使用“optimizer.apply_gradients”更新梯度,它可以通过“model.get_weights()”获得模型权重。但如果您自己更新梯度,它只会通过“model.get_weights()”获得空列表 我找不到我的代码问题,所以我认为这是tensorflow错误。请帮助我!!!我睡不着,因为这个错误。这不是tensorflow错误:)你正在用基本的张量更新模型的变量,所以在第二次迭代中,当
我找不到我的代码问题,所以我认为这是tensorflow错误。请帮助我!!!我睡不着,因为这个错误。这不是tensorflow错误:)你正在用基本的张量更新模型的
变量,所以在第二次迭代中,当你调用.gradient(support\u loss,model.trainable\u Variables)
你的模型实际上不再有任何可训练的变量。
这样修改您的代码以使用操作变量的方法:
import tensorflow as tf
from tensorflow.keras import layers, activations, losses, Model, optimizers, models
import numpy as np
class MAMLmodel(Model):
def __init__(self):
super().__init__()
self.Dense1 = layers.Dense(2, input_shape=(3, ))
self.Dense2 = layers.Dense(1)
def forward(self, inputs):
x = self.Dense1(inputs)
x = self.Dense2(x)
return x
def compute_loss(y_true, y_pred):
return losses.mean_squared_error(y_true, y_pred)
x1 = [[[1], [1], [1]],
[[1], [1], [1]],
[[1], [1], [1]]]
y1 = [[[0], [0], [0]],
[[0], [0], [0]],
[[0], [0], [0]]]
x1 = tf.convert_to_tensor(x1)
y1 = tf.convert_to_tensor(y1)
inner_train_step = 2
batch_size = 3
lr_inner = 0.001
model = MAMLmodel()
inner_optimizer = optimizers.Adam()
for i in range(batch_size):
# If inner_train_step is 2 or bigger, the gradient is empty list.
for inner_step in range(inner_train_step):
with tf.GradientTape() as support_tape:
support_tape.watch(model.trainable_variables)
y_pred = model.forward(x1[i])
support_loss = compute_loss(y1[i], y_pred)
gradients = support_tape.gradient(support_loss, model.trainable_variables)
# inner_optimizer.apply_gradients(zip(gradients, model.trainable_variables))
print(f'Number of computed gradients: {len(gradients)}')
k = 0
for j in range(len(model.layers)):
model.layers[j].kernel.assign_sub(tf.multiply(lr_inner, gradients[k]))
model.layers[j].bias.assign_sub(tf.multiply(lr_inner, gradients[k + 1]))
k += 2
# If you use 'optimizer.apply_gradients' update gradient,it can print weights.
# But if you update gradient by yourself,it just print empty list.
print(f'Get weights: {model.get_weights()}')
import tensorflow as tf
from tensorflow.keras import layers, activations, losses, Model, optimizers, models
import numpy as np
class MAMLmodel(Model):
def __init__(self):
super().__init__()
self.Dense1 = layers.Dense(2, input_shape=(3, ))
self.Dense2 = layers.Dense(1)
def forward(self, inputs):
x = self.Dense1(inputs)
x = self.Dense2(x)
return x
def compute_loss(y_true, y_pred):
return losses.mean_squared_error(y_true, y_pred)
x1 = [[[1], [1], [1]],
[[1], [1], [1]],
[[1], [1], [1]]]
y1 = [[[0], [0], [0]],
[[0], [0], [0]],
[[0], [0], [0]]]
x1 = tf.convert_to_tensor(x1)
y1 = tf.convert_to_tensor(y1)
inner_train_step = 2
batch_size = 3
lr_inner = 0.001
model = MAMLmodel()
inner_optimizer = optimizers.Adam()
for i in range(batch_size):
# If inner_train_step is 2 or bigger, the gradient is empty list.
for inner_step in range(inner_train_step):
with tf.GradientTape() as support_tape:
support_tape.watch(model.trainable_variables)
y_pred = model.forward(x1[i])
support_loss = compute_loss(y1[i], y_pred)
gradients = support_tape.gradient(support_loss, model.trainable_variables)
# inner_optimizer.apply_gradients(zip(gradients, model.trainable_variables))
print(f'Number of computed gradients: {len(gradients)}')
k = 0
for j in range(len(model.layers)):
model.layers[j].kernel.assign_sub(tf.multiply(lr_inner, gradients[k]))
model.layers[j].bias.assign_sub(tf.multiply(lr_inner, gradients[k + 1]))
k += 2
# If you use 'optimizer.apply_gradients' update gradient,it can print weights.
# But if you update gradient by yourself,it just print empty list.
print(f'Get weights: {model.get_weights()}')