保存pytorch模型的预测
我正在学习pytorch转移学习教程,并将其应用于kaggle种子分类任务,我只是不知道如何将预测保存在csv文件中,以便提交, 任何建议都会有帮助,这是我的建议保存pytorch模型的预测,pytorch,Pytorch,我正在学习pytorch转移学习教程,并将其应用于kaggle种子分类任务,我只是不知道如何将预测保存在csv文件中,以便提交, 任何建议都会有帮助,这是我的建议 use_gpu = torch.cuda.is_available() model = models.resnet50(pretrained=True) for param in model.parameters(): param.requires_grad = False num_ftrs = model.fc.in_f
use_gpu = torch.cuda.is_available()
model = models.resnet50(pretrained=True)
for param in model.parameters():
param.requires_grad = False
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, len(classes))
if use_gpu:
model = model.cuda()
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9)
exp_lr_scheduler = lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
loaders = {'train':train_loader, 'valid':valid_loader, 'test': test_loader}
model = train_model(loaders, model, criterion, optimizer, exp_lr_scheduler, num_epochs=50)
一旦您训练了您的模型,您就可以根据测试数据对其进行评估。这会给你一个,可能是在GPU上。从那里,您需要使用
CPU()
将其复制到CPU,并使用numpy()
将其转换为numpy数组。然后,您可以使用numpy's或pandas's。在第一种情况下,您会遇到如下情况:
# evaluate on Variable x with testing data
y = model(x)
# access Variable's tensor, copy back to CPU, convert to numpy
arr = y.data.cpu().numpy()
# write CSV
np.savetxt('output.csv', arr)
一旦您训练了您的模型,您就可以根据测试数据对其进行评估。这会给你一个,可能是在GPU上。从那里,您需要使用
CPU()
将其复制到CPU,并使用numpy()
将其转换为numpy数组。然后,您可以使用numpy's或pandas's。在第一种情况下,您会遇到如下情况:
# evaluate on Variable x with testing data
y = model(x)
# access Variable's tensor, copy back to CPU, convert to numpy
arr = y.data.cpu().numpy()
# write CSV
np.savetxt('output.csv', arr)
我正在分享我用于SNLI任务的评估函数。请注意,这只是一个例子,不是确切的答案,可能你正在寻找。我希望它能帮助你
def evaluate(model, batches, dictionary, outfile=None):
# Turn on evaluation mode which disables dropout.
model.eval()
n_correct, n_total = 0, 0
y_preds, y_true, output = [], [], []
for batch_no in range(len(batches)):
sent1, sent_len1, sent2, sent_len2, labels = helper.batch_to_tensors(batches[batch_no], dictionary)
if model.config.cuda:
sent1 = sent1.cuda()
sent2 = sent2.cuda()
labels = labels.cuda()
score = model(sent1, sent_len1, sent2, sent_len2)
preds = torch.max(score, 1)[1]
if outfile:
predictions = preds.data.cpu().tolist()
for i in range(len(batches[batch_no])):
output.append([batches[batch_no][i].id, predictions[i]])
else:
y_preds.extend(preds.data.cpu().tolist())
y_true.extend(labels.data.cpu().tolist())
n_correct += (preds.view(labels.size()).data == labels.data).sum()
n_total += len(batches[batch_no])
if outfile:
target_names = ['entailment', 'neutral', 'contradiction']
with open(outfile, 'w') as f:
f.write('pairID,gold_label' + '\n')
for item in output:
f.write(str(item[0]) + ',' + target_names[item[1]] + '\n')
else:
return 100. * n_correct / n_total, 100. * f1_score(numpy.asarray(y_true), numpy.asarray(y_preds),
average='weighted')
通常,我调用eval函数如下:
evaluate(model, test_batches, dictionary, args.save_path + 'predictions.csv')
我正在分享我用于SNLI任务的评估函数。请注意,这只是一个例子,不是确切的答案,可能你正在寻找。我希望它能帮助你
def evaluate(model, batches, dictionary, outfile=None):
# Turn on evaluation mode which disables dropout.
model.eval()
n_correct, n_total = 0, 0
y_preds, y_true, output = [], [], []
for batch_no in range(len(batches)):
sent1, sent_len1, sent2, sent_len2, labels = helper.batch_to_tensors(batches[batch_no], dictionary)
if model.config.cuda:
sent1 = sent1.cuda()
sent2 = sent2.cuda()
labels = labels.cuda()
score = model(sent1, sent_len1, sent2, sent_len2)
preds = torch.max(score, 1)[1]
if outfile:
predictions = preds.data.cpu().tolist()
for i in range(len(batches[batch_no])):
output.append([batches[batch_no][i].id, predictions[i]])
else:
y_preds.extend(preds.data.cpu().tolist())
y_true.extend(labels.data.cpu().tolist())
n_correct += (preds.view(labels.size()).data == labels.data).sum()
n_total += len(batches[batch_no])
if outfile:
target_names = ['entailment', 'neutral', 'contradiction']
with open(outfile, 'w') as f:
f.write('pairID,gold_label' + '\n')
for item in output:
f.write(str(item[0]) + ',' + target_names[item[1]] + '\n')
else:
return 100. * n_correct / n_total, 100. * f1_score(numpy.asarray(y_true), numpy.asarray(y_preds),
average='weighted')
通常,我调用eval函数如下:
evaluate(model, test_batches, dictionary, args.save_path + 'predictions.csv')
我不知道为什么需要将预测保存为CSV。是为了人类的可读性吗 无论如何,通常在转换为numpy时,我们会:
tensor_data.detach().cpu().numpy()
按照这个顺序(为了避免我们不需要的梯度的重复符合性)
此外,如果保存预测并选择将其保存为torch.tensor对象,则确保调用detach
,以避免意外的渐变被记住(除非我想您需要):
要保存它,请执行以下操作:
y = f(x).detach().cpu().numpy()
np.savetxt(path / `output.csv', y)
不过,我建议您只使用print语句进行调试。另外,使用torch.save
,它可以为您提供现成的一切。我不推荐pickle,因为这会给pytorch带来警告
有关完整的工作示例:
# test for saving everything with torch.save
import torch
import torch.nn as nn
from pathlib import Path
from collections import OrderedDict
import numpy as np
import pickle
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
num_samples = 3
Din, Dout = 1, 1
lb, ub = -1, 1
x = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples, Din))
f = nn.Sequential(OrderedDict([
('f1', nn.Linear(Din,Dout)),
('out', nn.SELU())
]))
y = f(x)
# save data torch to numpy
x_np, y_np = x.detach().cpu().numpy(), y.detach().cpu().numpy()
db2 = {'f': f, 'x': x_np, 'y': y_np}
torch.save(db2, path / 'db_f_x_y')
np.savetxt(path / 'output.csv', y_np)
db3 = torch.load(path / 'db_f_x_y')
f3 = db3['f']
x3 = db3['x']
y3 = db3['y']
xx = torch.tensor(x3)
yy3 = f3(xx)
print(yy3)
我不知道为什么需要将预测保存为CSV。是为了人类的可读性吗 无论如何,通常在转换为numpy时,我们会:
tensor_data.detach().cpu().numpy()
按照这个顺序(为了避免我们不需要的梯度的重复符合性)
此外,如果保存预测并选择将其保存为torch.tensor对象,则确保调用detach
,以避免意外的渐变被记住(除非我想您需要):
要保存它,请执行以下操作:
y = f(x).detach().cpu().numpy()
np.savetxt(path / `output.csv', y)
不过,我建议您只使用print语句进行调试。另外,使用torch.save
,它可以为您提供现成的一切。我不推荐pickle,因为这会给pytorch带来警告
有关完整的工作示例:
# test for saving everything with torch.save
import torch
import torch.nn as nn
from pathlib import Path
from collections import OrderedDict
import numpy as np
import pickle
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
num_samples = 3
Din, Dout = 1, 1
lb, ub = -1, 1
x = torch.torch.distributions.Uniform(low=lb, high=ub).sample((num_samples, Din))
f = nn.Sequential(OrderedDict([
('f1', nn.Linear(Din,Dout)),
('out', nn.SELU())
]))
y = f(x)
# save data torch to numpy
x_np, y_np = x.detach().cpu().numpy(), y.detach().cpu().numpy()
db2 = {'f': f, 'x': x_np, 'y': y_np}
torch.save(db2, path / 'db_f_x_y')
np.savetxt(path / 'output.csv', y_np)
db3 = torch.load(path / 'db_f_x_y')
f3 = db3['f']
x3 = db3['x']
y3 = db3['y']
xx = torch.tensor(x3)
yy3 = f3(xx)
print(yy3)
你能提供更多关于输出格式的信息吗?嗯,这就是我不太确定的。你为什么要将数据保存为
csv
文件?只是为了可读性?做torch.save应该足够了。如果您想确保不会出现意外的梯度,可能需要执行tensor_data.detach().cpu().numpy()
,那么torch.save
就足够了。对于csv,请在数据的numpy版本上使用np.savetxt
。您能提供有关输出格式的更多信息吗?嗯,这就是我不太确定的。您为什么要将数据保存为csv
文件?只是为了可读性?做torch.save应该足够了。如果您想确保不会出现意外的梯度,可能需要执行tensor_data.detach().cpu().numpy()
,那么torch.save
就足够了。对于csv,在numpy版本的数据上使用np.savetxt
。当我只运行model.eval()
时,我得到AttributeError:“tuple”对象没有属性“eval”
嗯,不知何故,您为model
变量分配了一个元组。你对教程有什么改动吗?此外,我的答案甚至没有提到model.eval()
。我应该作为变量x通过测试加载程序吗?我有点困惑该怎么办?通常,使用.detach()
保存NN中的数据是一种好的做法,例如按该顺序使用张量(data.detach().cpu().numpy()
)。首先分离可以避免不必要的渐变副本。当我只运行model.eval()
时,我得到了AttributeError:“tuple”对象没有属性“eval”
好吧,不知何故,您为model
变量分配了一个元组。你对教程有什么改动吗?此外,我的答案甚至没有提到model.eval()
。我应该作为变量x通过测试加载程序吗?我有点困惑该怎么办?通常,使用.detach()
保存NN中的数据是一种好的做法,例如按该顺序使用张量(data.detach().cpu().numpy()
)。首先分离可以避免不必要的渐变副本。