0

我想使用来自 Hinton 论文代码的 RBM 预训练权重作为 MATLAB 原生前馈网络工具箱的权重。任何人都可以帮助我如何设置或安排前馈网络的预训练权重?

例如,我使用了来自http://www.cs.toronto.edu/~hinton/MatlabForSciencePaper.html的 Hinton 代码

并将预训练的权重用于 matlab 前馈网络。

W=hintonRBMpretrained;

net=feedforwardnet([700 300 200 30 200 300 700]);

net.setwb(net,W);

如何设置或安排 W 使其匹配前馈网络结构?我知道如何使用单个向量,但我担心顺序或权重顺序不正确。

4

1 回答 1

0

MATLABfeedforwardnet函数返回一个具有文档中描述的属性的神经网络对象。创建具有预训练权重的神经网络的工作流程如下:

  1. 加载数据
  2. 创建网络
  3. 配置网络
  4. 初始化权重和偏差
  5. 训练网络

步骤 1、2、3 和 5 与从头开始创建神经网络时完全相同。让我们看一个简单的例子:

% 1. Load data
load fisheriris
meas = meas.';
species = species.';
targets = dummyvar(categorical(species));

% 2. Create network
net = feedforwardnet([16, 16]);

% 3. Configure the network
configure(net, meas, targets)

现在,我们有一个net具有 4 个输入(萼片和花瓣长度和宽度)和 3 个输出('setosa'、'versicolor' 和 'virginica')的神经网络。我们有两个隐藏层,每个隐藏层有 16 个节点。权重存储在两个字段net.IWnet.LW中,其中IW是输入w,并且是w八:LW

>> net.IW
ans =
  3×1 cell array

    [16×4 double]
    []
    []

>> net.LW
ans =
  3×3 cell array

                []               []    []
    [16×16 double]               []    []
                []    [3×16 double]    []

起初这令人困惑,但很有意义:这两个单元格数组中的每一行都对应于我们拥有的一个层。

IW数组中,我们有输入和每一层之间的权重。显然,我们只有输入和第一层之间的权重。这个权重矩阵的形状是16x4,因为我们有4输入和16隐藏单元。

LW数组中,我们有每一层(行)每一层(列)的权重。在我们的例子中,我们有一个16x16从第一层到第二层的3x16权重矩阵,以及一个从第二层到第三层的权重矩阵。完全有道理,对吧?

这样,我们就知道如何初始化我们从 RBM 代码中获得的权重:

net.IW{1,1} = weights_input;
net.LW{2,1} = weights_hidden;

有了这个,您可以继续第 5 步,即以监督方式训练网络。

于 2017-05-10T13:52:13.513 回答