首先第一步是产生训练的数据,这里我们采用scikit工具箱来完成。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_regression
import torch
import torch.nn as nn
from torch.autograd import Variable
# n_samples表示样本数量, n_features表示输入参数个数, noise代表噪声, coef选择是否输出系数
# 当n_features = 1 时,可以进行可视化
X, y, coef =make_regression(n_samples=1000, n_features=1,noise=10, coef=True)
plt.scatter(X, y, color='green')
plt.plot(X, X*coef, color='red',linewidth=3)
plt.xticks(())
plt.yticks(())
plt.show()
print(coef)
print(np.shape(X))
print(np.shape(y))
输出结果:
56.506029105169716
(1000, 1)
(1000,)
下一步是建立一个模型
# 首先将数据转换成tensor变量
#上面的make_regression产生的是double型数据, 直接导入到tensor里面会跑不通, 这里把它们转成float32型的变量
X = X.astype('float32')
y = y.astype('float32')
print(np.size(X))
print(np.shape(X))
print(np.shape(y))
# 下面的这一步非常的关键, pytorch里面只支持(n, 1)这种类型的matric,而不支持这种(n,)类似的scaler或vector类型的变量
y = np.reshape(y, (np.size(X),1))
train_x = torch.from_numpy(X)
train_y = torch.from_numpy(y)
# 再定义一个模型,一般用类的形式来产生
# 这里的nn.Module是被继承了,nn.Module里面包含了很多需要的模块
class linear_regression(nn.Module):
"""
linear regression module
"""
def __init__(self):
super(linear_regression, self).__init__()
# Linear函数只有一个输入一个输出
self.linear = nn.Linear(1, 1)
def forward(self, x):
out = self.linear(x)
return out
model = linear_regression()
print(model)
print(train_x.size())
print(train_y.size())
print(type(train_x))
输出结果:
1000
(1000, 1)
(1000, 1)
linear_regression (
(linear): Linear (1 -> 1)
)
torch.Size([1000, 1])
torch.Size([1000, 1])
<class 'torch.FloatTensor'>
接着对模型的未知参数进行求解
# 紧接着需要定义loss和optimize了
# 利用最小二乘来定义损失
learning_rate = 1e-3 # 学习率
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# SGD的第一参数传入的是模型要优化的参数, 第二个表示的是学习率
# 开始训练
num_epoch = 100
for epoch in range(num_epoch):
# 将数据转换成tensor变量,这样可以自动求导
inputs = Variable(train_x)
targets = Variable(train_y)
# 前向 + 后向 + 优化
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(" current loss is %.5f" % loss.data[0])
只要learning_rate选得好,这里基本上一步就能得出正确结果了:
current loss is 94.19785
current loss is 94.19785
current loss is 94.19785
current loss is 94.19785
current loss is 94.19785
再看看预测的结果
# 下面来用数据做预测
# model只支持tensor类型的变量, 所以对model的输入要进行转换, 而画图则要转化成numpy类型
predicts = model(Variable(train_x)).data.numpy()
plt.figure()
plt.plot(X, y, 'go', label=u'original data')
plt.plot(X, coef*X, 'b', label=u'ground truth')
plt.plot(X, predicts, 'r', label=u'predicted data')
plt.legend()
plt.show()
从结果图上来看还是很准的