本系列文章配套代码获取有以下两种途径:
-
通过百度网盘获取:
链接:https://pan.baidu.com/s/1XuxKa9_G00NznvSK0cr5qw?pwd=mnsj
提取码:mnsj
-
前往GitHub获取:
https://github.com/returu/PyTorch
CIFAR-10数据集:
我们可以使用torchvision.datasets模块中的CIFAR10类来下载并加载CIFAR-10数据集,然后使用matplotlib进行可视化。
第一次运行程序时,会自动下载数据集,大小约为100MB,需要花费一些时间。
cifar10 = datasets.CIFAR10('./data/' , train=True , download=True)
cifar10_val = datasets.CIFAR10('./data/' , train=False , download=True)
class_names = ['airplane','automobile','bird','cat','deer','dog','frog','horse','ship','truck']
fig = plt.figure(figsize=(8,4))
for i in range(10):
ax = fig.add_subplot(2 , 5 , i+1 , xticks=[] , yticks=[])
ax.set_title(class_names[i])
img = next(img for img,label in cifar10 if label==i)
plt.imshow(img)
CIFAR-10分类:
-
加载CIFAR-10数据集并进行预处理:
# 数据预处理
transform=transforms.Compose([transforms.ToTensor(), # 变换为Tensor
transforms.Normalize((0.4915,0.4823,0.4468),(0.2470,0.2435,0.2616)) # 数据归一化
])
# 下载并加载CIFAR10训练集和测试集
trainset = datasets.CIFAR10('./data/' , train=True , download=True,transform=transform)
train_loader = DataLoader(trainset , batch_size=64 , shuffle=True)
testset = datasets.CIFAR10('./data/' , train=False , download=True,transform=transform)
test_loader = DataLoader(testset , batch_size=64 , shuffle=True)
-
构建网络:
在PyTorch框架中,搭建神经网络的方式多种多样,nn提供了一种通过nn.Sequential容器来连接模型的方式。该操作可以将各个层封装到Sequential构建的容器当中,是一种简单且直观的方法,适用于那些具有简单线性层叠结构的网络。
本次构建的神经网络模型结构为线性模块nn.Linear+激活函数nn.Tanh的组合。选择交叉熵损失函数作为损失函数,选择SGD随机梯度下降优化器。
# 定义全连接神经网络
model = nn.Sequential(
nn.Linear(3072, 1024),
nn.Tanh(),
nn.Linear(1024, 512),
nn.Tanh(),
nn.Linear(512, 128),
nn.Tanh(),
nn.Linear(128, 10))
# 检查是否有可用的GPU,如果有,将网络和数据移动到GPU上
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device) # 将网络移到GPU上
# 定义损失函数
criterion = nn.CrossEntropyLoss()
# 定义优化器
optimizer = optim.SGD(model.parameters(), lr=1e-2, momentum=0.9)
-
训练网络:
# 训练网络
for epoch in range(10): # 多次遍历整个数据集
running_loss = 0.0
for i, data in enumerate(train_loader, 0):
# 获取输入数据
inputs, labels = data[0].to(device), data[1].to(device)
# 清零梯度缓存
optimizer.zero_grad()
# 前向传播,后向传播,优化
outputs = model(inputs.view(inputs.shape[0], -1))
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
# 输出统计信息
running_loss += loss.item()
if i % 200 == 199: # 每200个mini-batches输出一次
print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 200))
running_loss = 0.0
print('Finished Training')
[1, 200] loss: 1.895
[1, 400] loss: 1.751
[1, 600] loss: 1.719
[2, 200] loss: 1.621
......
[9, 600] loss: 1.003
[10, 200] loss: 0.846
[10, 400] loss: 0.884
[10, 600] loss: 0.914
Finished Training
-
测试网络:
使用测试集对训练好的模型进行评估,计算模型在未知数据(测试集)上的性能表现,本次选择准确率指标。
# 测试网络
correct = 0
total = 0
with torch.no_grad():
for data in test_loader:
images, labels = data[0].to(device), data[1].to(device)
outputs = model(images.view(images.shape[0], -1))
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the 10000 test images: {(100 * correct / total)}%' )
输出结果为:
Accuracy of the network on the 10000 test images: 49.46%
可以看到模型在测试集上的预测准确率接近50%,证明模型确实学到了东西。
更多内容可以前往官网查看:
https://pytorch.org/
本篇文章来源于微信公众号: 码农设计师