PyTorch学习——Andrew Ng machine-learning-ex1 Linear Regression实现

目录

Exercise 1: Linear Regression

1. Linear模型

2. 读取数据

3.线性回归

4.数据测试


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.csdn.net/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)
发布了20 篇原创文章 · 获赞 6 · 访问量 2182

猜你喜欢

转载自blog.csdn.net/linghu8812/article/details/89708118