目录
Exercise 1: Linear Regression
Ng老师的作业使用python即可实现,使用pytorch实现是为了加深对机器学习算法和pytorch使用的理解。
需要用到的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch
import torch.nn as nn
1. Linear模型
class Linear(nn.Module):
def __init__(self):
super(Linear, self).__init__()
self.out = nn.Linear(1, 1)
nn.init.constant_(self.out.weight, 0)
nn.init.constant_(self.out.bias, 0)
def forward(self,x):
out = self.out(x)
return out
因为输入数据的size为97x1,输出数据的size为97x1,故模型为nn.Linear(1, 1)。另外将模型的权重和偏置的值初始化为0。
2. 读取数据
读取数据方法与之前的函数相同详见博客:
https://blog.youkuaiyun.com/linghu8812/article/details/88581896
3.线性回归
模型选择之前定义好的线性模型,model.train()表示模型正在训练
model = Linear()
model.train()
损失函数选择均方差函数。优化方法选择Adam,也可使用SGD优化方法,但要修改学习率,否则不收敛,使用SGD迭代次数较多需要1500次,Adam只需400次。
criterion = torch.nn.MSELoss(reduction='sum')
#optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)
optimizer = torch.optim.Adam(model.parameters(), lr=1e-1)
将数据从numpy直接转换为tensor
X_t = torch.from_numpy(X).type(torch.FloatTensor)
y_t = torch.from_numpy(y).type(torch.FloatTensor)
线性回归训练,迭代400次
train_loss_curve =[]
for epoch in range(400):
y_pred = model(X_t)
loss = criterion(y_pred, y_t) / m / 2
print(epoch, loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss_curve.append(loss)
print(model.out.weight)
print(model.out.bias)
训练过程中损失函数变化曲线,收敛在4.4769,作业中结果的损失函数为4.4833,故经过迭代,使用pytorch模型计算的结果比作业中计算的结果更准确。使用SGD迭代1500次损失函数收敛的结果与作业中相同。
最后输出模型的权重和偏置,结果如下图所示,分别为1.1930和-3.8958。作业中的结果分别为:1.1664和-3.6303,结果比较接近。
线性回归结果可视化:
最后计算一下损失函数结果,
y_pred = model(X_t).detach().numpy()
rst = (y - y_pred).T.dot(y - y_pred) / m / 2
最后rst的结果为4.4769,与损失函数收敛的结果一致。
4.数据测试
对作业中的两个测试点3.5和7.0进行测试,3.5的结果为2802.6,7.0的结果为44556.4。
model.eval()一般在模型预测的时候使用。
model.eval()
test = torch.from_numpy(np.array([[3.5]])).type(torch.FloatTensor)
predicted = model(test).detach().numpy()
print(predicted)
test = torch.from_numpy(np.array([[7.0]])).type(torch.FloatTensor)
predicted = model(test).detach().numpy()
print(predicted)