1. PyTorch简介
PyTorch是Facebook AI Research团队推出的一个拥有强大GPU加速的张量和动态构建网络的Python库,在深度学习领域成为了一种流行的深度学习框架。
与TensorFlow相比,PyTorch更具灵活性和易学性,同时不失强大计算能力,因此在学术界普及度比TensorFlow高。它以动态图机制为基础,用户可以轻松地构建和修改网络结构,以及进行模型训练和调试。
2. 图片数据准备
在进行深度学习任务时,数据集的质量和量是决定模型训练效果的重要因素。
2.1 数据集获取
图片分类任务通常需要一个包含多个类别的数据集,我们可以利用爬虫从网上下载图片。这里以获取猫和狗图片数据集为例:
import requests
classes = ["cat", "dog"]
for cls in classes:
url = f"https://www.image-net.org/api/text/imagenet.synset.geturls?wnid=n02123159&grep={cls}"
response = requests.get(url)
with open(f"{cls}.txt", "w") as f:
f.write(response.text)
上述代码会从ImageNet网站获取指定类别的图片链接,并将结果写到本地文件中。
2.2 数据预处理
获取数据集后需要进行预处理,包括图像尺寸、resize、归一化等。
这里使用PyTorch自带的transforms
模块进行图像预处理,例如:
# ImageFolder函数可以将文件夹下的图片作为一个数据集,每个文件夹对应一个类别
# transforms模块用于预处理图像
dataset = torchvision.datasets.ImageFolder(
root="data", transform=transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
]))
上述代码中,Resize
用于将图像大小改为224x224, ToTensor
用于将图像转化为张量,Normalize
用于对图像进行归一化。
3. 训练模型
训练深度学习模型的关键在于定义合适的损失函数和优化器,同时合理的超参数设置也会影响模型的训练效果。
3.1 定义损失函数
常用的损失函数包括交叉熵损失函数、均方误差损失函数等。
对于多分类问题,我们可以使用交叉熵损失函数:
criterion = nn.CrossEntropyLoss()
3.2 定义优化器
优化器用于更新模型的权重和偏置项,通常采用的优化器有随机梯度下降(SGD)、Adam等。
以Adam优化器为例:
# 定义优化器,学习率设置为0.001
optimizer = optim.Adam(model.parameters(), lr=0.001)
3.3 训练模型
模型训练通常包含数据加载、前向传播、反向传播、优化器更新等步骤。
训练代码示例:
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化器更新
optimizer.zero_grad()
loss.backward()
optimizer.step()
上述代码会对数据进行迭代,计算模型损失函数,然后利用反向传播算法将误差传回每一层,最后使用优化器对各层的参数进行更新。
4. 测试模型
测试深度学习模型需要准备测试数据集,然后进行前向传播,计算模型预测的精度、召回率等指标。
4.1 构建测试数据集
构建测试数据集和训练数据集类似,可使用ImageFolder函数进行构建,并设置变换方式。
test_dataset = torchvision.datasets.ImageFolder(
root='data/test',
transform=transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
]))
4.2 进行模型预测
利用前向传播对测试集进行预测,计算模型的精度、召回率等评价指标。
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = correct / total
4.3 模型输出结果
可以使用softmax
函数对模型输出进行归一化操作,然后选择概率值最大的类别作为预测结果。
with torch.no_grad():
outputs = model(images)
softmax = nn.Softmax(dim=1)
probabilities = softmax(outputs)
predictions = probabilities.argmax(dim=1)
在输出结果时,可以使用temperature
参数控制模型预测概率的平滑程度,可以减少过于自信的预测概率。
def apply_temperature(outputs, temperature=1.0):
"""
对模型输出的logits进行温度调整
"""
outputs = outputs / temperature
return outputs
with torch.no_grad():
outputs = model(images)
logits = apply_temperature(outputs, temperature=0.6)
softmax = nn.Softmax(dim=1)
probabilities = softmax(logits)
predictions = probabilities.argmax(dim=1)