1. Pytorch环境搭建
在开始使用Pytorch进行深度学习之前,首先需要进行环境搭建。Pytorch可以在Linux、Windows和Mac OS上运行,可以支持GPU和CPU操作。下面将介绍如何在Windows操作系统上进行Pytorch环境搭建。
1.1 安装Anaconda
首先需要安装Anaconda,可以从Anaconda官网下载合适版本进行安装。安装之后需要使用Anaconda命令行工具创建一个新的环境,这里以创建一个名为“pytorch_test”的环境为例。
conda create --name pytorch_test
1.2 安装Pytorch
在创建了新的环境之后,需要在新的环境中安装Pytorch。可以在Pytorch官网根据需要选择合适的安装版本,根据需要选择CPU版本或GPU版本。
conda install pytorch torchvision torchaudio -c pytorch
上述命令会自动安装与系统对应的Pytorch版本,安装完成后可以使用以下命令验证是否安装成功。
import torch
print(torch.__version__)
如果能够成功输出Pytorch的版本号,则说明安装成功。
2. Pytorch基本语法
了解了Pytorch的环境搭建之后,下面将介绍一些Pytorch基本语法。
2.1 张量(Tensor)
张量是Pytorch中的基本数据结构,类似于Numpy中的数组。可以使用如下代码定义一个张量。
import torch
x = torch.tensor([[1, 2], [3, 4]])
print(x)
上述代码会创建一个2x2的矩阵。
在进行深度学习操作时,经常需要进行张量的创建、操作和运算。可以使用如下代码创建一个随机张量。
x = torch.randn(2, 2)
print(x)
上述代码会创建一个2x2的随机矩阵。
2.2 自动求导(Autograd)
Pytorch中的自动求导功能可以大大简化代码编写过程。可以使用如下代码进行自动求导。
x = torch.randn(3, requires_grad=True)
y = x * 2
z = y.mean()
z.backward()
print(x.grad)
上述代码会在张量y上进行操作,并计算张量z的平均值。然后使用反向传播进行自动求导,并输出x的梯度。
2.3 线性回归
线性回归是使用Pytorch进行深度学习的最基本模型之一。可以使用如下代码进行线性回归模型的训练。
import torch.nn as nn
import torch.optim as optim
# 构建训练数据
x_train = torch.randn(100, 1) * 10
y_train = x_train + torch.randn(100, 1)
# 构建模型
model = nn.Linear(1, 1)
# 构建损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(1000):
optimizer.zero_grad()
y_pred = model(x_train)
loss = criterion(y_pred, y_train)
loss.backward()
optimizer.step()
# 预测结果
x_test = torch.tensor([[2.0], [4.0], [6.0]])
y_test = model(x_test)
print(y_test)
上述代码会构建一个简单的线性回归模型并进行训练,最后输出预测结果。
2.4 神经网络(Neural Network)
指定网络的前向传递规则,然后系统会自动为我们构建后向传递规则并进行训练。可以使用如下代码定义一个简单的前向传递神经网络模型。
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(1, 10)
self.fc2 = nn.Linear(10, 1)
def forward(self, x):
x = self.fc1(x)
x = F.relu(x)
x = self.fc2(x)
return x
# 构建训练数据和模型
x_train = torch.randn(100, 1)
y_train = x_train + torch.randn(100, 1)
model = Net()
# 构建损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(1000):
optimizer.zero_grad()
y_pred = model(x_train)
loss = criterion(y_pred, y_train)
loss.backward()
optimizer.step()
# 预测结果
x_test = torch.tensor([[2.0], [4.0], [6.0]])
y_test = model(x_test)
print(y_test)
上述代码会构建一个简单的前向传递神经网络模型并进行训练,并输出预测结果。
2.5 卷积神经网络(Convolutional Neural Network)
卷积神经网络是用于图像识别的常用模型之一。可以使用如下代码定义一个简单的卷积神经网络模型。
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
self.fc1 = nn.Linear(320, 50)
self.fc2 = nn.Linear(50, 10)
def forward(self, x):
x = F.relu(F.max_pool2d(self.conv1(x), 2))
x = F.relu(F.max_pool2d(self.conv2(x), 2))
x = x.view(-1, 320)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return F.log_softmax(x, dim=1)
# 构建训练数据和模型
train_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(
datasets.MNIST('../data', train=False, transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])),
batch_size=1000, shuffle=True)
model = CNN()
# 构建损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
for epoch in range(10):
for i, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
# 测试模型
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data)
test_loss += criterion(output, target).item()
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
accuracy = 100. * correct / len(test_loader.dataset)
print('Test set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset), accuracy))
上述代码会构建一个简单的卷积神经网络模型并进行MNIST数据集的训练,并输出测试集的准确率。