c语言编程笔录

首页 >   > 笔记大全

笔记大全

Python中的深度学习兴趣组实例

更新时间:2023-11-08

深度学习兴趣组介绍

我们的Python深度学习兴趣组是由一群对深度学习感兴趣的程序员组成的,主要致力于探索深度学习的各种应用和学术研究。我们会定期举行讨论会和技术分享,以便成员能够相互学习和进步。

项目的架构

├── data
│   ├── train
│   ├── val
│   └── test
├── model
│   ├── model.py
│   ├── train.py
│   └── predict.py
└── utils
    ├── data_loader.py
    ├── preprocess.py
    └── evaluate.py

我们的项目是基于PyTorch的,主要分为data、model和utils三个模块。其中,data模块用于数据的处理和准备,model模块负责网络模型的编写和训练,utils模块则提供了一些辅助函数,比如数据预处理和模型评估。

数据处理和准备

import torch.utils.data as data
from torchvision import transforms

class CustomDataset(data.Dataset):
    def __init__(self, root_dir, transform=None):
        self.root_dir = root_dir
        self.transform = transform

        self.img_files = [...]
        self.label_files = [...]

    def __getitem__(self, index):
        img_path = self.img_files[index]
        label_path = self.label_files[index]

        img = Image.open(img_path)
        label = Image.open(label_path)

        if self.transform:
            img = self.transform(img)

        return img, label

    def __len__(self):
        return len(self.img_files)

train_transform = transforms.Compose([
    transforms.RandomCrop(64),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor()
])

train_set = CustomDataset("data/train", transform=train_transform)
train_loader = data.DataLoader(train_set, batch_size=32, shuffle=True)

val_transform = transforms.Compose([
    transforms.CenterCrop(64),
    transforms.ToTensor()
])

val_set = CustomDataset("data/val", transform=val_transform)
val_loader = data.DataLoader(val_set, batch_size=32)

test_set = CustomDataset("data/test", transform=val_transform)
test_loader = data.DataLoader(test_set, batch_size=32)

我们使用PyTorch提供的data和transforms模块来进行数据的处理和准备。自定义了CustomDataset类用于读取数据和标签,实现__getitem__和__len__方法来实现数据的加载和处理。其中transform参数传递进来后,会在getitem的时候将图片按照transform进行操作。

训练和预测

import torch.optim as optim
import torch.nn.functional as F

from model.model import Net
from utils.data_loader import load_model

net = Net()
criterion = F.nll_loss
optimizer = optim.SGD(net.parameters(), lr=0.01, momentum=0.9)

model_path = "model/model.pth"
net, optimizer, epoch = load_model(model_path, net, optimizer)

for epoch in range(5):
    running_loss = 0.0
    for i, data in enumerate(train_loader):
        inputs, labels = data

        optimizer.zero_grad()
        outputs = net(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 10 == 9:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 10))
            running_loss = 0.0

    torch.save({
        "epoch": epoch,
        "net": net.state_dict(),
        "optimizer": optimizer.state_dict()
    }, model_path)

def predict(model_path, inputs):
    net = Net()
    net, _, _ = load_model(model_path, net, None)
    net.eval()

    outputs = net(inputs)

    return outputs

我们的网络模型用到的是自定义的Net类,该类继承自nn.Module,来定义网络的结构和前向计算。我们在train.py里定义了一个训练函数进行训练,其中使用SGD优化器和nll_loss损失函数对网络进行优化和训练。最后将训练好的网络模型保存到指定的model_path中,并提供了一个predict函数进行预测。

总结:
综上所述,我们的Python深度学习兴趣组是一个由一群对深度学习技术和应用充满热情的程序员所组成的团队。我们的项目是基于Python的深度学习实践,主要分为数据处理和准备、模型设计和训练、预测和评估三个部分。其中我们使用了PyTorch提供的数据处理、网络模块、损失函数和优化器等模块,通过自定义的网络结构和训练过程,不断训练提高模型的准确率和泛化能力。最后预测和评估模块会使用前面训练好的模型进行预测并评估模型的效果。我们希望通过不断的探索和学习,来提升我们的深度学习技术和实践能力,为各行各业发展和进步做出贡献。