gpt4 book ai didi

python - TensorFlow 2.0 如何从 tf.keras.layers 层获取可训练变量,如 Conv2D 或 Dense

转载 作者:行者123 更新时间:2023-12-03 19:43:33 25 4
gpt4 key购买 nike

我一直试图从我的图层中获取可训练的变量,但无法找到使其工作的方法。所以这是我尝试过的:

我曾尝试直接访问 Dense 或 Conv2D 对象的内核和偏差属性,但无济于事。我得到的结果类型是“密集对象没有属性‘内核’”。

trainable_variables.append(conv_layer.kernel)
trainable_variables.append(conv_layer.bias)

同样,我尝试通过以下方式使用属性“trainable_variables”:
trainable_variables.extend(conv_layer.trainable_variables)

据我所知,这应该返回两个变量的列表,权重和偏差变量。但是,我得到的是一个空列表。

知道如何从 TensorFlow 2.0 中的标签获取变量吗?我希望以后能够以类似于以下方式将这些变量提供给优化器:
gradients = tape.gradient(loss, trainable_variables)
optimizer.apply_gradients(zip(gradients, trainable_variables))

编辑:
这是我当前代码的一部分,用作示例并帮助回答问题(希望它是可读的)
from tensorflow.keras.layers import Dense, Conv2D, Conv2DTranspose, Reshape, Flatten

...

class Network:
def __init__(self, params):
weights_initializer = tf.initializers.GlorotUniform(seed=params["seed"])
bias_initializer = tf.initializers.Constant(0.0)

self.trainable_variables = []

self.conv_layers = []
self.conv_activations = []
self.create_conv_layers(params, weights_initializer, bias_initializer)

self.flatten_layer = Flatten()


self.dense_layers = []
self.dense_activations = []
self.create_dense_layers(params, weights_initializer, bias_initializer)

self.output_layer = Dense(1, kernel_initializer=weights_initializer, bias_initializer=bias_initializer)
self.trainable_variables.append(self.output_layer.kernel)
self.trainable_variables.append(self.output_layer.bias)

def create_conv_layers(self, params, weight_init, bias_init):
nconv = len(params['stride'])
for i in range(nconv):
conv_layer = Conv2D(filters=params["nfilter"][i],
kernel_size=params["shape"][i], kernel_initializer=weight_init,
kernel_regularizer=spectral_norm,
use_bias=True, bias_initializer=bias_init,
strides=params["stride"][i],
padding="same", )
self.conv_layers.append(conv_layer)
self.trainable_variables.append(conv_layer.kernel)
self.trainable_variables.append(conv_layer.bias)
self.conv_activations.append(params["activation"])

def create_conv_layers(self, params, weight_init, bias_init):
nconv = len(params['stride'])
for i in range(nconv):
conv_layer = Conv2D(filters=params["nfilter"][i],
kernel_size=params["shape"][i], kernel_initializer=weight_init,
kernel_regularizer=spectral_norm,
use_bias=True, bias_initializer=bias_init,
strides=params["stride"][i],
padding="same", )
self.conv_layers.append(conv_layer)
self.trainable_variables.append(conv_layer.kernel)
self.trainable_variables.append(conv_layer.bias)
self.conv_activations.append(params["activation"])

如您所见,我正在尝试将所有可训练变量收集到一个名为 trainable_variables 的列表属性中。然而,正如我所提到的,这段代码不起作用,因为我在尝试获取这些层对象的内核和偏差属性时出错。

最佳答案

好的,所以我想我发现了问题。

在我使用给定的图层对象之前,可训练变量不可用。运行前向传递后,我可以检索 tf.keras.layers.Layer 对象的属性,如 trainable_variables 和权重。

然而,在我向前传球之前,我收到了一个空 list 。为了让事情更清楚一点:

with tf.GradientTape() as tape:
print(dense_layers[0].trainable_variables)
self.forward_pass(X)
self.compute_loss()
print(dense_layers[0].trainable_variables)

在上面的代码中,在执行 self.forward_pass 之前,属性 trainable_variables 是一个空列表。然而,在它之后,我可以检索内核和偏置 numpy 数组。

关于python - TensorFlow 2.0 如何从 tf.keras.layers 层获取可训练变量,如 Conv2D 或 Dense,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59268822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com