3.2.线性模型

# 一维线性回归
import numpy as np
import pylab as plt
import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.optim as optim

x_train=np.array([[3.3],[4.4],[5.5],[6.71],[6.93],[4.168],[9.779],
                  [6.182],[7.59],[2.167],[7.042],[10.791],[5.313],
                  [7.997],[3.1]],dtype=np.float32)
y_train=np.array([[1.7],[2.76],[2.09],[3.19],[1.694],[1.573],[3.366],
                  [2.596],[2.53],[1.221],[2.827],[3.465],[1.65],[2.904],
                  [1.3]],dtype=np.float32)
x_train=torch.from_numpy(x_train)#先将numpy.array转化成Tensor
y_train=torch.from_numpy(y_train)
if torch.cuda.is_available():
    x_train=Variable(x_train).cuda()#将数据变成Variable
    y_train=Variable(y_train).cuda()
else:
    x_train=Variable(x_train)
    y_train=Variable(y_train)

#建立模型
class LinearRegression(nn.Module):
    def __init__(self):
        super(LinearRegression,self).__init__()
        self.linear=nn.Linear(1,1)#input and output is 1 dimension
        
    def forward(self,x):
        out=self.linear(x)
        return out

#如果支持GPU加速,可以通过model.cuda()将模型放在GPU上
if torch.cuda.is_available():
    model=LinearRegression().cuda()
else:
    model=LinearRegression()

#定义损失函数和优化函数
criterion=nn.MSELoss()
optimizer=optim.SGD(model.parameters(),lr=1e-3)

#训练
num_epochs=1000
for epoch in range(num_epochs):
    #forward
    out=model(x_train)#前向传播
    loss=criterion(out,y_train)#损失函数
    #backward
    optimizer.zero_grad()#归零梯度
    loss.backward()#反向传播
    optimizer.step()#更新参数

#预测
model.eval()#将模型变成测试模式
predict=model(x_train)#将测试数据放入网络做前向传播
plt.plot(x_train.data.numpy(),y_train.data.numpy(),'ro',label='Original data')
plt.plot(x_train.data.numpy(),predict.data.numpy(),label='Fitting Line')
plt.legend()
plt.show()
一元线性回归
# 多项式回归
#定义好真实的函数
W_target=torch.Tensor([0.5,3,2.4]).unsqueeze(1)#是将原来的tensor大小由3变成(3,1)
b_target=torch.Tensor([0.9])
def f(x):
    """Approximated function."""
    return x.mm(W_target)+b_target[0]#x.mm(W_target)表示做矩阵乘法
#首先需要预处理数据,也就是需要将数据变成一个矩阵的形式
def make_feature(x):
    """Builds features i.e. a matrix with columns [x,x^2,x^3].""" 
    x=x.unsqueeze(1)
    return torch.cat([x**i for i in range(1,4)],1)#使用torch.cat()函数来实现Tensor的拼接
def get_batch(batch_size=32):
    """Builds a batch i.e. (x,f(x)) pair."""
    random=torch.randn(batch_size)
    x=make_feature(random.sort()[0])
    y=f(x)
    if torch.cuda.is_available():
        return Variable(x).cuda(),Variable(y).cuda()
    else:
        return Variable(x),Variable(y)

#定义多项式模型
#Define model
class poly_model(nn.Module):
    def __init__(self):
        super(poly_model,self).__init__()
        self.poly=nn.Linear(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()
optimizer=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[0]
    #reset gradients
    optimizer.zero_grad()
    #Backward pass
    loss.backward()
    #update parameters
    optimizer.step()
    epoch+=1
    if print_loss<1e-3:
        break

batch_x,batch_y=get_batch(10000)
model.eval()
predict=model(batch_x)
plt.plot(batch_x.data.numpy()[:,0],batch_y.data.numpy(),'ro',label='Real Curve')
plt.plot(batch_x.data.numpy()[:,0],predict.data.numpy(),label='Fitting Curve')
plt.legend()
plt.show()
多项式回归
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容