美文网首页
pytorch记录

pytorch记录

作者: SunJi_ | 来源:发表于2020-08-13 15:23 被阅读0次
    1. 免费使用pycharm专业版
      参考链接:https://www.cnblogs.com/cripplepx/p/12310265.html

    2. torch.view()
      重构tensor的维度,类似numpy里的reshape()
      torch.view(a,b) -> a行b列
      torch.view(-1) -> 1维
      torch.view(a,-1,b),-1代表不确定,让计算机计算对应维度

    3. torch.cat()
      torch.cat((a,b),0) ->竖着拼
      torch.cat((a,b),1) ->横着拼
      默认为1

    4. argparse
      解析命令行参数的工具包

    5. dataset & dataloader
      dataset:pytorch中表示数据集的一个抽象类
      dataloader:迭代器,传入dataset对象,根据batchsize生成一个batch的数据

    #官方数据集
    trainset = torchvision.datasets.CIFAR10(root='./data', train=True,download=True,transform=transform)
    trainloader = torch.utils.data.Dataloader(trainset, batch_size=16, shuffle=True, num_workers=2)
    #自定义数据集
    
    
    1. torch.nn.Sequential
    net = torch.nn.Sequential(
                nn.Linear(1,20),
                torch.nn.Relu(),
                nn.Linear(20,20),
                torch.nn.Relu(),
                nn.Linear(20,1)
    )
    print(net)
    
    1. torch.save &load
    #模型的保存
    torch.save(model, 'model.pkl') #保存模型网络结构及参数
    torch.save(model.state_dict(), 'model_parameters.pkl') #保存模型的参数
    #模型的加载
    net1 = torch.load('model.pkl')
    model.load_state_dict(torch.load(model_parameters.pkl))
    
    1. dataset & dataloader
    import torch.utils.data as Data
    torch_dataset = Data.TensorDataset(x,y)
    loader = Data.DataLoader(torch_dataset, batch_size=BATCH_SIZE, shuffle=True)
    
    1. torch.unsequeeze
      扩展维度,返回一个新的张量,对输入的位置插入维度1
    torch.unsequeeze(input, dim, out=none) # dim为插入维度的索引
    #相反---降维
    torch.sequeeze(input, dim, out=none)
    
    1. torch.max
    torch.max(input, dim)
    #返回的是两个值,一个是每一行最大值的tensor组,另一个是最大值所在的位置
    max_value,index = torch.max(x,dim=1) 
    torch.max(x,dim=0)[0].numpy() #每一列最大值
    torch.max(x,dim=1)[0].numpy() #每一行最大值
    torch.max(x,dim=0)[1].numpy() #每一列最大值的索引
    torch.max(x,dim=1)[1].numpy() #每一行最大值的索引
    
    1. type & dtype & astype

    darts & pc-darts

    1. DARTS代码解析
    2. DARTS代码解析
    3. DARTS代码解析
    4. DARTS源码阅读
    5. PC-DARTS 网络结构搜索程序分析
    6. PC-DARTS源码分析
    7. PC-DARTS部分代码

    PYNQ-Z1开发板支持python

    1. vivado配置环境
    2. 配置代码环境
    3. 模型部署

    1. pytorch optimizer应用
      SGD:为了改善训练数据N太大导致计算总的cost function来求解梯度代价很大的问题,计算训练数据中的小批量(minibatches),minibatch是一个为2的指数的超参数。
    torch.optim.SGD(params, lr, momentum, dampening, weight_decay, nesterov=False)
    #Momentum update
    v = mu * v - learning_rate * dx # integrate velocity
    x += v #integrate position
    

    AdaGrad:
    RMSProp:
    Adam:

    torch.optim.Adam(params, lr, betas=(a,b), weight_decay, amsgrad=False)
    #Adam update
    m = beta1*m + (1‐beta1)*dx
    v = beta2*v + (1‐beta2)*(dx**2)
    x += ‐ learning_rate * m / (np.sqrt(v) + eps)
    

    一:pytorch编写代码步骤:
    四大部分:数据定义、model定义、优化器&损失函数定义、主函数代码逻辑

    训练流程
    1. 输入处理模块 --- 输入数据x变成tensor
    2. 模型构建模块 --- 输入数据变成预测的y’,前向传播过程
    3. 定义代价函数和优化器的模块 --- 将前向传播得到的y’进行自动求导和更新
    4. 构建训练过程 --- 迭代训练

    数据处理:
    torch.utils.data.Dataset

    from torch.utils.data import Dataset
    class trainDataset(Dataset):
          def __init__(self):
          # constructor
    
          def __getiem__(self, index):
          # 获得第index号的数据和标签
    
          def __len__(self):
          # 获得数据量
    

    torch.utils.data.DataLoader

    from torch.utils.data import DataLoader
    dataLoader = DataLoader(dataset, shuffle=True, batch_size=16)
    for i, data in enumerate(dataLoaderr, 0):
            x, y = data
    

    模型构建:
    torch.nn.Module

    class MyModule(torch.nn.Module):
          def __init__(self):
                  super(MyModule, self).__init__()
                   ...
          def forward(self, x):
                  ...
                  return ...
    model = MyModule()
    

    搭建模型时, 只需考虑前向传播,不需要考虑反向传播。

    定义代价函数和优化器:

    criterion = torch.nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameterd(), lr = 0.0001, betas=(0.9,0.99), weight_decay, amsgrad=False)
    optimizer.zero_grad
    output = model(input)
    output.backward(output)
    optimizer.step()
    

    损失函数loss可以看作nn的某一个特殊的层,也是nn.Module的一个子类。但习惯上将损失函数不放在model中定义,而是单独定义。损失函数和优化器都有许多种,具体实际应用时参照官方doc。
    在finretune过程中,利用optimizer对网络的不同层设置不同的学习率。

    torch.optim.SDG([{'params':net.feature.parameters()},{'params':net.classifier.parameters(), 'lr': 1-5e}], 'lr':1-3e)
    

    构建训练过程:

    def train(epoch): # 进行一个epoch的训练
          for i, data in enumerate(dataLoader, 0);
                x, y = data # 取出minibatch的数据和标签
                y_pred = model(x) # 前向传播
                loss = criterion(y_pred, y) # 计算损失函数
                optimizer.zero_grad # 清零梯度,准备计算
                loss.backward() # 反向传播
                optimizer.step() # 更新训练参数
    

    实操

    1. regression
    import torch
    import torch.nn.functional as F
    import torch.nn as nn
    import matplotlib.pyplot as plt
    from torch.autograd import Variable
    
    
    # x_data = torch.randn(100,1,requires_grad=True)
    # y_data = torch.empty(100,1).random_(2)
    x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
    y = x.pow(3) + torch.randn(x.size())*0.1
    x, y = (Variable(x),Variable(y))
    plt.scatter(x, y)
    plt.show()
    
    class regressionNet(torch.nn.Module):
        def __init__(self, n_input, n_hidden, n_output):
            super(regressionNet, self).__init__()
            self.hidden1 = torch.nn.Linear(n_input, n_hidden)
            self.hidden2 = torch.nn.Linear(n_hidden,n_hidden)
            self.predict = torch.nn.Linear(n_hidden, n_output)
    
        def forward(self, x):
            y_pred = self.hidden1(x)
            y_pred = F.relu(y_pred)
            y_pred = self.hidden2(y_pred)
            y_pred = F.relu(y_pred)
            y_pred = self.predict(y_pred)
            return y_pred
    model = regressionNet(1,20,1)
    print(regressionNet)
    
    criterion = torch.nn.MSELoss()
    optimizer = torch.optim.SGD(model.parameters(),lr=0.05)
    
    plt.ion()
    plt.show()
    
    for epoch in range(1000):
        y_pred = model(x)
        loss = criterion(y_pred, y)
        print(epoch, loss.item())
    
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if epoch%20 == 0:
            plt.cla()
            plt.scatter(x.data.numpy(),y.data.numpy())
            plt.plot(x.data.numpy(),y_pred.data.numpy(),'r-',lw=5)
            plt.text(0.5,0,'loss = %.4f' %loss.data,fontdict={'size':20,'color':'red'})
            plt.pause(0.05)
    plt.ioff()
    plt.show()
    
    1. mnist
    
    

    相关文章

      网友评论

          本文标题:pytorch记录

          本文链接:https://www.haomeiwen.com/subject/bmvqcktx.html