pytorch 准备、训练和测试自己的图片数据的方法

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)

后端开发标签