Pytorch系列(三):线性回归

一、制作数据

import torch
import numpy as np
import matplotlib.pyplot as plt

# 制定数据
TRUE_W = 3.0
TRUE_b = 2.0

# 制作训练数据,添加一些噪声进去
NUM_EXAMPLES = 1000
inputs = torch.unsqueeze(torch.rand(NUM_EXAMPLES), dim=1)
print(np.shape(inputs.numpy()))
noise = torch.unsqueeze(torch.rand(NUM_EXAMPLES), dim=1)
outputs = inputs * TRUE_W + TRUE_b + noise
print(np.shape(outputs.numpy()))
plt.scatter(inputs.numpy(), outputs.numpy(), c='b')
plt.show()

在这里插入图片描述

二、模型结构

class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1) # 输入和输出的维度都是1
    def forward(self, x):
        out = self.linear(x)
        return out
Model = LinearModel()
print(Model)
print(Model.parameters())

三、开始训练

def plot(epoch):
    plt.scatter(inputs.numpy(), outputs.numpy(), c='b')
    plt.scatter(inputs.detach().numpy(), Model(inputs).detach().numpy(), c='r')
    plt.title("epoch %2d, loss = %s" %(epoch, str( loss.item())))
    plt.legend()
    plt.draw()
    plt.ion()   # replacing plt.show()
    plt.pause(1)
    plt.close()

lossFunction = torch.nn.MSELoss()
optimizer = torch.optim.SGD(Model.parameters(), lr=1e-2)
num_epochs = 1000

for epoch in range(num_epochs):
    x_input = torch.autograd.Variable(inputs)
    y_gt = torch.autograd.Variable(outputs)
    
    # 前向传播
    y_pre = Model(x_input)
#     print(x_input.detach().numpy(), y_pre.detach().numpy())
    loss = lossFunction(y_pre, y_gt)
    
    # 反向传播
    optimizer.zero_grad() # 每次迭代都需要清0
    loss.backward()
    optimizer.step()
    
    if((epoch + 1) % 40 == 0):
        plot(epoch)
        print('Epoch[{}/{}], loss:{:.6f}'.format(epoch+1, num_epochs, loss.item()))

最终可以拟合出一条直线
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值