- ✨本文收录于【深度学习】:《PyTorch入门到项目实战》专栏,此专栏主要记录如何使用
PyTorch
实现深度学习笔记,尽量坚持每周持续更新,欢迎大家订阅! - 🌸个人主页:JoJo的数据分析历险记
- 📝个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
- 💌如果文章对你有帮助,欢迎✌
关注
、👍点赞
、✌收藏
、👍订阅
专栏
参考资料:本专栏主要以沐神《动手学深度学习》为学习资料,记录自己的学习笔记,能力有限,如有错误,欢迎大家指正。同时沐神上传了的教学视频和教材,大家可以前往学习。
在上一节我们学习了如何使用pytorch从零实现一个线性回归模型。包括生成数据集,构建损失函数,==梯度下降==优化求解参数等。和很多其他机器学习框架一样,pytorch中也包含了许多可以自动实现机器学习的包。本章介绍一些如何使用nn
简便的实现一个线性回归模型
🌺1.生成数据集
import numpy as np
import torch
from torch.utils import data
接下来我们定义真实的w和b,以及生成模拟数据集,这一步和之前讲的一样
def synthetic_data(w, b, num_examples):
X = torch.normal(0, 1, (num_examples, len(w)))
y = torch.matmul(X, w) + b
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))
true_w = torch.tensor([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
🌻2.读取数据集
下面有一点不同的是我们通过data.TensorDataset
把数据放在Tensor结构中,如何通过batch_size
来设置每次抽取几个样本
def load_array(data_arrays,batch_size,is_train=True):
# TensorDataset:将数据对应成Tensor列表
data_set = data.TensorDataset(*data_arrays)
return data.DataLoader(data_set,batch_size,shuffle=is_train)#将数据加载读取出来,batch_size定义个数
batch_size = 10
data_iter = load_array((features,labels),batch_size)
next(iter(data_iter))
[tensor([[-0.0384, 1.1566],
[-0.9023, -0.6922],
[-0.0652, 1.1757],
[-0.8569, -1.0172],
[ 1.3489, -0.6855],
[ 0.1463, 0.1577],
[ 0.1615, -2.1549],
[-0.0533, -0.3301],
[-0.9913, 0.2226],
[ 0.1432, -0.9537]]),
tensor([[ 0.1836],
[ 4.7540],
[ 0.0802],
[ 5.9541],
[ 9.2256],
[ 3.9620],
[11.8700],
[ 5.2242],
[ 1.4718],
[ 7.7181]])]
🌼3.线性模型搭建
这里我们通过nn
搭建一个线性的神经网络
from torch import nn
这里我们使用Sequential
类来接收线性层,这里我们只有一个线性神经网络层,其实可以不设置,但是在后续我们介绍的其他算法中,往往都是多层的,因此我们可以把这个当做一个标准化流程。
它的作用是将不同层串在一起,首先将数据传入到第一层,然后将第一层的输出传入到第二层作为输入,以此类推
net = nn.Sequential(nn.Linear(2,1))#第一个参数表示输入特征的纬度,第二个参数表示输出层的纬度
🌷4.初始化参数
在定义net之后,我们需要做的就是定义我们要估计的参数。还是和之前类似,这里我们也需要定义两个参数一个是weight
相当于之前的w
,一个是bias
相当于之前的b
net[0].weight.data.normal_(0, 0.01)#第一层的weight初始化
net[0].bias.data.fill_(0)#第一层的bias初始化
tensor([0.])
🌱5. 定义损失函数
这里我们使用均方误差MSE
来作为我们的损失函数
loss = nn.MSELoss()
🌲6. 选择优化方法
这里我们使用随机梯度下降进行优化。从而得到我们的参数.需要传入两个参数,一个是==待估计参数==,另一个是==学习率==。我在这里设置为0.03
trainer = torch.optim.SGD(net.parameters(), lr=0.03)
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)
trainer.zero_grad()
l.backward()
trainer.step()#更新参数
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
epoch 1, loss 0.000102
epoch 2, loss 0.000103
epoch 3, loss 0.000104
🌴7.完整代码
# 导入相关库
import numpy as np
import torch
from torch.utils import data
from torch import nn
'''
定义模拟数据集函数
'''
def synthetic_data(w, b, num_examples):
X = torch.normal(0, 1, (num_examples, len(w)))#生成标准正态分布
y = torch.matmul(X, w) + b#计算y
y += torch.normal(0, 0.01, y.shape)
return X, y.reshape((-1, 1))
'''
生成数据集
'''
true_w = torch.tensor([2, -3.4])#定义w
true_b = 4.2#定义b
features, labels = synthetic_data(true_w, true_b, 1000)#生成模拟数据集
'''
加载数据集
'''
def load_array(data_arrays,batch_size,is_train=True):
# TensorDataset:将数据对应成Tensor列表
data_set = data.TensorDataset(*data_arrays)
return data.DataLoader(data_set,batch_size,shuffle=is_train)#将数据加载读取出来,batch_size定义个数
batch_size = 10
data_iter = load_array((features,labels),batch_size)
'''
创建线性神经网络
'''
net = nn.Sequential(nn.Linear(2,1))#第一个参数表示输入特征的纬度,第二个参数表示输出层的纬度
net[0].weight.data.normal_(0, 0.01)#第一层的weight初始化
net[0].bias.data.fill_(0)#第一层的bias初始化
'''
定义损失函数MSE
'''
loss = nn.MSELoss()
'''
创建SGD优化方法
'''
trainer = torch.optim.SGD(net.parameters(), lr=0.03)#创建SGD优化训练器
'''
正式训练
'''
num_epochs = 3#迭代次数
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)#计算损失函数
trainer.zero_grad()
l.backward()
trainer.step()#更新参数
l = loss(net(features), labels)#计算最终的loss
print(f'epoch {epoch + 1}, loss {l:f}')
epoch 1, loss 0.000240
epoch 2, loss 0.000099
epoch 3, loss 0.000100
✨推荐阅读
本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!