【例11.2】基于Vehicle数据集训练分类器。
(1)加载依赖的包
>require(mlbench)
>data(Vehicle)
>require(Rdbn)
>x<-t(Vehicle[,c(1:18)])
>y<-Vehicle[,19]
>for(i in c(1:(NCOL(Vehicle)-1))){
x[i,]<-(Vehicle[,i]-min(Vehicle[,i]))/(max(Vehicle[,i])-min(Vehicle[,i]))
}
(3)数据准备
set.seed(34) #参数不同结果不同
trainIndx<-sample(c(1:NCOL(x)),NCOL(x)∗0.8,replace=FALSE)
testIndx<-c(1:NCOL(x))[!(c(1:NCOL(x))%in%trainIndx)]
(4)建模
>db<-dbn(x=x[,trainIndx],
y=y[trainIndx],
layer_sizes=c(18,100,150),
batch_size=10,
momentum_decay=0.9,
learning_rate=0.1,
weight_cost=1e-4,
n_threads=8)
在训练网络时,重要的是每个mini-batch样本集要包含用于分类正例和反例,因为Rdbn不能改变样本的顺序。
如果每个mini-batch训练样本包含了所有类别的样本,就可以更换Rdbn的输入顺序。下面脚本使用的函数shuffle返回的样本不排序,可以推广到多类情况。(www.xing528.com)
shuffle函数把样本后面的50%放到前面。
(5)模型部署
pred_dbn<-dbn.predict(db,data=x[,testIndx],n_threads=8)
print(paste("%correct(dbn):",sum(pred_dbn==as.character(y[testIndx]))
/NROW(y[testIndx])))
另外,网络训练策略可以独立地应用,这提供了额外的控制训练参数,可以使模型有更好的性能。
>db<-dbn(layer_sizes=c(18,100,150),
batch_size=10,
cd_n=1,
momentum_decay=0.9,
learning_rate=0.1,
weight_cost=1e-4)
db<-dbn.pretrain(db,data=x[,trainIndx],n_epocs=50,n_threads=8)
db_refine<-dbn.refine(db,
data=x[,trainIndx],
labels=y[trainIndx],
n_epocs=100,
rate_mult=10,
n_threads=8)
pred_dbn<-dbn.predict(db_refine,data=x[,testIndx],n_threads=8)
print(paste("%correct(dbn):",sum(pred_dbn==as.character(y[testIndx]))
/NROW(y[testIndx])))
文件夹“Rdbn/test_functions”还有一个相关的例子。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。