如何在Pytorch中测试自定义数据集?

如何在Pytorch中测试自定义数据集?,pytorch,torch,Pytorch,Torch,我一直在关注Pytorch中的教程,这些教程使用Pytorch中的数据集,允许您启用是否希望使用这些数据进行培训。。。但现在我使用的是.csv和自定义数据集 类MyDataset(数据集): 定义初始化(self、root、n_inp): self.df=pd.read\u csv(根) self.data=self.df.to_numpy() self.x,self.y=(torch.from_numpy(self.data[:,:n_inp]), torch.from_numpy(self.

我一直在关注Pytorch中的教程,这些教程使用Pytorch中的数据集,允许您启用是否希望使用这些数据进行培训。。。但现在我使用的是.csv和自定义数据集

类MyDataset(数据集):
定义初始化(self、root、n_inp):
self.df=pd.read\u csv(根)
self.data=self.df.to_numpy()
self.x,self.y=(torch.from_numpy(self.data[:,:n_inp]),
torch.from_numpy(self.data[:,n_inp:]))
def uu getitem uu(self,idx):
返回self.x[idx,:],self.y[idx,:]
定义(自我):
返回长度(自身数据)
我如何告诉Pytorch不要训练我的test_数据集,这样我就可以使用它作为我的模型准确度的参考

train\u dataset=MyDataset(“heart.csv”,输入大小)
火车装载机=数据装载机(火车数据集,批量大小=批量大小,随机播放=真)
test\u dataset=MyDataset(“heart.csv”,输入大小)
test\u loader=DataLoader(test\u数据集,batch\u size=batch\u size,shuffle=True)

在pytorch中,自定义数据集继承类
数据集
。它主要包含两种方法:指定要迭代的dataset对象的长度和每次返回一批数据

初始化数据加载器对象后(
train\u loader
test\u loader
,如代码中所指定),您需要编写一个train循环和一个test循环

def train(model, optimizer, loss_fn, dataloader):
    model.train()
    for i, (input, gt) in enumerate(dataloader):
        if params.use_gpu: #(If training using GPU)
            input, gt = input.cuda(non_blocking = True), gt.cuda(non_blocking = True)
        predicted = model(input)
        loss = loss_fn(predicted, gt)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
您的测试循环应该是:

def test(model,loss_fn, dataloader):
    model.eval()
    for i, (input, gt) in enumerate(dataloader):
        if params.use_gpu: #(If training using GPU)
            input, gt = input.cuda(non_blocking = True), gt.cuda(non_blocking = True)
        predicted = model(input)
        loss     = loss_fn(predicted, gt)
此外,您还可以使用度量字典记录您的预测、损失、时代等,。训练循环和测试循环之间的主要区别在于,我们在推理阶段排除了反向传播(
zero\u grad()、backward()、step()

最后,

for epoch in range(1, epochs + 1):
    train(model, optimizer, loss_fn, train_loader)
    test(model, loss_fn, test_loader)

在Pytork中进行测试时,需要注意以下几点:

  • 将您的模型置于评估模式,以便退出和批处理规范化等内容不会处于培训模式:
    model.eval()
  • 在测试代码周围放一个包装,以避免梯度计算(节省内存和时间):
    使用torch.no_grad():
  • 仅根据训练集对数据进行标准化或标准化。这对于最小/最大归一化或z分数标准化非常重要,以便模型准确反映测试性能
  • 除此之外,您所写的内容在我看来相当不错,因为您没有对数据应用任何变换(例如,图像翻转或高斯噪声注入)。要显示测试模式下的代码外观,请参见以下内容:

    for e in range(num_epochs):
        for B, (dat, label) in enumerate(train_loader):
             #transforms here
             opt.zero_grad()
             out = model(dat.to(device))
             loss = criterion(out)
             loss.backward()
             opt.step()
        with torch.no_grad():
             model.eval()
             global_corr = 0
             for B, (dat,label) in enumerate(test_loader):
                 out = model(dat.to(device))
                 # get batch eval metrics here!