如何在 Pytorch 中测试自定义数据集?
How do you test a custom dataset in Pytorch?
我一直在关注 Pytorch 中的教程,这些教程使用 Pytorch 的数据集,允许您启用是否要使用数据进行训练...但现在我使用的是 .csv 和自定义数据集。
class MyDataset(Dataset):
def __init__(self, root, n_inp):
self.df = pd.read_csv(root)
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 __getitem__(self, idx):
return self.x[idx, :], self.y[idx,:]
def __len__(self):
return len(self.data)
如何告诉 Pytorch 不要训练我的 test_dataset 以便我可以将其用作我的模型准确度的参考?
train_dataset = MyDataset("heart.csv", input_size)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle =True)
test_dataset = MyDataset("heart.csv", input_size)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle =True)
在pytorch中,自定义数据集继承了classDataset
。主要包含两个方法__len__()
是指定要迭代的数据集对象的长度和__getitem__()
一次return一批数据。
初始化数据加载器对象后(train_loader
和 test_loader
,如代码中指定的那样),您需要编写一个训练循环和一个测试循环。
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_grad(), backward(), step()
)。
最后,
for epoch in range(1, epochs + 1):
train(model, optimizer, loss_fn, train_loader)
test(model, loss_fn, test_loader)
在 pytorch 中进行测试时需要注意以下几点:
- 将您的模型置于评估模式,这样诸如 dropout 和 batch normalization 之类的东西就不会处于训练模式:
model.eval()
- 对测试代码进行包装以避免计算梯度(节省内存和时间):
with torch.no_grad():
- 仅根据您的训练集对您的数据进行归一化或标准化。这对于 min/max 标准化或 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!
我一直在关注 Pytorch 中的教程,这些教程使用 Pytorch 的数据集,允许您启用是否要使用数据进行训练...但现在我使用的是 .csv 和自定义数据集。
class MyDataset(Dataset):
def __init__(self, root, n_inp):
self.df = pd.read_csv(root)
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 __getitem__(self, idx):
return self.x[idx, :], self.y[idx,:]
def __len__(self):
return len(self.data)
如何告诉 Pytorch 不要训练我的 test_dataset 以便我可以将其用作我的模型准确度的参考?
train_dataset = MyDataset("heart.csv", input_size)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle =True)
test_dataset = MyDataset("heart.csv", input_size)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle =True)
在pytorch中,自定义数据集继承了classDataset
。主要包含两个方法__len__()
是指定要迭代的数据集对象的长度和__getitem__()
一次return一批数据。
初始化数据加载器对象后(train_loader
和 test_loader
,如代码中指定的那样),您需要编写一个训练循环和一个测试循环。
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_grad(), backward(), step()
)。
最后,
for epoch in range(1, epochs + 1):
train(model, optimizer, loss_fn, train_loader)
test(model, loss_fn, test_loader)
在 pytorch 中进行测试时需要注意以下几点:
- 将您的模型置于评估模式,这样诸如 dropout 和 batch normalization 之类的东西就不会处于训练模式:
model.eval()
- 对测试代码进行包装以避免计算梯度(节省内存和时间):
with torch.no_grad():
- 仅根据您的训练集对您的数据进行归一化或标准化。这对于 min/max 标准化或 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!