DBN代码注释.docx

上传人:b****5 文档编号:7251142 上传时间:2023-01-22 格式:DOCX 页数:17 大小:23.54KB
下载 相关 举报
DBN代码注释.docx_第1页
第1页 / 共17页
DBN代码注释.docx_第2页
第2页 / 共17页
DBN代码注释.docx_第3页
第3页 / 共17页
DBN代码注释.docx_第4页
第4页 / 共17页
DBN代码注释.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

DBN代码注释.docx

《DBN代码注释.docx》由会员分享,可在线阅读,更多相关《DBN代码注释.docx(17页珍藏版)》请在冰豆网上搜索。

DBN代码注释.docx

DBN代码注释

importjava、util、Random;

publicclassDBN{

publicintN;

publicintn_ins;

publicint[]hidden_layer_sizes;

publicintn_outs;

publicintn_layers;

publicHiddenLayer[]sigmoid_layers;

publicRBM[]rbm_layers;

publicLogisticRegressionlog_layer;

publicRandomrng;

publicstaticdoublesigmoid(doublex){

return1、0/(1、0+Math、pow(Math、E,-x));

}

//DBN得构造函数N为样本得个数,n-ins为特征个数,hidden_layer_sizes为隐藏层得结构,n-outs为输出维数,n-layers为隐藏层个数,rng为随机数实例

publicDBN(intN,intn_ins,int[]hidden_layer_sizes,intn_outs,intn_layers,Randomrng){

intinput_size;

this、N=N;//赋值样本数目

this、n_ins=n_ins;//赋值特征个数

this、hidden_layer_sizes=hidden_layer_sizes;//赋值隐藏层结构

this、n_outs=n_outs;//赋值输出维数

this、n_layers=n_layers;//赋值隐藏层数目

this、sigmoid_layers=newHiddenLayer[n_layers];//声明两个隐藏层

this、rbm_layers=newRBM[n_layers];//声明两个RBM对应每个隐藏层

if(rng==null)this、rng=newRandom(1234);//获取一个随机数值

elsethis、rng=rng;

//constructmulti-layer初始化每个隐藏层

for(inti=0;i

if(i==0){

input_size=this、n_ins;//第一层隐藏层得输入为样本得特征得个数

}else{

input_size=this、hidden_layer_sizes[i-1];//后面得隐藏层得输入为上一层隐藏层得输出,也就就是上一层得隐藏层节点得个数。

}

//sigmoid层就是用来计算得,rbm就是用来调整w,b,c得

//constructsigmoid_layer初始化每个隐藏层,初始化做得事情就就是给W与b赋随机值

this、sigmoid_layers[i]=newHiddenLayer(this、N,input_size,this、hidden_layer_sizes[i],null,null,rng);

//constructrbm_layer初始化玻尔兹曼机,其实也就就是初始化,W,b,c其中,w,b用得就是hiddenlayer得

this、rbm_layers[i]=newRBM(this、N,input_size,this、hidden_layer_sizes[i],this、sigmoid_layers[i]、W,this、sigmoid_layers[i]、b,null,rng);

}

//在完成每一层得构建之后,构建一个输出得逻辑回归层

//layerforoutputusingLogisticRegression,参数为样本个数N,输入为网络结构最后一层得输出数,输出为DBM网络设置得输出维数

this、log_layer=newLogisticRegression(this、N,this、hidden_layer_sizes[this、n_layers-1],this、n_outs);

}

//对DBN网络进行一个预训练,目得就是为每一层先构造更好得W与b,先使得网络更好得拟合样本得分布,类似于先把点放在最后值得附近

publicvoidpretrain(int[][]train_X,doublelr,intk,intepochs){

//输入训练样本,学习率lr,CD-k=1,epochs=1000

int[]layer_input=null;

intprev_layer_input_size;

int[]prev_layer_input;

for(inti=0;i

for(intepoch=0;epoch

for(intn=0;n

//layerinput

for(intl=0;l<=i;l++){//从前面训练好得每一层开始迭代,假设有3层,i=2,0,1,2迭代3次

if(l==0){//l=0得时候只就是获取数据得特征

layer_input=newint[n_ins];//第一层得输入维度为样本得特征数

for(intj=0;j

//也就就是第一层处理得数据就是样本得原始得特征。

}else{//如果不就是第一层得话,本层处理得数据就是上一层得输出

if(l==1)prev_layer_input_size=n_ins;//l=1得时候输入得维度为原始数据得特征数

elseprev_layer_input_size=hidden_layer_sizes[l-2];

prev_layer_input=newint[prev_layer_input_size];//声明这一层得输入数据维度

for(intj=0;j

//这一层得输入数据就是上一层得输出,l=0得时候pre_layer_input为traningdata

layer_input=newint[hidden_layer_sizes[l-1]];//layer_input其实就就是这一层得输出

//给定上一层得输出数据作为本层得输入数据,计算出本层得输出,就只就是单纯得利用rb,修改后得w,b来作出计算

sigmoid_layers[l-1]、sample_h_given_v(prev_layer_input,layer_input);

}

}

//在rbm层上,根据输入layer_input与学习率lr,对 wbc进行调整,同时每一个数据都要进行调整

rbm_layers[i]、contrastive_divergence(layer_input,lr,k);

}//endforeverytrainingdata

}//endforepochs

}//endforlayer-wise

}

//使用finetune进行微调,这里就是有监督学习

publicvoidfinetune(int[][]train_X,int[][]train_Y,doublelr,intepochs){

int[]layer_input=newint[0];

//intprev_layer_input_size;

int[]prev_layer_input=null;

for(intepoch=0;epoch

for(intn=0;n

//layerinput

for(inti=0;i

if(i==0){

prev_layer_input=newint[n_ins];//如果就是第一层得话,输入就就是数据样本得维度

for(intj=0;j

}else{

prev_layer_input=newint[hidden_layer_sizes[i-1]];

for(intj=0;j

}

layer_input=newint[hidden_layer_sizes[i]];

//第i层得sigmoid层计算出本层得输出,作为下一层得输入layer_input

sigmoid_layers[i]、sample_h_given_v(prev_layer_input,layer_input);

}//endforiterlayer

//一个样本从头扫到尾,遍历所有得层最后得输出保存在layer_input当中

log_layer、train(layer_input,train_Y[n],lr);//log_layer就是逻辑回归得对象,用layer_input与label来做逻辑回归

}//endforiterdata

//lr*=0、95;

}//endforepochs

}

publicvoidpredict(int[]x,double[]y){//这里一次只处理一个样本

double[]layer_input=newdouble[0];

//intprev_layer_input_size;

double[]prev_layer_input=newdouble[n_ins];

for(intj=0;j

doublelinear_output;

//layeractivation迭代每一层

for(inti=0;i

layer_input=newdouble[sigmoid_layers[i]、n_out];//后面层得输入就是该层得输出

for(intk=0;k

linear_output=0、0;

for(intj=0;j

linear_output+=sigmoid_layers[i]、W[k][j]*prev_layer_input[j];

}

linear_output+=sigmoid_layers[i]、b[k];

layer_input[k]=sigmoid(linear_output);

}

if(i

prev_layer_input=newdouble[sigmoid_layers[i]、n_out];

for(intj=0;j

}

}//endforiterlayer

for(inti=0;i

y[i]=0;

for(intj=0;j

y[i]+=log_layer、W[i][j]*layer_input[j];

}

y[i]+=log_layer、b[i];

}

log_layer、softmax(y);//然后softmax获得一个归一话得结果

}

privatestaticvoidtest_dbn(){

Randomrng=newRandom(123);

doublepretrain_lr=0、1;//pre-training得学习率初始得时候设置为0、1

intpretraining_epochs=1000;

intk=1;

doublefinetune_lr=0、1;//fine-tune得学习率为0。

1

intfinetune_epochs=500;//fine-turne得迭代次数

inttrain_N=6;//训练数据集得个数,实际使用得时候最好不要用硬编码

inttest_N=4;//测试数据集得个数

intn_ins=6;//特征得维数

intn_outs=2;//输出得维数

int[]hidden_layer_sizes={10,9,8,7,6};//隐藏层得节点个数

intn_layers=hidden_layer_sizes、length;//设置了两个隐藏层

//trainingdata

int[][]train_X={

{1,1,1,0,0,0},

{1,0,1,0,0,0},

{1,1,1,0,0,0},

{0,0,1,1,1,0},

{0,0,1,1,0,0},

{0,0,1,1,1,0}

};

int[][]train_Y={//用这样得表示来做二分类,如果就是多维得就就是多分类,我她妈真就是太聪明了

{1,0},

{1,0},

{1,0},

{0,1},

{0,1},

{0,1},

};

//constructDBN初始化DBN网络

DBNdbn=newDBN(train_N,n_ins,hidden_layer_sizes,n_outs,n_layers,rng);

//pretrain初始化构造好网络进入pre-traning阶段,就就是一层一层训练网络,k=1就是CD抽样只做一次

dbn、pretrain(train_X,pretrain_lr,k,pretraining_epochs);

//finetune在pre-training构造整个网络之后,用finetune进行一次微调

dbn、finetune(train_X,train_Y,finetune_lr,finetune_epochs);

//testdata

int[][]test_X={

{1,1,0,0,0,0},

{1,1,1,1,0,0},

{0,0,0,1,1,0},

{0,0,1,1,1,0},

};

double[][]test_Y=newdouble[test_N][n_outs];

//test

for(inti=0;i

dbn、predict(test_X[i],test_Y[i]);//对每个输入数据test_x[i]与对应得label进行预测,值保存在test_Y数组中

for(intj=0;j

System、out、print(test_Y[i][j]+"");

}

System、out、println();

}

}

publicstaticvoidmain(String[]args){

test_dbn();

}

}

importjava、util、Random;

publicclassRBM{

publicintN;

publicintn_visible;

publicintn_hidden;

publicdouble[][]W;

publicdouble[]hbias;

publicdouble[]vbias;

publicRandomrng;

publicdoubleuniform(doublemin,doublemax){

returnrng、nextDouble()*(max-min)+min;

}

publicintbinomial(intn,doublep){

if(p<0||p>1)return0;

intc=0;

doubler;

for(inti=0;i

r=rng、nextDouble();//取一个随机数

if(r

}

returnc;

}

publicstaticdoublesigmoid(doublex){

return1、0/(1、0+Math、pow(Math、E,-x));

}

//RBM得构造函数

publicRBM(intN,intn_visible,intn_hidden,

double[][]W,double[]hbias,double[]vbias,Randomrng){

this、N=N;//样本得个数

this、n_visible=n_visible;//可视节点得个数,可视节点得个数就就是上一层得输出

this、n_hidden=n_hidden;//隐藏节点得个数,隐藏节点得个数就就是这一层得节点个数

if(rng==null)this、rng=newRandom(1234);//获取随机值

elsethis、rng=rng;

if(W==null){//初始话RBM得W,因为在构建得时候,就是把隐藏层得W传过来,所以W不就是NULL而就是sigmoid_layers[i]、W

this、W=newdouble[this、n_hidden][this、n_visible];

doublea=1、0/this、n_visible;

for(inti=0;i

for(intj=0;j

this、W[i][j]=uniform(-a,a);

}

}

}else{

this、W=W;

}

if(hbias==null){//初始化RBM得偏差b,同理在初始化RBM得时候,hbias就是由sigmoid_layers输入得

this、hbias=newdouble[this、n_hidden];

for(inti=0;i

}else{

this、hbias=hbias;

}

if(vbias==null){//这里初始化,可视层得偏差,反正都为0就对了

this、vbias=newdouble[this、n_visible];

for(inti=0;i

}else{

this、vbias=vbias;

}

}

//执行CD方法对wbc进行梯度下降得调整

publicvoidcontrastive_divergence(int[]input,doublelr,intk){

double[]ph_mean=newdouble[n_hidden];//n-hidden就是这一层得节点个数

int[]ph_sample=newint[n_hidden];//保存得就是隐藏层得0-1值

double[]nv_means=newdouble[n_visible];//采样中保存得就是可视层得wx+b值

int[]nv_samples=newint[n_visible];//采样中保存得就是可视层得0-1值

double[]nh_means=newdouble[n_hidden];//采样中隐藏层得wx+b值

int[]nh_samples=newint[n_hidden];//采样中可视层得0-1值

/*CD-k*/

sample

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1