Pytorch 神经网络—自定义数据集上实现教程
第一步、导入需要的包
importos importscipy.ioassio importnumpyasnp importtorch importtorch.nnasnn importtorch.backends.cudnnascudnn importtorch.optimasoptim fromtorch.utils.dataimportDataset,DataLoader fromtorchvisionimporttransforms,utils fromtorch.autogradimportVariable
batchSize=128#batchsize的大小 niter=10#epoch的最大值
第二步、构建神经网络
设神经网络为如上图所示,输入层4个神经元,两层隐含层各4个神经元,输出层一个神经。每一层网络所做的都是线性变换,即y=W×X+b;代码实现如下:
classNeuralnetwork(nn.Module): def__init__(self,in_dim,n_hidden_1,n_hidden_2,out_dim): super(Neuralnetwork,self).__init__() self.layer1=nn.Linear(in_dim,n_hidden_1) self.layer2=nn.Linear(n_hidden_1,n_hidden_2) self.layer3=nn.Linear(n_hidden_2,out_dim) defforward(self,x): x=x.view(x.size(0),-1) x=self.layer1(x) x=self.layer2(x) x=self.layer3(x) returnx model=Neuralnetwork(1*3,4,4,1) print(model)#netarchitecture
Neuralnetwork( (layer1):Linear(in_features=3,out_features=4,bias=True) (layer2):Linear(in_features=4,out_features=4,bias=True) (layer3):Linear(in_features=4,out_features=1,bias=True) )
第三步、读取数据
自定义的数据为demo_SBPFea.mat,是MATLAB保存的数据格式,其存储的内容如下:包括fea(1000*3)和sbp(1000*1)两个数组;fea为特征向量,行为样本数,列为特征宽度;sbp为标签
classSBPEstimateDataset(Dataset): def__init__(self,ext='demo'): data=sio.loadmat(ext+'_SBPFea.mat') self.fea=data['fea'] self.sbp=data['sbp'] def__len__(self): returnlen(self.sbp) def__getitem__(self,idx): fea=self.fea[idx] sbp=self.sbp[idx] """ConvertndarraystoTensors.""" return{'fea':torch.from_numpy(fea).float(), 'sbp':torch.from_numpy(sbp).float() } train_dataset=SBPEstimateDataset(ext='demo') train_loader=DataLoader(train_dataset,batch_size=batchSize,#分批次训练 shuffle=True,num_workers=int(8))
整个数据样本为1000,以batchSize=128划分,分为8份,前7份为104个样本,第8份则为104个样本。在网络训练过程中,是一份数据一份数据进行训练的
第四步、模型训练
#优化器,Adam optimizer=optim.Adam(list(model.parameters()),lr=0.0001,betas=(0.9,0.999),weight_decay=0.004) scheduler=optim.lr_scheduler.ExponentialLR(optimizer,gamma=0.997) criterion=nn.MSELoss()#lossfunction iftorch.cuda.is_available():#有GPU,则用GPU计算 model.cuda() criterion.cuda() forepochinrange(niter): losses=[] ERROR_Train=[] model.train() fori,datainenumerate(train_loader,0): model.zero_grad()#首先提取清零 real_cpu,label_cpu=data['fea'],data['sbp'] iftorch.cuda.is_available():#CUDA可用情况下,将Tensor在GPU上运行 real_cpu=real_cpu.cuda() label_cpu=label_cpu.cuda() input=real_cpu label=label_cpu inputv=Variable(input) labelv=Variable(label) output=model(inputv) err=criterion(output,labelv) err.backward() optimizer.step() losses.append(err.data[0]) error=output.data-label+1e-12 ERROR_Train.extend(error) MAE=np.average(np.abs(np.array(ERROR_Train))) ME=np.average(np.array(ERROR_Train)) STD=np.std(np.array(ERROR_Train)) print('[%d/%d]Loss:%.4fMAE:%.4fMeanError:%.4fSTD:%.4f'%( epoch,niter,np.average(losses),MAE,ME,STD))
[0/10]Loss:18384.6699MAE:135.3871MeanError:-135.3871STD:7.5580 [1/10]Loss:17063.0215MAE:130.4145MeanError:-130.4145STD:7.8918 [2/10]Loss:13689.1934MAE:116.6625MeanError:-116.6625STD:9.7946 [3/10]Loss:8192.9053MAE:89.6611MeanError:-89.6611STD:12.9911 [4/10]Loss:2979.1340MAE:52.5410MeanError:-52.5279STD:15.0930 [5/10]Loss:599.7094MAE:22.2735MeanError:-19.9979STD:14.2069 [6/10]Loss:207.2831MAE:11.2394MeanError:-4.8821STD:13.5528 [7/10]Loss:189.8173MAE:9.8020MeanError:-1.2357STD:13.7095 [8/10]Loss:188.3376MAE:9.6512MeanError:-0.6498STD:13.7075 [9/10]Loss:186.8393MAE:9.6946MeanError:-1.0850STD:13.6332
以上这篇Pytorch神经网络—自定义数据集上实现教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。