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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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