import torch
import torch.utils.data as Data
import torch.nn as nn
import torch.optim as optim
import numpy as np
'''
nn是neural networks,定义了大量神经网络的层。核心数据结构是Module
'''
#整一个线性模型:y = w1*x1 + w2*x2 + b#1. 生成数据集
num_inputs = 2 #输入参数的数量
num_examples = 1000 #要生成的数据个数
lr = 0.03 #学习率
batch_size = 10 #取的时候一批10个
true_w = [0.6,-0.5] #真实权值
true_b = 2.2
features = torch.tensor(np.random.normal(loc=0,scale=1,size=(num_examples,num_inputs)),dtype=torch.float) #1000行2列,均值0,标准差1
labels = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b#2. 分批次读取数据
dataset = Data.TensorDataset(features,labels)
data_iter = Data.DataLoader(dataset,batch_size,shuffle=True)#迭代器
# for X,y in data_iter:
#print(X,y)#3. 定义模型,方法一
class LinearNet(nn.Module):
def __init__(self, n_feature):
# super(LinearNet,self) 首先找到 LinearNet 的父类,然后把类 LinearNet 的对象转换为父类nn.Module的对象
super(LinearNet, self).__init__() #调用Module的初始化Linear
self.linear = nn.Linear(n_feature, 1) #n_feature个输入,1个输出
def forword(self,x):
y = self.linear(x)
return y
net = LinearNet(num_inputs) #这里的和下面使用Sequential模型不一样,这里只是定义了一层,不是整个网络,所以不能用net[0]
print(net)
for param in net.parameters():#查看课学习的参数,下面可以设置自己想要的
print(param)
'''
#定义模型,方法二,使用Sequential
#写法1
net2 = nn.Sequential(
nn.Linear(num_inputs,1)
#这里还可以传入其它层
)
#写法2
net3 = nn.Sequential()
net3.add_module('linear11',nn.Linear(num_inputs,1))#写法3
from collections import OrderedDict
net4 = nn.Sequential(OrderedDict([
('linear',nn.Linear(num_inputs,1))
#……
]))
print(net2)
print(net3)
print(net4)
print(net4[0])
'''
#4. 初始化模型参数
nn.init.normal_(net.linear.weight,mean=0,std=0.01) #net为一层,赋值为正态分布
nn.init.constant_(net.linear.bias,val=0)#复制为常量
'''
用第二种的比较简单,但第一种可以操控细节
init.normal_(net[0].weight, mean=0, std=0.01)
init.constant_(net[0].bias, val=0) # 也可以直接修改bias的data
'''
for param in net.parameters():
print(param)#5. 定义损失函数,nn模块定义了很多损失函数
loss = nn.MSELoss()#6. 定义优化算法
'''
为不同的自网络设置不同的学习率
optimizer =optim.SGD([
# 如果对某个参数不指定学习率,就使?最外层的默认学习率
{'params': net.subnet1.parameters()}, # lr=0.03
{'params': net.subnet2.parameters(), 'lr': 0.01}
], lr=0.03)实时调整学习率
for param_group in optimizer.param_groups:
param_group['lr'] *= 0.1 # 学习率为之前的0.1倍
'''
optimizer = optim.SGD(net.parameters(),lr=lr)
print(optimizer)#7.训练模型
num_epochs = 3 #迭代轮数
for epoch in range(1, num_epochs+1):
for X,y in data_iter: #X是输入,y是真实值,output是预测值
output = net.forword(X) #使用第二种模型实现方法,只需要net[0](X)
l = loss(output, y.view(-1,1)) #把y变成和output一样的维度
optimizer.zero_grad() #梯度清零 等于net.zero_grad()
l.backward() #自动梯度下降(用了这个之后,每个变量就可以得到梯度x.grad)
optimizer.step() #优化
print('epoch %d, loss: %f' % (epoch, l.item()))#检测模型
print(net.linear.weight)
print(net.linear.bias)
print("error ",end="")
print(torch.tensor(true_w) - net.linear.weight)
print("error ",end="")
print(torch.tensor(true_b)-net.linear.bias)
【pytorch|学习使用pytorch构建线性回归模型】
推荐阅读
- 深度学习|mmsegmentation 报错
- 计算机视觉|将voc数据集xml格式、labelme标注转为coco数据集json格式
- python|数据分析【机器学习】-KNN分类模型
- 神经网络|基于语音的疲劳度检测算法研究
- 字符串|Babel是如何读懂JS代码的
- Python 函数进阶-lambda匿名函数和三元运算符
- Python教程(生成器是什么----一篇文章让你看懂)
- 平时碰见的问题|Python3.8 tornado报错NotImplementedError(转载)
- java|大学想要学习JAVA,发展前景如何,该从哪里开始()