- 准备数据集合
- 准备模型(猜测模型的结构,超参数,人工或者自动的办法(auto machine learning)),模型参数待定
- 将数据分成训练集合和测试集合,设计损失函数(误差)
- 训练数据(包括输入和正确结果),正向传播训练数据的输入,得到猜测的值,猜测值和正确结果比较得到损失函数(误差,是自己定义的,很关键)
- 反向传播误差,分配误差(假设是参数导致的)
- 利用分配到的误差,去调整参数(利用梯度和分配到的误差去求)
- 调整后的参数再去训练(第二轮)
- 当总的误差小于阈值的时候停止
- 验证: 用新的真实数据去验证一下,你的模型好用不,不好用(泛化能力差)
import torch #pytorch
# import tensorflow as tf
import torch.nn as nn
import torch.nn.functional as F
import torch.onnx
import netron
import matplotlib.pyplot as plt
from torch.autograd import Variable
随机产生一些数据
x = torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
y = x.pow(2) + 0.2*torch.rand(x.size()) ##[]表示的是维度数据
x,y = Variable(x),Variable(y)
#神经网络只能输入Variable类型的数据
#下面这两行代码可以看到神经网络生成的图长什么样子
plt.scatter(x.data.numpy(),y.data.numpy())
plt.show()
构造神经网络
class Net(torch.nn.Module):
def __init__(self,n_features,n_hidden,n_output): #构造函数
#构造函数里面的三个参数分别为,输入,中间隐藏层处理,以及输出层
super(Net,self).__init__() #官方步骤
self.hidden=torch.nn.Linear(n_features,n_hidden)
self.predit=torch.nn.Linear(n_hidden,n_output)
def forward(self,x): #搭建的第一个浅层神经网络 向前传递
x = F.relu(self.hidden(x))
x = self.predit(x) #此行可预测也可以不预测
return x
初始化神经网络
net = Net(1,10,1)
print(net) #此行用于观看到是否网络搭建成功,产生效果
# 输出,可视化
d = torch.rand(1,10,1)
m = net
o = m(d)
onnx_path = "onnx_model_first.onnx"
torch.onnx.export(m, d, onnx_path)
输出:
Net( (hidden): Linear(in_features=1, out_features=10, bias=True) (predit): Linear(in_features=10, out_features=1, bias=True) )
降维是减少维度,随机梯度是减少样本(随机地找部分样本做梯度查找最小值)
反向传播
要和真实的标签(z)相比较,计算预测结果和真实标签的误差(范数,距离等等)
反向传播的目的是求参数梯度,也就是参数小的变动时,函数值的变化速度
修改参数(权重)
误差E有了,怎么调整参数让误差不断减小? E是参数的函数,何如找到使得函数值最小的w