pytorch应用(入门3) 多项式回归

目录

  • 多项式回归
  • 代码如下
  • 补充
    • x.mm()
    • 三次多项式Python程序

多项式回归

给出要求
pytorch应用(入门3) 多项式回归_第1张图片
在PyTorch里面使用torch.cat() 函数来实现Tensor的拼接:

代码如下

import torch
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import torch.nn as nn
from torch.autograd import Variable # torch 中 Variable 模块
def make_features(x):
    x = x.unsqueeze(1)
    return torch.cat([x ** i for i in range(1,4)],1) # 矩阵拼接一下,相当于输入的n个数据
"""Builds features i.e. a matrix with columns [x, x^2, x^3]"""


# 定义真实函数
W_target = torch.FloatTensor([0.5, 3, 2.4]).unsqueeze(1)
b_target = torch.FloatTensor([0.9])
def f(x) :
    """Approximated function."""
    return x.mm(W_target)+b_target[0]
"""
这里的权重已经定义好了,unsqueeze(1)是将原来的tensor 大小由3变成(3, 1),
x.mm (w_ target) 表示做矩阵乘法,f(x) 就是每次输人- -个x得到-个y的真实函数。

"""

在进行训练的时候我们需要采样一些点,可以随机生成一些数来得到每次的训练集:

# 在进行训练的时候我们需要采样一些点,可以随机生成一些数来得到每次的训练集:
def get_batch(batch_size=32):
    #""Builds a batch i.e. (x, f(x)) pair. ”””
    random = torch.randn(batch_size)
    x = make_features(random)
    y = f(x)
    if torch.cuda.is_available():
        return Variable(x).cuda(), Variable(y).cuda()
    else:
        return Variable(x),Variable(y)

通过上面这个函数我们每次取batch_size 这么多个数据点,然后将其转换成矩阵的形式,再把这个值通过函数之后的结果也返回作为真实的目标。

# Define model 定义多项式模型
class poly_model(nn.Module) :
    def __init__(self):
        super(poly_model, self).__init__()
        self.poly = nn.Linear(3, 1) # 模型的输入是3维,输出是1维
    def forward(self,x) :
        out = self.poly(x)
        return out
if torch.cuda.is_available():
    model = poly_model().cuda()
else:
    model = poly_model()

#定义损失函数和优化器
#这里使用梯度下降
criterion = nn.MSELoss() #在这里定义的损失函数,然后可以把criterion当作函数来使用,相当于C++的函数指针 了
optimizer = torch.optim.SGD(model.parameters(),lr=1e-3) # 与上句同理
#和上一篇博文一样
# 开始训练模型
epoch = 0
while True:
    # Get data
    batch_x,batch_y = get_batch()
    # Forward pass
    output = model(batch_x)
    loss = criterion(output, batch_y)
    print_loss = loss.data
    # Reset gradients
    optimizer.zero_grad()
    # Backward pass
    loss.backward()
    # update parameters
    optimizer.step()
    epoch += 1
    if print_loss < 1e-3:
        break

W_target
#这就是拟合出的曲线的权重,据此可以写出拟合的曲线方程
tensor([[0.5000],
        [3.0000],
        [2.4000]])
b_target
tensor([0.9000])

pytorch应用(入门3) 多项式回归_第2张图片

但是我画不出来,头秃………………………………

下面是作者的代码:
pytorch应用(入门3) 多项式回归_第3张图片
pytorch应用(入门3) 多项式回归_第4张图片
pytorch应用(入门3) 多项式回归_第5张图片

pytorch应用(入门3) 多项式回归_第6张图片
pytorch应用(入门3) 多项式回归_第7张图片

pytorch应用(入门3) 多项式回归_第8张图片
pytorch应用(入门3) 多项式回归_第9张图片

pytorch应用(入门3) 多项式回归_第10张图片
pytorch应用(入门3) 多项式回归_第11张图片
pytorch应用(入门3) 多项式回归_第12张图片

pytorch应用(入门3) 多项式回归_第13张图片
pytorch应用(入门3) 多项式回归_第14张图片

补充

x.mm()

点这里

三次多项式Python程序

点这里

2

成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘

你可能感兴趣的:(深度学习笔记,pytorch,回归,python)