Loading

pytorch 及其模板应用

pytorch及其应用

优点

  1. 支持GPU、灵活;
  2. 支持动态神经网络;
  3. 底层代码易于理解;
  4. 命令式体验;自定义扩展

缺点

  1. 对比TensorFlow,全面性不足,不支持快速傅里叶、沿维翻转张量和检查无穷与非数值张量;

  2. 针对移动端、嵌入式部署以及高性能服务器端的部署其性能表现有待提升;

  3. 因为框架较新,社区没有那么强大,在文档方面其C库大多数没有文档。

环境配置

  1. 有关conda虚拟环境
conda list # 查看安装了哪些包
conda env list # 查看当前存在哪些虚拟环境
conda update conda # 检查更新当前conda
python --version # 查看python版本
conda create -n xxx python=3.6 # xxx为自己命名的虚拟环境名称,该文件可在Anaconda安装目录 envs文件下找到
conda create -n pytorch python=3.6
conda activate yorr_env_name # 激活虚拟环境
conda install -n your_env_name [package] # 对虚拟环境安装额外的包
deactivate # 关闭虚拟环境
conda remove -n your_env_name --all
conda remove --name your_env_name package_name # 删除环境中的某个包
  1. 虚拟环境下安装 jupyter
conda activate pytorch
conda install nb_conda
  1. pytorch安装
conda activate pytorch
conda install pytorch torchvision cpuonly -c pytorch
  1. 离线安装(极其有用,血泪教训)
# https://download.pytorch.org/whl/torch_stable.html
# 下载对应的whl,然后安装
pip install D:\software\Anaconda3\whl_download\torch-1.5.0+cpu-cp36-cp36m-win_amd64.whl

Python学习中的两大法宝函数

  1. dir() 道具:相当于你的手和眼睛,它可以帮你打开东西和看到其中的东西。能让你了解package有哪些东西,也许是更小的模块,或者是函数。dir() 函数,当输出是带有前后双下划线的,这个时候,就表明,这是一个函数,一个工具。你应该使用 help() 函数去查看这个工具的使用方法。
  2. help() 道具:相当于说明书,你可以知道每个工具的使用方法。能让你知道函数的使用方法。
import torch
dir(torch)
help(torch.cuda.is_available)

数据

from PIL import Image
img_path = "" # 注意,win下\\
img = Image.open(ima_path)
img.show()
import os
dir_path = "" # /
img_path_list = os.listdir(dir_path) # 文件夹下的变成列表

root_dir = "dataset/train"
label_dir = "ants"
path = os.path.join(root_dir,label_dir) # 系统自动加起来,不会出错
from torch.utils.data import Dataset
class MyData(Dataset):
	def __init__(self, root_dir, label_dir):
		self.root_dir = root_dir
		self.label_dir = label_dir
		self.path = os.path.join(self.root_dir,self.label_dir)
		self.img_path = os.listdir(self.path) # 所有图片的名称
	
	def __getitem__(self,idx):
		img_name = self.img_path[idx] # 图片名
		img_item_path = os.path.join(self.root_dir,self.label_dir, img_name) # 图片相对路径地址
		img = Image.open(img_item_path) # 读取图片
		label = self.label_dir # 这里label就是文件名
		return img, label
	
	def __len__(self):
		return len(self.img_path) # 数据集的长度

root_dir = "dataset/train"
ants_label_dir = "ants"
bees_label_dir = "bees"
ants_dataset = MyData(root_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_label_dir)

img, label = ants_dataset[0] # 就自动调用了__getitem__获取了第一个
img.show()

train_dataset = ants_dataset + bees_dataset # 合并数据集 数据增强

构建自己的网络

  1. 处理数据
  2. 定义网络
  3. 定义损失函数
  4. 定义优化方法
  5. 训练

一个例子

import torch

class TwoLayerNet(torch.nn.Module):
    
    def __init__(self, D_in, H, D_out):
        """
        在构造函数中,我们实例化了两个nn.Linear模块,并将它们作为成员变量。
        """
        super(TwoLayerNet, self).__init__()
        self.linear1 = torch.nn.Linear(D_in, H)
        self.linear2 = torch.nn.Linear(H, D_out)
    
    def forward(self, x):
        """
        在前向传播的函数中,我们接收一个输入的张量,也必须返回一个输出张量。
        我们可以使用构造函数中定义的模块以及张量上的任意的(可微分的)操作。
        """
        h_relu = self.linear1(x).clamp(min=0)
        y_pred = self.linear2(h_relu)
        return y_pred

# N是批大小; D_in 是输入维度;
# H 是隐藏层维度; D_out 是输出维度
N, D_in, H, D_out = 64, 1000, 100, 10

# 产生输入和输出的随机张量
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)

# 通过实例化上面定义的类来构建我们的模型。
model = TwoLayerNet(D_in, H, D_out)

# 构造损失函数和优化器。
# SGD构造函数中对model.parameters()的调用,
# 将包含模型的一部分,即两个nn.Linear模块的可学习参数。
loss_fn = torch.nn.MSELoss(reduction='sum')
optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)
for t in range(500):
    # 前向传播:通过向模型传递x计算预测值y
    y_pred = model(x)

    #计算并输出loss
    loss = loss_fn(y_pred, y)
    # print(t, loss.item())

    # 清零梯度,反向传播,更新权重
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

一个可以效仿的测试函数:

def test(model, device, test_loader):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for i,data in enumerate(test_loader):          
            x,y= data
            x=x.to(device)
            y=y.to(device)
            optimizer.zero_grad()
            y_hat = model(x)
            test_loss += criterion(y_hat, y).item() # sum up batch loss
            pred = y_hat.max(1, keepdim=True)[1] # get the index of the max log-probability
            correct += pred.eq(y.view_as(pred)).sum().item()
    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(val_dataset),
        100. * correct / len(val_dataset)))
posted @ 2020-09-15 14:30  戴墨镜的长颈鹿  阅读(295)  评论(0)    收藏  举报