在 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