使用Pytorch实现简单的线性回归

import torch

import numpy as np


#生成数据
num_inputs=2
num_examples = 1000
true_w = [2,-3.4]
true_b = 4.2
features = torch.tensor(np.random.normal(0,1,(num_examples,num_inputs)),dtype=torch.float)

#labels=X*w+b

labels = true_w[0]*features[:,0] + true_w[1]*features[:,1] + true_b
labels += torch.tensor(np.random.normal(0,0.01,size=labels.size()),dtype=torch.float)

#读取数据
import torch.utils.data as Data

batch_size = 10

#将训练数据的特征和标签组合,将数据特征和 数据标签合并成一行如:x1,x2,x3,y
dataset = Data.TensorDataset(features,labels)

#随机读取小批量数据
data_iter = Data.DataLoader(dataset,batch_size,shuffle=True)

for X,y in data_iter:
    # print(X,y)
    break

import torch.nn as nn

class LinearNet(nn.Module):
    def __init__(self,n_feature):
        super(LinearNet,self).__init__()
        self.linear = nn.Linear(n_feature,1)

    #forward 定义前向传播
    def forward(self, x):
        y = self.linear(x)
        return y

net = LinearNet(num_inputs)
print(net)

#如果可以使用多个网络形成多个层可以使用Sequential 把单个的网络按照一定的顺序插入到Sequential序列中进行
#使用nn.Sequential来组合网络层,Sequential是一个有序的容器,网络层按照转入的顺序加入到计算图中
#写法1
net = nn.Sequential(
    nn.Linear(num_inputs,1)
    #其他层
)
#写法二
net = nn.Sequential()
net.add_module('linear',nn.Linear(num_inputs,1))
#net.add_module...
#写法三
from collections import OrderedDict
net = nn.Sequential(OrderedDict([('linear',nn.Linear(num_inputs,1))
                                 #......
                                 ]))
print(net)
print(net[0])

#获取训练模型的可学习的参数
#通过net.parameters()查看模型所有可学习的参数,返回一个生成器
for param in net.parameters():
    print(param)

#初始化模型参数

from torch.nn import init
init.normal_(net[0].weight,mean=0,std=0.01)
init.constant_(net[0].bias,val=0) #也可以直接的修改bias的data:net[0].bias.data.dill_(0)

#使用modal中提供的损失函数
#定义损失函数
loss=nn.MSELoss()

#进行优化训练
#实现一个学习率为0.03的小批量随机梯度下降SGD
import torch.optim as optim
optimizer = optim.SGD(net.parameters(),lr=0.03)
print(optimizer)

#为不同的子网络设置不同的学习率
# optimizer = optim.SGD([
#     #如果对某个参数不指定学习率,就使用最外层的默认学习率
#     {'params':net.subnet1.parameters()},
#     {'params':net.subnet2.parameters(),'lr':0.01}
#     ],lr=0.03)

#调整学习率
for param_group in optimizer.param_groups:
    param_group['lr']*=0.1

#训练模型
num_epochs = 3
for epoch in range(1,num_epochs+1):
    for X,y in data_iter:
        output = net(X)
        l = loss(output,y.view(-1,1))
        optimizer.zero_grad()   # 梯度清零,等价于net.zero_grad()
        l.backward()
        optimizer.step()
    print('epoch %d,loss:%f'%(epoch,l.item()))

dense = net[0]
print(true_w,dense.weight)
print(true_b,dense.bias)
发布了125 篇原创文章 · 获赞 63 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/u011573853/article/details/103821798