我一直在尝试从我的图层中获取可训练的变量,但找不到解决方法。所以这是我尝试过的:
我尝试直接访问Dense或Conv2D对象的内核和bias属性,但无济于事。我得到的结果类型是“密集对象没有属性'kernel'”。
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和weights。
但是,在前进通过之前,我收到了一个空名单。为了使事情更加清楚:
with tf.GradientTape() as tape:
print(dense_layers[0].trainable_variables)
self.forward_pass(X)
self.compute_loss()
print(dense_layers[0].trainable_variables)
在上面的代码中,trainable_variables属性在执行self.forward_pass之前是一个空列表。但是,在此之后,我可以检索内核并偏向numpy数组。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句