一.包的引入:
import torch
batch_n = 100 #每次迭代个数
input_data = 1000 #输入特征数
hidden_layer = 100 #第一个隐层之后的特征数
output_data = 10 #输出的变量个数
1.Batch_n表示每个批次输入的数据量
2.Hidden_layer 表示第一个一层的隐层结束后剩余的特征数
3.Input_data 表示输入数据对应的特征数
4.Output_data 表示最终输出的分类值
二.完成从输入层到隐藏层、从隐藏层到输出层的权重初始化 定义工作:
具体网络是:1000-100-10
x = torch.randn(batch_n,input_data)
y = torch.randn(batch_n,output_data)
w1 = torch.randn(input_data,hidden_layer)
w2 = torch.randn(hidden_layer,output_data)
三.明确训练的总次数和学习速率:
epoch_n = 20 #训练总次数
learning_rate = 1e-6 #学习率
四.开始训练
#开始训练
for epoch in range(epoch_n):
h1 = x.mm(w1) # 输出100*100
h1 = h1.clamp(min = 0) #clamp(min = 0)当得出的值小于0的时候将其设置为0
y_pred = h1.mm(w2) #输出100*10
loss = (y_pred - y).pow(2).sum() #去预测值和准确值的平方和
print("Epoch:{},loss:{:.4f}".format(epoch,loss)) #输出迭代此时和损失值
grad_y_pred = 2*(y_pred-y) #y预测值的梯度
grad_w2 = h1.t().mm(grad_y_pred) #w2的梯度
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
这样就完成了一个网络的搭建了。
完整代码:
import torch
#载入必要参数
batch_n = 100 #每次迭代个数
input_data = 1000 #输入特征数
hidden_layer = 100 #第一个隐层之后的特征数
output_data = 10 #输出的变量个数
#具体网络是:1000-100-10
x = torch.randn(batch_n,input_data)
y = torch.randn(batch_n,output_data)
w1 = torch.randn(input_data,hidden_layer)
w2 = torch.randn(hidden_layer,output_data)
#参数设置
epoch_n = 20 #训练总次数
learning_rate = 1e-6 #学习率
#开始训练
for epoch in range(epoch_n):
h1 = x.mm(w1) # 输出100*100
h1 = h1.clamp(min = 0) #clamp(min = 0)当得出的值小于0的时候将其设置为0
y_pred = h1.mm(w2) #输出100*10
loss = (y_pred - y).pow(2).sum() #去预测值和准确值的平方和
print("Epoch:{},loss:{:.4f}".format(epoch,loss)) #输出迭代此时和损失值
grad_y_pred = 2*(y_pred-y) #y预测值的梯度
grad_w2 = h1.t().mm(grad_y_pred) #w2的梯度
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