用Pytorch已经好久了,但是毕业后这有半年多没搞过,复习一下!
分析一下
线性回归比较简单,例如: y = kx + b
有两个特点:
- 1 是一阶的
- 2 不需要非线性映射
因此可以判断线性回归的输入数据是一维的、线性回归不需要激活函数
那么我们基本可以如下定义一个神经网络了:
class LinearRegressionModel(nn.Module): # 必须继承nn.Module
def __init__(self, input_dim, output_dim): # 参数: 输入维度、输出维度
super(LinearRegressionModel, self).__init__() # 固定写法
self.linear = Linear(input_dim, output_dim) # 一个线性层,给定输入输出维度
def forward(self, x): # 前向传播
out = self.linear(x) #
return out
多简单,给出完整的代码:
import torch
import torch.nn as nn
import numpy as np
from torch.nn import Linear, # Sequential, ReLU
class LinearRegressionModel(nn.Module):
def __init__(self, input_dim, output_dim):
super(LinearRegressionModel, self).__init__()
self.linear = Linear(input_dim, output_dim)
def forward(self, x):
out = self.linear(x)
return out
#####################然后是定义数据
x_values = [i for i in range(11)]
x_train = np.array(x_values, dtype = np.float32)
x_train = x_train.reshape(-1, 1)
y_value = [2*i +1 for i in x_values]
x_train = np.array(y_values, dtype = np.float32)
y_train = y_train.reshape(-1, 1)
##################下面是网络的一些东西,输入输出维度
input_dim = 1
output_dim = 1
model = LinearRegressionModel(input_dim, output_dim)
################## 循环多少次,学习率,优化器是什么,损失函数是什么
epochs = 1000
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)
criterion = nn.MSELoss()
################### 下面是训练的过程
inputs = torch.from_numpy(x_train) # 首先把数据弄成Tensor类型的
labels = torch.from_numpy(y_train)
for epoch in range(epochs):
optimizer.zero_grad() # 优化器的梯度归零,固定写法
outputs = model(inputs) # 模型输入inputs,然后输出outputs
loss = criterion(outputs, labels) # 计算一下loss,outputs、labels在前在后貌似有点区别,感兴趣的去查查?以前我用kares记得是有区别的
loss.backward() # 梯度回传,固定写法
optimizer.step() # 下一步, 固定写法
if epoch % 500 == 0: # 没什么意思了
print('epoch {}, loss {}'.format(epoch, loss.item()) )
#################测试一下
x_2 = torch.from_numpy(np.array(3, dtype=np.float32).reshape(-1, 1))
print(model(x_2).data.numpy()) # 输出了7,证明没问题
################### 保存模型参数,也是相当简单
torch.save(model.state_dict(), 'models/1_linear.pkl')
#这里是设置GPU,不写了,相信问题不大
#gpu1 = torch.device("cuda:0")
#gpu1 = torch.device("cuda:1")
#希望简单的可以参考下面的写法
'''
model.cuda()
inputs.cuda()
labels.cuda()
'''
下面是输出结果: