Caffe中使用权重绑定的自编码器

据我所知,通常自编码器在编码和解码网络中使用绑定的权重,对吗?

我查看了Caffe的自编码器示例,但我没有看到权重是如何绑定的。我注意到编码和解码网络共享相同的blob,但如何保证权重被正确更新呢?

如何在Caffe中实现权重绑定的自编码器?


回答:

虽然自编码器中使用权重绑定有历史,但如今很少使用(据我所知),我认为这就是为什么这个Caffe示例不使用权重绑定的原因。

尽管如此,Caffe确实支持使用权重绑定的自编码器,并且可以通过两个功能实现:层之间的参数共享和全连接层(Caffe中的InnerProduct)的转置标志。更具体地说,如果两个参数的名称相同,则在Caffe中它们会被共享,可以在param字段下这样指定:

layer {  name: "encode1"  type: "InnerProduct"  bottom: "data"  top: "encode1"  param {    name: "encode1_matrix"    lr_mult: 1    decay_mult: 1  }  param {    name: "encode1_bias"    lr_mult: 1    decay_mult: 0  }  inner_product_param {    num_output: 128    weight_filler {      type: "gaussian"      std: 1      sparse: 15    }    bias_filler {      type: "constant"      value: 0    }  }}

如果另一个全连接层(具有匹配的维度)使用名称“encode1_matrix”和“encode1_bias”,那么这些参数将始终相同,Caffe将负责聚合梯度并正确更新参数。第二部分是使用全连接层的转置标志,以便在乘以其输入之前共享矩阵被转置。因此,扩展上述示例,如果我们希望在解码过程中有一个与“encode1_matrix”具有相同权重矩阵的全连接层,那么我们将这样定义它:

layer {  name: "decode1"  type: "InnerProduct"  bottom: "encode1"  top: "decode1"  param {    name: "encode1_matrix"    lr_mult: 1    decay_mult: 1  }  param {    name: "decode1_bias"    lr_mult: 1    decay_mult: 0  }  inner_product_param {    num_output: 784    transpose: true    weight_filler {      type: "gaussian"      std: 1      sparse: 15    }    bias_filler {      type: "constant"      value: 0    }  }}

请注意,偏置参数未共享(由于输出维度不同而无法共享),而矩阵是共享的,并且解码层使用转置标志,这完成了绑定的自编码器架构。

在这里查看使用Caffe实现的绑定自编码器的完整工作示例:https://gist.github.com/orsharir/beb479d9ad5d8e389800c47c9ec42840

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注