一个典型的神经网络的训练过程如下:
定义具有学习参数(或权重)的神经网络 迭代输入数据集 根据神经网络对输入数据集进行运算 计算损失(输出与真实结果的距离,损失越小说明模型越准确) 将梯度反向传播给神经网络的参数 更新网络的权重(或参数)。通常使用一种简单的更新规则:权重 = 权重 - 学习率 * 梯度 线性回归模型目标:
构造一组输入数据 x 和其对应的标签 y ,让模型学习拟合出 w 和 b。 我们这里要模拟出的线性回归函数:y = 2x + 1 x 给的是从 0 - 10 一共11个数(11行1列的矩阵) 对应的y就是 1 - 21 也是11个数(11行1列的矩阵)
import numpy as np import torch import torch.nn as nn 构造X训练数据 x_values = [i for i in range(11)] x_train = np.array(x_values,dtype=np.float32) x_train = x_train.reshape(-1,1) x_train.shape
(11,1) 构造y训练数据 y_values = [2*i+1 for i in x_values] y_train = np.array(y_values,dtype=np.float32) y_train = y_train.reshape(-1,1) y_train.shape
(11,1) 建立网络模型:1.实现init()用到了哪个层 2.前向传播forward()怎么实现的 线性回归模型:一个不加激活函数的全连接层 class LinearRegressionModel(nn.Module): def __init__(self, input_dim, output_dim): super(LinearRegressionModel, self).__init__() self.linear = nn.Linear(input_dim, output_dim) #全连接层 给定输入/出数据的维度
def forward(self, x): out = self.linear(x)#走全连接层 输入x,得到输出out return out
input_dim = 1 output_dim = 1 model = LinearRegressionModel(input_dim,output_dim) 指定参数和损失函数 epochs = 1000 #迭代1000次 learning_rate = 0.01 #学习率 optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate) #优化器 模型的参数 学习率 criterion = nn.MSELoss() #损失函数 训练模型 for epoch in range(epochs): epoch += 1 #x,y数据转换成tensor格式 inputs = torch.from_numpy(x_train) labels = torch.from_numpy(y_train) #梯度要清零 不然会对上一次迭代的结果进行累加 optimizer.zero_grad() #前向传播 outputs = model(inputs) #计算损失 loss = criterion(outputs,labels) #反向传播 loss.backward() #更新权重参数 optimizer.step() if epoch%50 ==0: print('epoch {}, loss {}'.format(epoch, loss.item()))
测试模型预测结果 predicted = model(torch.from_numpy(x_train).requires_grad_()).data.numpy() predicted
模型的保存与读取 torch.save(model.state_dict(),'linear_regression_model.pkl')
model.load_state_dict(torch.load('linear_regression_model.pkl')) <All keys matched successfully>
数据和模型传入cuda——用GPU训练
class LinearRegressionModel(nn.Module): def __init__(self, input_dim, output_dim): super(LinearRegressionModel, self).__init__() self.linear = nn.Linear(input_dim, output_dim) def forward(self, x): out = self.linear(x) return out
input_dim = 1 output_dim = 1
model = LinearRegressionModel(input_dim, output_dim)
#设置cuda device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") #模型传入cuda model.to(device)
criterion = nn.MSELoss()
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
epochs = 1000 for epoch in range(epochs): epoch += 1 #inputs和labels的数据 传入cuda inputs = torch.from_numpy(x_train).to(device) labels = torch.from_numpy(y_train).to(device)
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if epoch % 50 == 0: print('epoch {}, loss {}'.format(epoch, loss.item()))