PyTorch 教程中的 freeze_support() 问题

我尝试按照 PyTorch 这里的教程进行操作:https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py

完整代码如下:

import torchimport torchvisionimport torchvision.transforms as transformsimport matplotlib.pyplot as pltimport numpy as npimport torch.nn as nnimport torch.nn.functional as Fimport torch.optim as optim# 加载并标准化 CIFAR10transform = transforms.Compose(    [transforms.ToTensor(),    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])trainset = torchvision.datasets.CIFAR10(root='./data', train=True,                                        download=True, transform=transform)trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,                                          shuffle=True, num_workers=2)testset = torchvision.datasets.CIFAR10(root='./data', train=False,                                       download=True, transform=transform)testloader = torch.utils.data.DataLoader(testset, batch_size=4,                                         shuffle=False, num_workers=2)classes = ('plane', 'car', 'bird', 'cat',           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')# 显示训练图像,无法工作def imshow(img):    img = img / 2 + 0.5     # 取消标准化    npimg = img.numpy()    plt.imshow(np.transpose(npimg, (1, 2, 0)))    plt.show()# 获取一些随机训练图像dataiter = iter(trainloader)images, labels = dataiter.next()# 显示图像imshow(torchvision.utils.make_grid(images))# 打印标签print(' '.join('%5s' % classes[labels[j]] for j in range(4)))# 定义卷积神经网络class Net(nn.Module):    def __init__(self):        super(Net, self).__init__()        self.conv1 = nn.Conv2d(3, 6, 5)        self.pool = nn.MaxPool2d(2, 2)        self.conv2 = nn.Conv2d(6, 16, 5)        self.fc1 = nn.Linear(16 * 5 * 5, 120)        self.fc2 = nn.Linear(120, 84)        self.fc3 = nn.Linear(84, 10)    def forward(self, x):        x = self.pool(F.relu(self.conv1(x)))        x = self.pool(F.relu(self.conv2(x)))        x = x.view(-1, 16 * 5 * 5)        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return xnet = Net()# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)# 训练网络for epoch in range(2):  # 多次遍历数据集    running_loss = 0.0        # 无法工作    for i, data in enumerate(trainloader, 0):        # 获取输入;数据是一个包含[输入, 标签]的列表        inputs, labels = data        # 清零参数梯度        optimizer.zero_grad()        # 前向传播 + 反向传播 + 优化        outputs = net(inputs)        loss = criterion(outputs, labels)        loss.backward()        optimizer.step()        # 打印统计信息        running_loss += loss.item()        if i % 2000 == 1999:    # 每2000个小批量打印一次            print('[%d, %5d] loss: %.3f' %                  (epoch + 1, i + 1, running_loss / 2000))            running_loss = 0.0print('Finished Training')# 保存训练好的模型PATH = './cifar_net.pth'torch.save(net.state_dict(), PATH)# 在测试数据上测试网络dataiter = iter(testloader)images, labels = dataiter.next()# 打印图像dataiter = iter(testloader)images, labels = dataiter.next()imshow(torchvision.utils.make_grid(images))print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))# 加载保存的模型net = Net()net.load_state_dict(torch.load(PATH))# 查看神经网络对上述示例的预测结果:ouputs = net(images)# 最高能量的索引_, predicted = torch.max(outputs, 1)print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]                              for j in range(4)))# 在整个数据集上的准确率correct = 0total = 0with torch.no_grad():    for data in testloader:        images, labels = data        outputs = net(images)        _, predicted = torch.max(outputs.data, 1)        total += labels.size(0)        correct += (predicted == labels).sum().item()print('Accuracy of the network on the 10000 test images: %d %%' % (    100 * correct / total))# 表现良好的类别与表现不佳的类别class_correct = list(0. for i in range(10))class_total = list(0. for i in range(10))with torch.no_grad():    for data in testloader:        images, labels = data        outputs = net(images)        _, predicted = torch.max(outputs, 1)        c = (predicted == labels).squeeze()        for i in range(4):            label = labels[i]            class_correct[label] += c[i].item()            class_total[label] += 1for i in range(10):    print('Accuracy of %5s : %2d %%' % (        classes[i], 100 * class_correct[i] / class_total[i]))if __name__ == '__main__':    torch.multiprocessing.freeze_support()

然而,我遇到了以下问题:

An attempt has been made to start a new process before the        current process has finished its bootstrapping phase.        This probably means that you are not using fork to start your        child processes and you have forgotten to use the proper idiom        in the main module:            if __name__ == '__main__':                freeze_support()                ...        The "freeze_support()" line can be omitted if the program        is not going to be frozen to produce an executable.

我只是试图在普通的 Python 文件中运行它。当我在文件末尾添加

if __name__ == '__main__':                freeze_support()

时,我仍然会得到错误。


回答:

对于遇到此问题的其他人,我认为您需要定义一个主函数并在那里运行训练。然后在 Python 文件末尾添加:

if __name__ == '__main__':    main()

这在我另一个 PyTorch 训练程序中解决了 freeze_support() 问题。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注