我想使用来自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结构?我知道如何使用单一向量,但我担心顺序或权重序列不正确。
答案 0 :(得分:0)
MATLAB feedforwardnet
函数返回一个神经网络对象,其属性如documentation中所述。使用预先训练的权重创建神经网络的工作流程如下:
步骤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.IW
和net.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步,即以受监督的方式训练网络。