DBN代码注释Word文件下载.docx
《DBN代码注释Word文件下载.docx》由会员分享,可在线阅读,更多相关《DBN代码注释Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
}
//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<
this.n_layers;
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;
n_layers;
i++){//layer-wise迭代每一个层
for(intepoch=0;
epoch<
epochs;
epoch++){//trainingepochs每个层都迭代优化epochs次
for(intn=0;
n<
N;
n++){//inputx1...xN每一层都遍历每个训练样本,这种方式相当于是随机梯度下降
//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<
n_ins;
j++)layer_input[j]=train_X[n][j];
//遍历第i个样本的第j个特征赋值给layer_input
//也就是第一层处理的数据是样本的原始的特征。
}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];
//声明这一层的输入数据维度
prev_layer_input_size;
j++)prev_layer_input[j]=layer_input[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++){//迭代epochs次
for(intn=0;
n++){//遍历所有的输入数据样本
//layerinput
for(inti=0;
if(i==0){
prev_layer_input=newint[n_ins];
//如果是第一层的话,输入就是数据样本的维度
for(intj=0;
j++)prev_layer_input[j]=train_X[n][j];
//获取输入数据
}else{
prev_layer_input=newint[hidden_layer_sizes[i-1]];
hidden_layer_sizes[i-1];
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];
double[]prev_layer_input=new