RBM预训练权重来自Hinton纸质代码,用于MATLAB原生feedforwardnet工具箱的权重

时间:2017-05-07 01:07:16

标签: matlab deep-learning autoencoder rbm feed-forward

我想使用来自Hinton纸质代码的RBM预训练权重来获得MATLAB原生feedforwardnet工具箱的权重。 任何人都可以帮助我如何为feedforwardnet设置或安排预先训练的重量?

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

的Hinton代码

并使用预先训练的权重进行matlab feedforwardnet。

W=hintonRBMpretrained;

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

net.setwb(net,W);

如何设置或排列W以匹配feedforwardnet结构?我知道如何使用单一向量,但我担心顺序或权重序列不正确。

1 个答案:

答案 0 :(得分:0)

MATLAB feedforwardnet函数返回一个神经网络对象,其属性如documentation中所述。使用预先训练的权重创建神经网络的工作流程如下:

  1. 加载数据
  2. 创建网络
  3. 配置网络
  4. 初始化权重和偏见
  5. 训练网络
  6. 步骤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 i 输入 w 八个字段,{{{} 1}}是 l ayer w 8个:

    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权重矩阵。做得很完美,对吗?

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

    3x16

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