pytorch 常用API,分类训练总结

1.安装

https://pytorch.org/ 官网,根据对应情况执行命令行,就完了

2.数据预处理

from PIL import Image #读图
from torchvision import transforms, datasets #导入图像数据处理,转换库
import os
import torch

def readImg(path):
    '''
    用于替代ImageFolder的默认读取图片函数,以读取单通道图片
    '''
    return Image.open(path)


def ImageDataset(args):
    data_transforms = { #数据增强obj
        'train': transforms.Compose([ #组合转换
            transforms.RandomCrop(RANDOMCROP_SIZE), #随机裁剪
            transforms.RandomHorizontalFlip(), #随机水平翻转
            transforms.ToTensor(), #转tensor 变float变tensor
            transforms.Normalize([0.5], [0.5]) #改均值 
        ]),
        'test': transforms.Compose([#测试时要和train对应,有些增强不需要
            transforms.CenterCrop(RANDOMCROP_SIZE),
            transforms.ToTensor(),
            transforms.Normalize([0.5], [0.5])
        ]),
    }
    image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), #实用读分类图库
                        data_transforms[x] #数据增强
                        # , loader=readImg #单通道图像使用
                        )
                        for x in ['train', 'test']}
    dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x],
                    batch_size=args.batch_size, shuffle=(x == 'train'),
                    num_workers=args.num_workers)
                    for x in ['train', 'test']}
    dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'test']}
    class_names = image_datasets['train'].classes

    return dataloaders, dataset_sizes, class_names

3.网络模型保存和加载

(1) 仅仅保存和加载模型参数
torch.save(the_model.state_dict(), PATH)

the_model = TheModelClass(*args, **kwargs)
the_model.load_state_dict(torch.load(PATH))

(2) 保存和加载整个模型
torch.save(the_model, PATH)
#切记! 对应网络class 需要在加载之前已经定义
the_model = torch.load(PATH)

#使用GPU时
model = TheModelClass().cuda()
model = nn.DataParallel(model).cuda()
model.load_state_dict(torch.load(best_model_path))
model.eval()

# 预测图像的类别
output = model(input)

4.网络构建


import torch

import torch.nn as nn

class SimpleNet(nn.Module):

    def __init__(self):
        super(SimpleNet, self).__init__()
        # 四个卷积层用于提取特征
        # 3 input channel image 160x160, 8 output channel image 80x80
        self.conv = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=8, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 3 input channel image 80x80, 16 output channel image 40x40
        self.conv1 = nn.Sequential(
            nn.Conv2d(in_channels=8, out_channels=16, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 8 input channel image 40x40, 32 output channel image 20x20
        self.conv2 = nn.Sequential(
            nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 16 input channel image 20x20, 64 output channel image 10x10
        self.conv3 = nn.Sequential(
            nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, stride=1, padding=1),
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 分类
        self.classifier = nn.Sequential(
            nn.Linear(64 * 10 * 10, 6)
        )

    def forward(self, x):
        x = self.conv(x)
        x = self.conv1(x)
        x = self.conv2(x)
        x = self.conv3(x)
        x = x.view(-1, 64 * 10 * 10)
        x = self.classifier(x)
        return x

5.训练过程


import torch
import torch.nn as nn
import torch.optim as optim
from torch.optim import lr_scheduler

model = SimpleNet()
#是否使用gpu
if use_gpu:
        model = torch.nn.DataParallel(model)
        model.to(torch.device('cuda'))
    else:
        model.to(torch.device('cpu'))
确定loss Function
criterion = nn.CrossEntropyLoss()

确定优化方法
optimizer_ft = optim.SGD(model.parameters(), lr=args.lr, momentum=0.9, weight_decay=0.00004)
optimizer_ft = optim.Adam(model.parameters(), lr=args.lr)

学习率衰减
exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=1, gamma=0.98)

device = torch.device('cuda' if use_gpu else 'cpu')

#test,log之类的没写,可以自己加,复制是不能直接跑的,只是介绍流程
for epoch in need_epoch:
    exp_lr_scheduler (epoch)
    model.train() #训练模式,batchNormal和dropout会跑,model.eval()时不跑
    # 在多个batch上依次处理数据(Iterate over data)
    for i, (inputs, labels) in enumerate(dataloders[phase]):
        inputs = inputs.to(device)
        labels = labels.to(device)

        # 梯度置零(zero the parameter gradients)
        optimizer.zero_grad()

         # 前向传播(forward)
         # 训练模式下才记录梯度以进行反向传播(track history if only in train)
         outputs = model(inputs)
         _, preds = torch.max(outputs, 1)
         loss = criterion(outputs, labels)
         # 训练模式下进行反向传播与梯度下降(backward + optimize only if in training phase)
         loss.backward()
         optimizer.step()

         # 统计损失和准确率(statistics)
         running_loss += loss.item() * inputs.size(0)
         running_corrects += torch.sum(preds == labels.data)

     batch_loss = running_loss / (i * args.batch_size + inputs.size(0))
     batch_acc = running_corrects.double() / (i * args.batch_size + inputs.size(0))

 epoch_loss = running_loss / dataset_sizes
 epoch_acc = running_corrects.double() / dataset_sizes

# 深拷贝模型(deep copy the model)
if phase == 'test' and epoch_acc > best_acc:
    best_acc = epoch_acc
    best_model_wts = copy.deepcopy(model.state_dict())

6.tensorboard 

安装 pip install tensorboard==2.0.0 (固定安装2.0版本,因为torch版本未到2.1,后面如果上去了可以自己改 )


# from tensorboardX import SummaryWriter
from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter(log_dir='log') #存储log的位置

writer.add_scalar(phase + '/Loss', epoch_loss, epoch) #数值型(表title,y轴数值,x轴数值)
writer.add_image(phase + '/Loss', image, epoch) #数值型(表title,图像值,x轴数值)

writer.close()

查看tensorboard:在存储log的位置运行命令行  tensorboard --logdir runs

 

 

注:有参考网上一个教程,具体链接找不到了。。。。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PyTorch 是一个基于 Python 的科学计算库,它是 Torch 在 Python 语言上的衍生版本。它主要提供了以下 API: 1. torch.Tensor: PyTorch 中最核心的数据结构,即张量(Tensor)。它是一个具有动态图计算功能的多维数组,支持 GPU 计算、自动求导等功能。 2. torch.nn: PyTorch 中的神经网络模块,提供了丰富的网络层和损失函数等组件,方便用户搭建自己的神经网络模型。 3. torch.optim: PyTorch 中的优化器模块,提供了常见的优化算法,如 SGD、Adam 等,方便用户训练神经网络模型。 4. torch.utils.data: PyTorch 中的数据处理模块,提供了常用的数据处理工具,如 DataLoader、Dataset 等,可以方便地对数据进行处理和加载。 5. torch.autograd: PyTorch 中的自动求导模块,能够自动计算张量的梯度,方便用户进行反向传播计算。 6. torch.cuda: PyTorch 中的 GPU 加速模块,支持在 GPU 上进行张量计算,提高计算效率。 7. torch.onnx: PyTorch 中的模型导出模块,可以将 PyTorch 模型导出为 ONNX 格式,方便用户在其他框架中使用。 8. torchvision: PyTorch 中的图像处理模块,提供了常用的图像处理工具,如数据加载、预处理、可视化等。 ### 回答2: PyTorch是一个非常流行的深度学习框架,具有丰富的API,使得开发和训练神经网络变得更加简单和高效。下面是一些PyTorchAPI的简要介绍: 1. Tensor操作:PyTorch的核心是Tensor数据结构。它提供了各种用于创建、操作和变换Tensor的API函数。例如,torch.tensor函数可以从Python中的列表或数组创建Tensor对象,torch.zeros和torch.ones函数可以创建全零或全一的Tensor,torch.arange函数可以创建一个从给定范围开始到结束的Tensor。 2. 自动求导:PyTorch的autograd模块提供了自动求导的支持。它允许开发者定义和执行任意计算图,并自动计算任意张量相对于其他张量的梯度。只需要将需要计算梯度的张量设置为可追踪状态,PyTorch将会自动构建计算图并记录梯度信息。这可以用来方便地进行反向传播和参数更新。 3. 神经网络层:PyTorch提供了丰富的神经网络层API,包括线性层、卷积层、循环神经网络层等。用户可以根据自己的需要选择和组合这些层来构建神经网络模型。 4. 损失函数:PyTorch提供了常见的损失函数API,例如均方误差、交叉熵等。这些函数可以用来衡量模型的输出与标签之间的差异,并作为训练过程的目标函数。 5. 优化器:PyTorch提供了各种优化器API,例如随机梯度下降、Adam等。这些优化器可以用来更新模型的参数,以使目标函数最小化。 6. 数据加载和预处理:PyTorch提供了一系列用于加载和预处理数据的API函数。例如torchvision模块可以用于加载常见的计算机视觉数据集,torch.utils.data模块可以用于数据集的处理和批量加载。 总的来说,PyTorchAPI非常丰富和灵活,可以满足各种深度学习任务的需求,使得开发者可以更加自由地设计和实现自己的深度学习模型。 ### 回答3: PyTorch是一个广泛应用于深度学习领域的开源深度学习框架,它提供了丰富的API使得开发者能够快速构建、训练和部署深度学习模型。 PyTorchAPI提供了各种不同的模块和函数,使得用户能够以简洁的方式创建神经网络模型。一些最常用API包括torch.nn模块,该模块提供了各种不同的层和损失函数,如全连接层、卷积层、循环神经网络等。此外,torch.optim模块提供了各种优化算法,如随机梯度下降、动量优化等,用于训练模型。torch.utils.data模块则提供了用于数据加载和预处理的工具,如数据集类、数据加载器等。 PyTorchAPI还支持动态图机制,这使得用户能够方便地构建计算图并进行动态计算。这种动态图机制使得PyTorch在调试和开发过程中更加灵活,并且允许用户执行复杂的控制流操作。 此外,PyTorch还提供了许多其他有用的API,如torchvision提供了一些用于计算机视觉任务的预训练模型和数据集,torchtext提供了用于自然语言处理任务的数据处理工具等。 总而言之,PyTorchAPI非常丰富和灵活,使得用户可以根据自己的需求快速构建和训练深度学习模型。它的简洁性和易用性使得PyTorch成为许多研究者和开发者的首选框架之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值