資源簡介
一個matlab的受限玻爾茲曼機程序,能幫助初學者快速理解RBM模型
代碼片段和文件信息
%?This?program?trains?Restricted?Boltzmann?Machine?in?which
%?visible?binary?stochastic?pixels?are?connected?to
%?hidden?binary?stochastic?feature?detectors?using?symmetrically
%?weighted?connections.?Learning?is?done?with?1-step?Contrastive?Divergence.???
%?The?program?assumes?that?the?following?variables?are?set?externally:
%?本程序用來訓練受限波爾玆曼機(RBM)
%?可見層是二進制的輸入,隱藏層是也是二進制的
%?使用對稱權重來連接可見層和隱藏層
%?使用1步Contrastive?Divergence對比散度進行訓練
%?本程序假設以下變量已經存在?
%代碼是按照Geoff?Hinton提供的關于RBM的matlab代碼做了輕微修改,以便可以直接運行
%假設有6個可見節點,10個隱藏節點
%提供的輸入節點集合是
%[111000;101101;?101000;101001]分成了兩個batch
maxepoch=100;??%?maximum?number?of?epochs?最大訓練迭代次數
numhid=10;?????%?number?of?hidden?units???隱藏層節點的數量
%?batchdata?--?the?data?that?is?divided?into?batches?(numcases?numdims?numbatches)
%以batch為單位的訓練數據,訓練數據的維度為(numcases?numdims?numbatches)
batchdata(::1)?=?[111000;?101101];??%(::1)表示三維矩陣,“:“表示行列不限,“1“表示第一頁?
batchdata(::2)?=?[101000;?101001];
restart?=?1;????%set?to?1?if?learning?starts?from?beginning?如果restart為1,則訓練從頭開始
epsilon_w??=?0.1;???%?Learning?rate?for?weights??權重學習效率
epsilon_vb?=?0.1;???%?Learning?rate?for?biases?of?visible?units??可見單元偏差學習效率
epsilon_hb?=?0.1;???%?Learning?rate?for?biases?of?hidden?units???隱藏單元偏差學習效率
weightcost?=?0.0002;??%權重懲罰系數
initialmomentum?=?0.5;%初始的和最終的沖量
finalmomentum???=?0.9;
%每個batch樣例:樣本個數、樣本維數(可見層輸入大小)、batch個數
[numcasesnumdimsnumbatches]?=?size(batchdata);
%batchdata是2*6*2的矩陣,2個樣本,樣本維數是6,共有2個batch
if?restart?==?1
??restart?=?0;
??epoch?=?1;
??%Initializing?symmetric?weights?and?biases.?
??%初始化[對稱]權重和可見層與隱藏層的偏置
??????vis_hid?=?0.1*randn(numdimsnumhid);%初始化可見層到隱含層的權重矩陣?
??????hidbiases?=?zeros(1numhid);?%初始化隱藏層的偏差
??????visbiases?=?zeros(1numdims);%初始化可見層的偏差?numdims可見節點個數,和樣本維數一致
??????%positive隱藏層的概率
??????pos_hidprobs?=?zeros(numcasesnumhid);%初始化由data得到的隱含層的概率
??????%negetive隱藏層的概率(neg反向傳播,即重構后)
??????neghid_probs?=?zeros(numcasesnumhid);%初始化重構后的data得到的隱藏層的概率。
??????%positive?term用于更新權重的矩陣,由data得到。
??????posprods?=?zeros(numdimsnumhid);
??????%negative?term用于更新權重的矩陣,由重構data得到。
??????negprods?=?zeros(numdimsnumhid);
??????%權重更新的增量
??????vishid_inc?=?zeros(numdimsnumhid);
??????%隱藏層偏置的增量
??????hidbias_inc?=?zeros(1numhid);?
??????%可見層偏置的增量
??????visbias_inc?=?zeros(1numdims);
??????%每個batch?Positive隱藏層的概率
??????batchposhidprobs?=?zeros(numcasesnumhidnumbatches);%將新得到的隱含層作為下一層的可見層
end
%根據設置的最大迭代次數進行迭代訓練
%開始迭代,進行pre-training
for?epoch?=?epoch:maxepoch
?fprintf(1‘epoch?%d\r‘epoch);?%fprintf?“1“是文件號
?%誤差
?errsum?=?0;???????????????
%每個batch分別進行訓練
??for?batch?=?1:numbatches
???fprintf(1‘epoch?%d?batch?%d\r‘epochbatch);?
????%%%%%%%%%?START?POSITIVE?PHASE?%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
??????%正向傳播
??????data?=?batchdata(::batch);???????%提取每一批次的數據來進行預訓練
??????%隱藏層的概率為hj?=?sigmoid(sigma(Vi*Wij)+?hbias_i),計算隱含層為
- 上一篇:利用pts降低papr的matlab代碼
- 下一篇:計算bpsk的循環累積量
評論
共有 條評論