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搭建神经网络的方法。

  • 相关阅读:
    LeetCode 501. 二叉搜索树中的众数
    LeetCode 404.左叶子之和
    LeetCode 450. 删除二叉搜索树中的节点
    LeetCode 437. 路径总和 III
    LeetCode 429. N 叉树的层序遍历
    LeetCode 213. 打家劫舍 II
    LeetCode 337. 打家劫舍 III
    LeetCode 198. 打家劫舍
    LeetCode 235. 二叉搜索树的最近公共祖先
    LeetCode 230. 二叉搜索树中第K小的元素
  • 原文地址:https://www.cnblogs.com/Eldq/p/12423914.html
Copyright © 2011-2022 走看看