欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pytorch入门>简单的线性回归2

程序员文章站 2022-06-11 23:45:01
...

看李沐老师课程实现的一个简单的线性回归,在之前的基础上主要开始利用官方的库创建数据库和搭建模型。

线性回归+MSELoss+SGD优化。

#!/usr/bin/env python
# coding: utf-8

# In[3]:


import torch
import numpy as np
from torch.utils import data
import matplotlib.pyplot as plt


# In[4]:


def generate_data(w,b,num):
    x = torch.normal(0,1, (num,len(w)))
    y = torch.matmul(x,w)+b
    y+=torch.normal(0,0.01,y.shape)
    return x,y.reshape((-1,1))


# In[5]:


true_w = torch.tensor([2.,-3.])
true_b = 0.2
feature, label =generate_data(true_w,true_b,200)


# In[6]:


def load_array(data_arrays,batch_size,is_train=True):#pytorch数据迭代器
    dataset = data.TensorDataset(*data_arrays)
    return data.DataLoader(dataset,batch_size,shuffle=is_train)


# In[7]:


batch_size = 10
data_iter = load_array((feature,label),batch_size)

next(iter(data_iter)) #python中的iter


# In[8]:


#模型的定义
from torch import nn
net = nn.Sequential(nn.Linear(2,1))


# In[9]:


#自定义模型初始化参数
print(net[0].weight)
print(net[0].weight.data.normal_(0,0.01))#normal为正太分布
print(net[0].bias)


# In[10]:


loss =nn.MSELoss()
trainer = torch.optim.SGD(net.parameters(),lr = 0.03)#SGD至少需要传入2个参数:模型的参数和学习率


# In[14]:


num_epoch =3
for epoch in range(num_epoch):
    for x,y in data_iter:
        l =loss(net(x),y)
        trainer.zero_grad()
        l.backward()
        trainer.step()
        
    l = loss(net(feature),label)
    print(f'epoch {epoch+1},loss{l:f}')
          


# In[ ]: