zoukankan      html  css  js  c++  java
  • 学习日记(3.5)

    Part1.optimize(最优化的,充分利用的)优化模型方法

    今天主要学习的就是torch中的model优化方法库——optim
    在昨天的nn库的基础上把原来的手动更新模型数据的代码换成封装好的optim

    #在使用nn的基础上,我们在学一个torch的方法opitmizer,可以帮助我们做model的优化
    #因此在这里我们继续沿用昨天的代码(删除手写的模型更新)来完成 使用optimizer优化模型
    import torch.nn as nn
    import torch
    N,D_in,H,D_out=64,1000,100,10
    x=torch.randn(N,D_in)
    y=torch.randn(N,D_out)
    model=torch.nn.Sequential(##模型的组成顺序
    #第一层是一个线性结构 这里和前面有点不一样了这里有偏置的
        #y=w1*x+b1
        torch.nn.Linear(D_in,H),
    #第二层是一个ReLU激活函数
        torch.nn.ReLU(),
    #第三层也是一个线性的结构和第一层一样的
        torch.nn.Linear(H,D_out),
    )
    
    #这里使用了nn里的MSELoss来处理loss损失数值,里面的参数reduction
    #reduction = ‘none’,直接返回向量形式的 loss
    #reduction = ‘sum’,返回loss之和
    #reduction = ''elementwise_mean,返回loss的平均值
    #reduction = ''mean,返回loss的平均值
    loss_fn=nn.MSELoss(reduction='sum')
    learning_rate= 1e-4# 1*10^4在torch中学习率一般就选1e-4---1e-5
    #使用optimizer来自动更新模型的参数,因此把所有的参数都传进去,加入学习率
    optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)
    
    
    for it in range(500): 
        y_pred=model(x)
        loss=loss_fn(y_pred,y)
        print("第",it,"轮","损失值:",loss.item())
        #在每次循环中清零 grad避免累加
        optimizer.zero_grad()
        loss.backward()
        #optimizer的执行step更新指令,更新model的每一个parameter
        optimizer.step()
        
       
    
        
    

    看一下模型的训练情况:
    在这里插入图片描述
    在这里插入图片描述

    Part2.做一个结构清晰的pytorch的model

    1.define input and output

    定义好输入和输出的,得到方便进入训练的数据

    2.define a torch model

    这里的模型就只有两层线性结构,也没有偏置,很简单。一旦网络复杂起来其实也不必担心,我们一个一个的初始化每一层结构

    3.define a loss function

    用nn.MSELoss()计算loss

    4.optimize this model

    优化我们的模型,这里用到的是optim.Adam()

    5.train this model by updating the parameters

    在这个神经网络里面训练模型我就拿一轮举例,
    Forwad pass:网络正向传播由x计算得到y_pred预测值
    Compute the loss:(target-y_pred)求均方得到loss
    Backward pass:是网络反向传播,链式反应发生,输出层-->隐藏层-->输入层的权值(如果有bias偏置的时候偏置也会调整)使得模型中的参数得到训练,模型的loss值不断减少得到优化。

    无论一个多大的模型,多长的代码就想小说一样都有明确的结构,以上也大概就是在pytorch上做一个神经网络的最基本的流程,最基本的思路,通过今天的网课学习获得了这个知识,心里算式踏实了。接下来我们写一个如上结构的神经网络

    import torch
    import torch.nn as nn
    N,D_in,H,D_out=64,1000,100,10
    
    
    #1.define input and output
    x=torch.randn(N,D_in)
    y=torch.randn(N,D_out)
    
    
    #2.define a torch model 
    class TwoLayerNet(torch.nn.Module):
        def __init__(self,D_in,H,D_out):
            super(TwoLayerNet,self).__init__()#supper是python里调用父类方法
            #2.define the model atchitecture,
            self.linear1=torch.nn.Linear(D_in,H,bias=False)#这里bias是偏置
            self.linear2=torch.nn.Linear(H,D_out,bias=False)
        def forward(self,x):
            y_pred=self.linear2(self.linear1(x).clamp(min=0))
            return y_pred
    
        
    #2. define a model
    model=TwoLayerNet(D_in,H,D_out)
    
    
    #3.define a loss function
    loss_fn=nn.MSELoss(reduction='sum')
    learning_rate=1e-4
    
    
    
    #4.optimize this model
    optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)
    #4.train this model
    for it in range(0,500):
    #Forward pass
        y_pred=model(x)
    #compu the loss
        loss=loss_fn(y_pred,y)
        print("第",it,"轮","损失值:",loss.item())
    #Baclward pass
        optimizer.zero_grad()
        loss.backward()
        #update the model parameters
        optimizer.step()
        
    
    		
    			 
    

    运行结果:模型训练合格
    在这里插入图片描述

  • 相关阅读:
    初识AOP与动态代理
    Java读取打印机自定义纸张.
    通过邮箱发送html报表
    Java 代码质量
    JAVA学习笔记--匿名内部类
    JAVA学习笔记--简介几个常见关键字static、final、this、super
    JAVA学习笔记--迭代器
    JAVA学习笔记--初识容器类库
    JAVA学习笔记--策略设计模式与适配器模式
    JAVA学习笔记--接口
  • 原文地址:https://www.cnblogs.com/Eldq/p/12423940.html
Copyright © 2011-2022 走看看