我想实现自动编码器(确切地说是堆叠式卷积自动编码器)
这里我想先预训练每一层然后再微调
所以我为每一层的权重创建了变量
例如。 W_1 = tf.Variable(initial_value, name,trainable=True etc) 第一层
我预训练了第一层的 W_1
然后我想预训练第二层的权重(W_2)
这里我应该使用W_1来计算第二层的输入。
但是 W_1 是可训练的,所以如果我直接使用 W_1 那么 tensorflow 可能会一起训练 W_1。
所以我应该创建 W_1_out 来保持 W_1 的值但不可训练
老实说,我试图修改这个网站的代码
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)
但是它调用错误是因为它使用了未初始化的值
我应该如何复制变量但使其无法预训练下一层?
请您参考如下方法:
不确定是否仍然相关,但无论如何我都会尝试。
一般情况下,我在这种情况下会做以下事情:
根据您正在构建的模型填充(默认)图表,例如对于第一个训练步骤,只需创建您提到的第一个卷积层
W1。当您训练第一层时,您可以在训练完成后存储保存的模型,然后重新加载它并添加第二层所需的操作W2。或者您可以直接在代码中再次从头开始为W1构建整个图,然后为W2添加操作。如果您使用的是 Tensorflow 提供的恢复机制,您的优势在于
W1的权重已经是预训练的。如果您不使用恢复机制,则必须手动设置W1权重,例如通过执行下面代码片段中显示的操作。- 然后,当您设置训练操作时,您可以将变量列表作为
var_list传递给优化器,它明确地告诉优化器哪些参数被更新以最小化损失。如果将其设置为None(默认值),它只使用它可以在tf.trainable_variables()中找到的内容,而tf.trainable_variables()又是所有tf 的集合.Variables可训练的。可能会检查这个 answer , 也基本上说了同样的事情。 - 使用
var_list参数时,图形集合会派上用场。例如。您可以为要训练的每一层创建一个单独的图形集合。该集合将包含每一层的可训练变量,然后您可以非常轻松地检索所需的集合并将其作为var_list参数传递(参见下面的示例和/或上面链接文档中的备注) .
如何覆盖一个变量的值: name是要覆盖的变量的名字,value是一个数组适当的大小和类型,sess 是 session :
variable = tf.get_default_graph().get_tensor_by_name(name)
sess.run(tf.assign(variable, value))
请注意,name 最后需要一个额外的 :0,例如如果层的权重称为 'weights1',则示例中的 name 应为 'weights1:0'。
要将张量添加到自定义集合:使用以下几行内容:
tf.add_to_collection('layer1_tensors', weights1)
tf.add_to_collection('layer1_tensors', some_other_trainable_variable)
请注意,第一行创建了集合,因为它尚不存在,第二行将给定的张量添加到现有集合中。
如何使用自定义集合:现在您可以这样做:
# 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 正如你所暗示的那样在你的问题中。但是,我不太喜欢该选项,因为它要求您将 bool 值传递到填充图形的函数中,这很容易被忽视,因此容易出错。此外,即使您决定这样做,您仍然需要手动恢复不可训练的变量。
