Alm*_*evi 5 python machine-learning pytorch torchvision
我需要用我训练的卷积神经网络的数据测试结果编写一个文件。数据包括语音数据收集。文件格式需要为“文件名,预测”,但我很难提取文件名。我像这样加载数据:
import torchvision
from torchvision import transforms
from torch.utils.data import DataLoader
TEST_DATA_PATH = ...
trans = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
test_dataset = torchvision.datasets.MNIST(
root=TEST_DATA_PATH,
train=False,
transform=trans,
download=True
)
test_loader = DataLoader(dataset=test_dataset, batch_size=1, shuffle=False)
Run Code Online (Sandbox Code Playgroud)
我正在尝试按如下方式写入文件:
f = open("test_y", "w")
with torch.no_grad():
for i, (images, labels) in enumerate(test_loader, 0):
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
file = os.listdir(TEST_DATA_PATH + "/all")[i]
format = file + ", " + str(predicted.item()) + '\n'
f.write(format)
f.close()
Run Code Online (Sandbox Code Playgroud)
问题os.listdir(TESTH_DATA_PATH + "/all")[i]在于它与加载的文件顺序不同步test_loader。我能做什么?
好吧,这取决于您Dataset的实施方式。例如,在这种torchvision.datasets.MNIST(...)情况下,您无法检索文件名,因为没有单个样本的文件名(MNIST 样本以不同的方式加载))。
由于您没有展示您的Dataset实现,我将告诉您如何使用torchvision.datasets.ImageFolder(...)(或任何torchvision.datasets.DatasetFolder(...))来完成此操作:
f = open("test_y", "w")
with torch.no_grad():
for i, (images, labels) in enumerate(test_loader, 0):
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
sample_fname, _ = test_loader.dataset.samples[i]
f.write("{}, {}\n".format(sample_fname, predicted.item()))
f.close()
Run Code Online (Sandbox Code Playgroud)
您可以看到文件的路径是在 期间检索的__getitem__(self, index),特别是在此处。
如果您实现了自己的Dataset(并且可能想要支持shuffle和batch_size > 1),那么我会sample_fname在__getitem__(...)通话中返回并执行以下操作:
for i, (images, labels, sample_fname) in enumerate(test_loader, 0):
# [...]
Run Code Online (Sandbox Code Playgroud)
这样你就不需要关心shuffle. 如果batch_size大于 1,您需要更改循环的内容以获得更通用的内容,例如:
f = open("test_y", "w")
for i, (images, labels, samples_fname) in enumerate(test_loader, 0):
outputs = model(images)
pred = torch.max(outputs, 1)[1]
f.write("\n".join([
", ".join(x)
for x in zip(map(str, pred.cpu().tolist()), samples_fname)
]) + "\n")
f.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10485 次 |
| 最近记录: |