在 Tensorflow 中重用层权重

Posted

技术标签:

【中文标题】在 Tensorflow 中重用层权重【英文标题】:Reusing layer weights in Tensorflow 【发布时间】:2017-07-30 16:58:03 【问题描述】:

我正在使用 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 允许您重用它们,即重用 = 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,所以我不能在这里发布代码示例。

【问题讨论】:

据我所知,Tensorflow 中的权重形状为[filter_height, filter_width, in_channels, out_channels]。我想你对每一层都有相同的过滤器大小,所以当你转置权重时,解码器和编码器应该有对应关系吗?例如,[outputs=1] => [outputs=15] 只能由 [outputs=15]=>[outputs=1] 使用。从错误消息中,我猜15=>25 被分配给了25=>25。但是当这两个层的权重数量不同时,如何共享呢? 【参考方案1】:

有人知道我可以如何转置这些权重吗?

换位很简单:

new_weights = tf.transpose(weights, perm=[0, 1, 3, 2])

将交换最后两个轴。

但是,正如@Seven 所提到的,这不足以解决错误,因为权重的总数发生了变化。

【讨论】:

这适用于现有变量的转置。但是,使用 tf.slim,内核权重隐藏在抽象之后 - 因此重用(和转置)它们应该通过另一个未知的方法来完成......

以上是关于在 Tensorflow 中重用层权重的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow如何查看模型的所有层的输入输出的tensor name

张量(tensor)的阶、形状、数据类型

tensorflow fp16训练

如何保存Tensorflow中的Tensor参数,保存训练中的中间参数,存储卷积层的数据

如何在tensorflow中判断tensor(张量)的值

打印特定层的保存权重 [Tensorflow]