PyTorch图像分类实战:构建CNN模型,实现高精度识别
PyTorch图像分类实战:构建CNN模型,实现高精度识别
本篇博客将提供一个完整的PyTorch图像分类代码示例,涵盖网络定义、数据加载、训练和验证过程,并引入Dropout技术来防止过拟合,帮助你快速掌握图像分类任务。
代码示例pythonimport torchimport torch.optim as optimimport torch.nn.functional as Fimport torch.nn as nn
读取标签数据tensor_list = []with open('biaoqian.txt', 'r') as file: lines = file.readlines() for line in lines: line = line.strip() numbers = line.split() tensor = torch.tensor([float(num) for num in numbers]) tensor_list.append(tensor)
创建网络实例class MyNetwork(nn.Module): def init(self): super(MyNetwork, self).init() self.flatten = nn.Flatten() self.fc1 = nn.Linear(312 * 256, 512) self.dropout1 = nn.Dropout(0.5) self.fc2 = nn.Linear(512, 256) self.dropout2 = nn.Dropout(0.5) self.fc3 = nn.Linear(256, 3)
def forward(self, x): x = self.flatten(x) x = F.relu(self.fc1(x)) x = self.dropout1(x) x = F.relu(self.fc2(x)) x = self.dropout2(x) x = self.fc3(x) return x
network = MyNetwork()
指定pt文件的路径和训练数据pt_file_path = 'expanded1.pt'data = torch.load(pt_file_path)
将数据转换为张量input_tensors = [torch.tensor(tensor) for tensor in data]train_tensors = input_tensors[0:18000]val_tensors = input_tensors[18000:]
定义优化器optimizer = optim.AdamW(network.parameters(), lr=0.001, weight_decay=0.02)
num_epochs = 5for epoch in range(num_epochs): running_loss = 0.0 train_correct_total = 0 train_total = 0
# 训练阶段 network.train()
for i, input_tensor in enumerate(train_tensors): optimizer.zero_grad()
output = network(input_tensor)
loss = custom_loss(output, tensor_list[i]) # 自定义损失函数
loss.backward() optimizer.step()
# 统计准确率 target_similarity = F.cosine_similarity(output, tensor_list[i].unsqueeze(0), dim=1) label_list = [torch.tensor([1, 0, 0]), torch.tensor([0, 1, 0]), torch.tensor([0, 0, 1])] other_list = [] for label_tensor in label_list: if not torch.all(torch.eq(tensor_list[i], label_tensor)): other_list.append(label_tensor)
if target_similarity > torch.max(torch.stack([F.cosine_similarity(output, other.unsqueeze(0), dim=1) for other in other_list]), dim=0).values: train_correct_total += 1
train_total += 1
running_loss += loss.item()
# 计算训练集的准确率 train_accuracy = train_correct_total / train_total
# 保存网络参数 if epoch == num_epochs - 1: torch.save(network.state_dict(), 'final_model.pt')
# 打印训练信息 print('Train Accuracy: %.2f%%' % (100 * train_accuracy)) print('Epoch: %d, Loss: %.3f' % (epoch + 1, running_loss))
# 验证阶段 network.eval() val_correct_total = 0 val_total = 0
with torch.no_grad(): for j, val_input_tensor in enumerate(val_tensors): val_output = network(val_input_tensor)
label_list = [torch.tensor([1, 0, 0]), torch.tensor([0, 1, 0]), torch.tensor([0, 0, 1])] val_target_similarity = F.cosine_similarity(val_output, tensor_list[j].unsqueeze(0), dim=1) other_list = [] for label_tensor in label_list: if not torch.all(torch.eq(tensor_list[j], label_tensor)): other_list.append(label_tensor)
if val_target_similarity > torch.max(torch.stack([F.cosine_similarity(val_output, other.unsqueeze(0), dim=1) for other in other_list]), dim=0).values: val_correct_total += 1
val_total += 1
# 计算验证集的准确率 val_accuracy = val_correct_total / val_total
# 打印验证信息 print('Validation Accuracy: %.2f%%' % (100 * val_accuracy)) print('Epoch: %d, Loss: %.3f' % (epoch + 1, running_loss))
代码解读
-
数据加载与预处理: 代码首先从 'biaoqian.txt' 文件读取标签数据,并将其转换为PyTorch张量。然后加载训练数据,并将其划分为训练集和验证集。
-
网络定义: 定义了一个名为
MyNetwork的简单神经网络,包含两个全连接层和Dropout层。Dropout层可以随机丢弃一部分神经元,有效防止模型过拟合。 -
训练过程: 使用AdamW优化器进行训练,并在每个epoch结束后计算训练集准确率和损失函数值。
-
验证过程: 在每个epoch结束后,使用验证集评估模型性能,计算验证集准确率。
-
模型保存: 在最后一个epoch结束后,保存训练好的模型参数。
注意事项
custom_loss函数需要根据具体任务进行自定义。* 可以根据实际情况调整网络结构、超参数和训练策略,以获得最佳性能。
希望这个完整的PyTorch图像分类代码示例能够帮助你快速入门并构建高精度的图像分类模型!
原文地址: https://www.cveoy.top/t/topic/b4NW 著作权归作者所有。请勿转载和采集!