搭建简易神经网络(~)

参考:《深度学习之Pytorch实战计算机视觉》

 

  • 该模型只考虑一个隐藏层;
  • 定义四个整型变量;
import torch
batch_n=100             #一个批次输入的数量
hidden_layer=100        #隐藏层后保留的数据特征个数
input_data=1000         #每个数据包含的数据特征个数
output_data=10          #输出的数据,值为10,代表,我们最后要10个分类结果值

 

  • 先输入100个具有1000个特征的数据,经过隐藏层后变成100个具有100个特征的数据;
  • 再经过输出层后输出100个具有10个分类结果值的数据;
  • 得到输出结果之后计算损失并进行后向传播,这样一次模型的训练就完成了;
  • 然后循环这个流程就可以完成指定次数的训练,并达到优化模型参数的目的;

 

#下面定义:从输入层到隐藏层、从隐藏层到输出层的权重初始化定义工作,代码如下:

#由于现在没有好的权重参数的初始化方法,所以选择torch.randn来生成指定维度的随机参数作为其初始化参数

x=torch.randn(batch_n,input_data)       #x就是输入层,维度为(100,1000)
y=torch.randn(batch_n,output_data)      #y就是输出层,维度为(100,10)
w1=torch.randn(input_data,hidden_layer) #这是从输入层到隐藏层的权重参数,维度为(1000,100)
w2=torch.randn(hidden_layer,output_data)#这是从隐藏层到输出层的权重参数,维度为(100,10)

#权重参数的维度是怎么定义下来的?其实,只要把整个过程看作矩阵的乘法运算,就容易明白了

#代码中真实值y也是通过随机的方式生成的,所以一开始计算损失值时得到的结果会较大

epoch_n=20              #这是训练次数
learning_rate=1e-6      #这是学习速率
for epoch in range(epoch_n):
    h1=x.mm(w1)            #这是x与w1做矩阵乘法运算的表示;计算后得到隐藏层
    h1=h1.clamp(min=0)     #这是限制h1的大小,让h1中的所有小于0的值都赋0,称为“裁剪”;相当于Relu激活函数;这部分的运算可以见后面演示
    y_pred=h1.mm(w2)       #这是h1与w2做矩阵乘法运算;计算后得到输出层
    
    loss=(y_pred-y).pow(2).sum()   #这里使用了均方误差函数
    print("Epoch:{},Loss:{:.4f}".format(epoch,loss))
    
    #后面的代码就是通过后向传播来实现(这部分代码暂时没有理解)
    grad_y_pred=2*(y_pred-y)
    grad_w2=h1.t().mm(grad_y_pred)
    
    grad_h=grad_y_pred.clone()
    grad_h=grad_h.mm(w2.t())
    grad_h.clamp_(min=0)
    grad_w1=x.t().mm(grad_h)
    
    w1-=learning_rate*grad_w1
    w2-=learning_rate*grad_w2

代码运行结果:

image.png

 

 

附加:

.mm与​.clamp​的演示:

image.png

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值