Tensorflow 在哪些情况下,我们在TF2中的tf.keras.Model的可训练_权重上使用属性trainable_变量,反之亦然?

Tensorflow 在哪些情况下,我们在TF2中的tf.keras.Model的可训练_权重上使用属性trainable_变量,反之亦然?,tensorflow,keras,tensorflow2.0,Tensorflow,Keras,Tensorflow2.0,我正在研究如何在TF2中进行迁移学习,我看到在TF2中,他们使用属性trainable_variables引用模型的可训练变量,但在这一过程中,他们使用TF.keras.model的属性trainable_weights 我用一个简单的模型检查了这两个属性,它们给出了相同的结果 import tensorflow as tf print(tf.__version__) inputs = tf.keras.layers.Input(shape=[64, 64, 3]) x = tf.keras

我正在研究如何在TF2中进行迁移学习,我看到在TF2中,他们使用属性
trainable_variables
引用模型的可训练变量,但在这一过程中,他们使用
TF.keras.model
的属性
trainable_weights

我用一个简单的模型检查了这两个属性,它们给出了相同的结果

import tensorflow as tf
print(tf.__version__)

inputs = tf.keras.layers.Input(shape=[64, 64, 3])

x = tf.keras.layers.Conv2D(128, kernel_size=3, strides=2)(inputs)
x = tf.keras.layers.BatchNormalization()(x)
x = tf.keras.layers.LeakyReLU(alpha=0.2)(x)

model = tf.keras.Model(inputs=inputs, outputs=x)

print("\nTrainable weights")
vars_model = [var.name for var in model.trainable_weights]
print(*vars_model, sep="\n")

print("\nTrainable variables")
vars_model = [var.name for var in model.trainable_variables]
print(*vars_model, sep="\n")
输出:

2.2.0

Trainable weights
conv2d/kernel:0
conv2d/bias:0
batch_normalization/gamma:0
batch_normalization/beta:0

Trainable variables
conv2d/kernel:0
conv2d/bias:0
batch_normalization/gamma:0
batch_normalization/beta:0
我检查了这一点,并试图遵循这两个属性的定义:
trainable\u variables
似乎是和
trainable\u weights
似乎是,因为
td.keras.Model
也继承自
network.network
。前者似乎返回
可训练的\u权重
变量。但是,我不确定这种情况是否在“所有”情况下都会发生


因此,我想知道在哪些情况下,我们使用
trainable\u变量
超过
trainable\u权重
,反之亦然?为什么呢?

它们在Tensorflow 2.2.0版中都是相同的。如果您进入基本层的源代码-(单击“在GitHub上查看源代码”),您可以找到以下分配这是所有层从中继承的类。

  @property
  @doc_controls.do_not_generate_docs
  def trainable_variables(self):
    return self.trainable_weights

  @property
  @doc_controls.do_not_generate_docs
  def non_trainable_variables(self):
    return self.non_trainable_weights

希望这能回答你的问题。快乐学习。

可训练的变量=可训练的权重。但是,它们是权重矩阵的数量,不像可训练的参数。

奇怪的是,这些属性似乎没有出现在tf.keras.Model一章中。根据我对Tensorflow代码库的理解,
可训练的变量
是针对面向用户的API的,而
trainable_weights
则是为内部API保留的,用于在将来的版本中添加功能,或者是对过去版本的重新命名。不管怎样,到目前为止,这两个版本都是相同的。@SusmitAgrawal,它们来自过去的版本是有道理的。引起我注意的是这些属性在不同的官方文档中的使用。例如,到Keras文件的链接,使用了
可训练的重量
,于2020年5月更新。所以,我想也许他们用的不同。Thanks@K.博格丹-希望我们已经回答了你的问题。如果你对答案感到满意,请接受并投票。谢谢。所以,正如@SusmitAgrawal所指出的,它们可能来自过去的版本,对吗?也许这就是为什么它们被用于框架的不同文档中。也许,是的。但是找不到支持该声明的文档。如果你满意的话,请你接受并投赞成票。