参考:《深度学习之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
代码运行结果:
附加:
.mm
与.clamp
的演示: