zoukankan      html  css  js  c++  java
  • 学习笔记 (3.4)

    昨天做了从复杂的手写神经网络到backward,今天再使用更为简单的 torch中的nn库,nn就是neural network,在这个里面可以创建一个model来帮助我们保存数据和计算。同样这个nn我们是可以根据我们的网络的结构根据顺序来给与参数,比方说我们的输入层到隐藏层是线性的结构(y=wx+b),而隐藏层中是激活函数ReLU,隐藏层到输出层又是线性的,我们就可以这样定义
    model=torch.nn.Sequential(
    torch.nn.Linear(D_in,H),
    torch.nn.ReLU(),
    torch.nn.Linear(H,D_out),
    )
    其中关于一些代码的注释我也添加了,便于阅读
    完整代码如下:

    #这次我用使用Pytorch中的nn库来创建神经网络,用Pytorch autograd来构建计算图和gradients然后Pytorch会帮我们自动计算gradients
    #nn==neural network,在backward的基础上让网络变的更简单
    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),
    )
    #这是把w1,w2输入层-->隐藏层-->输出层的权重初始化为normal类型的
    #关于normal,官网的解释是 :Returns a Tensor of random numbers drawn from separate normal distributions who’s mean and standard deviation are given.
    #大概是返回一个张量,张量里面的随机数是从相互独立的正态分布中随机生成的,这样使得权重会好一点,训练效果也好,过一会我会做实验
    torch.nn.init.normal_(model[0].weight)
    torch.nn.init.normal_(model[2].weight)
    
    #这里使用了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-6# 1*10^6
    
    
    for it in range(500): 
        y_pred=model(x)
        loss=loss_fn(y_pred,y)
        print("第",it,"轮","损失值:",loss.item())
        loss.backward()
        with torch.no_grad():
            #解释一下这里面的parameter是指的所有的参数,包括了这个模型里的所有参数,tensor和grad都有
            for param in model.parameters():
                #这里的parm是每一个参数,这里就是把每一个都参数都在当做grad在计算,我试过如果换成pram.grad LOSS值就不会改变了
                param-=learning_rate*param.grad
        
        model.zero_grad()#每次循环结束了要清零,不然会累加
    
        
    

    我们将把权重正态分布随机化的语句注释掉,跑一下代码,观察网络训练情况:

    在这里插入图片描述
    在这里插入图片描述
    我们可以发现这个模型虽然有一定效果但是损失值依旧很大,我在看视频的时候B站视频链接
    里面的老师很有经验,起初是没有添加这个权值的normal随机正态分布随机化的模型很糟糕,于是他就把权值正态分布随机初始化了,效果好了很多,所以以后我再实践过程当中遇到这样的麻烦也应该这些试试。

    我们添加上这一句:

    在这里插入图片描述

    在这里插入图片描述
    效果得到了显著的提升,很明显这个方法很有效,其实BP网络的目的就是想让权值W朝着向目标值值方向靠拢运动的,一开始的w1不争气,模型也拿它没有办法。
    还有就是loss_fn=nn.MSELoss(reduction='sum')函数
    这里使用了nn里的MSELoss来处理loss损失数值,里面的参数reduction
    reduction = ‘none’,直接返回向量形式的 loss
    reduction = ‘sum’,返回loss之和
    reduction = ''elementwise_mean,返回loss的平均值
    reduction = ''mean,返回loss的平均值
    以后也可能会用到,今天还有别的事,就值了解了一下nn搭建神经网络的方法。

  • 相关阅读:
    tar命令,vi编辑器
    Linux命令、权限
    Color Transfer between Images code实现
    利用Eclipse使用Java OpenCV(Using OpenCV Java with Eclipse)
    Matrix Factorization SVD 矩阵分解
    ZOJ Problem Set
    Machine Learning
    ZOJ Problem Set
    ZOJ Problem Set
    ZOJ Problem Set
  • 原文地址:https://www.cnblogs.com/Eldq/p/12423914.html
Copyright © 2011-2022 走看看