使用pytorch设计一个简单的线性模型,在此之前,需要小伙伴们学习或了解损失函数、梯度下降算法、正向传播、反向传播等神经网络基本的概念和原理
使用pytorch设计神经网络有四个步骤:1.准备数据集 2.设计神经网络 3.构建损失函数和优化器 4.编写训练周期
1.准备数据集
我们使用一组简单的数据即可,定义线性模型需要的数据集
x_data = torch.Tensor([[1.0],[2.0],[3.0]]) #3*1的矩阵 y_data = torch.Tensor([[2.0],[4.0],[6.0]]) #3*1的矩阵
2.设计神经网络
在pytorch中,每一个神经网络都是一个类,而定义该类时,必须继承torch.nn.Module,在这儿我们定义一个LinearModel的线性模型类,且必须至少定义两个函数,构造函数__init__()和正向传播函数forward()
# 所有的模型都以类的形式定义,且必须继承torch.nn.Module class LinearModel(torch.nn.Module): # 每个模型必须至少定义两个函数 构造函数init 和 正向传播函数forward def __init__(self): super(LinearModel, self).__init__() # 定义 一个线性模型对象linear 类nn.Linear包含两个成员tensor,权重weight、偏移量bias ''' torch.nn.Linear(in_features,out_features,bias=True) in_features 和 out_features是输入和输出的维度 bias=True要不要设置偏移量 ''' self.linear = torch.nn.Linear(1, 1) def forward(self, x): y_pred = self.linear(x) return y_pred
3.构造损失函数和优化器
先定义一个线性模型LinearModel的类对象model
model = LinearModel() #构造损失函数 只需要y_pred和y就能算出损失总和或者损失平均值 criterion = torch.nn.MSELoss(size_average=False) #构造优化器 有众多的优化器 优化器就是对权重进行更新的一个工具 #class torch.optim.Adagrad、Adam、Adamax、ASGD、LBFGS、RMSprop、Rprop、SGD optimizer = torch.optim.SGD(model.parameters(),lr=0.01) #优化器对象 model.parameters()模型的权重、 lr是学习率
4.编写训练过程
#训练过程:前馈、反馈、更新 # 四个步骤:1.算y_hat 2.根据y_hat和y计算损失(正向传播) 3.梯度的所有权重归零后反向传播 4.更新梯度的所有权重 for epoch in range(100): y_pred = model(x_data) loss = criterion(y_pred,y_data) #计算损失的过程就是构建计算图的过程 print(epoch,loss) #打印loss时,会自动调用loss的__str__()函数 optimizer.zero_grad() #让所有梯度的所有权重都归零后才能进行反向传播,即让上一次反向传播生成的梯度都归零 loss.backward() #反向传播 计算梯度 optimizer.step() #更新梯度 如 w = w - lr*损失对w的偏导数
5.打印权重weight和偏移量bias以及测试模型
#打印weight和bias print('w=',model.linear.weight.item()) # .item()获取权重的值 否则就是一个weight的矩阵 print('b=',model.linear.bias.item()) # #测试模型 x_test = torch.Tensor([[4.0],[10.0]]) #这是一个2*1的矩阵 y_test = model(x_test) print('y_pred = ',y_test.data) #根据线性模型输入是2*1的矩阵,那么得到的也是2*1的矩阵