在 Tensorflow 中重用层权重
Reusing layer weights in Tensorflow
我正在使用 tf.slim 来实现自动编码器。我与以下架构完全卷积:
[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] =>
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] =>
[conv_transpose, outputs = 1]
它必须是完全卷积的,我不能做池化(更大问题的局限性)。我想使用固定重量,所以
encoder_W_3 = decoder_W_1_Transposed
(所以第一个解码器层的权重是最后一个编码器层的权重,转置)。
如果我以常规方式重用权重,tfslim 允许您重用它们,即 reuse = True,然后只提供您要重用的层的范围名称,我会遇到大小问题:
ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25).
如果您不转置之前模型的权重,这是有道理的。有谁知道我如何转置这些权重?
PS:我知道这很抽象而且很麻烦,但我在 tfslim 之上使用自定义 api,所以我不能 post此处的代码示例。
Does anyone have an idea on how I can transpose those weights?
换位很简单:
new_weights = tf.transpose(weights, perm=[0, 1, 3, 2])
将交换最后两个轴。
但是,正如@Seven 提到的,这不足以解决错误,因为权重总数发生了变化。
我正在使用 tf.slim 来实现自动编码器。我与以下架构完全卷积:
[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] =>
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] =>
[conv_transpose, outputs = 1]
它必须是完全卷积的,我不能做池化(更大问题的局限性)。我想使用固定重量,所以
encoder_W_3 = decoder_W_1_Transposed
(所以第一个解码器层的权重是最后一个编码器层的权重,转置)。
如果我以常规方式重用权重,tfslim 允许您重用它们,即 reuse = True,然后只提供您要重用的层的范围名称,我会遇到大小问题:
ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25).
如果您不转置之前模型的权重,这是有道理的。有谁知道我如何转置这些权重?
PS:我知道这很抽象而且很麻烦,但我在 tfslim 之上使用自定义 api,所以我不能 post此处的代码示例。
Does anyone have an idea on how I can transpose those weights?
换位很简单:
new_weights = tf.transpose(weights, perm=[0, 1, 3, 2])
将交换最后两个轴。
但是,正如@Seven 提到的,这不足以解决错误,因为权重总数发生了变化。