tensorflow复制变量,但无法训练以预训练下一层

2024-09-26 22:09:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我想实现自动编码器(确切地说是堆叠卷积自动编码器)

这里我想先对每一层进行预处理,然后再进行微调

所以我为每个层的权重创建了变量

示例W_1=tf.变量(初始值,名称,trainable=True等)

我预先训练了第一层

然后我要预先计算第二层的重量(W峎2)

这里我应该使用W_1来计算第二层的输入。在

但是W_1是可训练的,因此如果我直接使用W_1,则tensorflow可以一起训练W_1。在

所以我应该创建一个能保持wu1值但不可训练的wu1

老实说,我试图修改这个网站的代码

https://github.com/cmgreen210/TensorFlowDeepAutoencoder/blob/master/code/ae/autoencoder.py

在第102行,它通过以下代码创建变量

self[name_w + "_fixed"] = tf.Variable(tf.identity(self[name_w]),
                                            name=name_w + "_fixed",
                                            trainable=False)

但是它调用错误,因为它使用未初始化的值

我该如何复制变量,但使其不可训练,以预训练下一层??在


Tags: 代码nameself名称true示例tf编码器
1条回答
网友
1楼 · 发布于 2024-09-26 22:09:05

不确定是否仍然相关,但我还是会试试。在

一般来说,在这种情况下,我要做的是:

  • 根据您正在构建的模型填充(默认)图,例如,对于第一个培训步骤,只需创建您提到的第一个卷积层W1。当您训练第一层时,您可以在训练结束后存储保存的模型,然后重新加载它并添加第二层W2所需的操作。或者您可以直接在代码中从头开始为W1构建整个图,然后为W2添加操作。

  • {1}如果你已经使用cdflow提供的权值恢复机制,你将拥有。如果不使用还原机制,则必须手动设置W1权重,例如通过执行下面代码片段中所示的操作。

  • 然后,当您设置训练操作时,您可以将变量列表作为var_list传递给优化器,优化器显式地告诉优化器哪些参数被更新,以便将损失降到最低。如果将其设置为None(默认值),则它只使用在tf.trainable_variables()中可以找到的内容,后者又是所有可训练的tf.Variables的集合。也可以检查这个answer,它基本上说的是同一件事。在
  • 当使用var_list参数时,图形集合非常有用。E、 你可以为你想训练的每一层创建一个单独的图形集合。该集合将包含每个层的可训练变量,然后您可以很容易地检索所需的集合并将其作为var_list参数传递(请参见下面的示例和/或上述链接文档中的备注)。在

如何重写变量的值:name是要重写的变量的名称,value是大小和类型适当的数组,sess是会话:

variable = tf.get_default_graph().get_tensor_by_name(name)
sess.run(tf.assign(variable, value))

注意,name最后需要一个额外的:0,因此,例如,如果你的层的权重被称为'weights1',那么示例中的name应该是{}。在

要将张量添加到自定义集合中:请按照以下行使用:

^{pr2}$

注意,第一行创建集合是因为它还不存在,第二行将给定的张量添加到现有集合中。在

如何使用自定义集合:现在可以执行以下操作:

# loss = some tensorflow op computing the loss
var_list = tf.get_collection_ref('layer1_tensors')
optim = tf.train.AdamOptimizer().minimize(loss=loss, var_list=var_list)

您还可以使用tf.get_collection('layer_tensors'),它将返回集合的副本。在

当然,如果您不想这样做,您可以使用trainable=False为所有变量创建图,您不想像您在问题中暗示的那样是可训练的。但是,我不太喜欢这个选项,因为它要求您将布尔值传递到填充图形的函数中,这很容易被忽略,因此容易出错。而且,即使您决定这样做,您仍然需要手动恢复不可训练的变量。在

相关问题 更多 >

    热门问题