Pytorch 初次使用nn包

计算图和autograd是十分强大的工具,可以定义复杂的操作并自动求导;然而对于大规模的网络,autograd太过于底层。

在构建神经网络时,我们经常考虑将计算安排成,其中一些具有可学习的参数,它们将在学习过程中进行优化。

TensorFlow里,有类似KerasTensorFlow-SlimTFLearn这种封装了底层计算图的高度抽象的接口,这使得构建网络十分方便。

在PyTorch中,包nn完成了同样的功能。nn包中定义一组大致等价于层的模块。一个模块接受输入的tesnor,计算输出的tensor,而且还保存了一些内部状态比如需要学习的tensor的参数等。nn包中也定义了一组损失函数(loss functions),用来训练神经网络。同时nn包中不光有一些激活函数和层操作外,还包含常见的损失函数。

代码如下:

import torch

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

N, D_in, H, D_out = 64, 1000, 100, 10

#随机生成输入和输出

x = torch.randn(N, D_in, device=device)
y = torch.randn(N, D_out, device=device)


# 使用nn包将我们的模型定义为一系列的层。
# nn.Sequential是包含其他模块的模块,并按顺序应用这些模块来产生其输出。
# 每个线性模块使用线性函数从输入计算输出,并保存其内部的权重和偏差张量。
# 在构造模型之后,我们使用.to()方法将其移动到所需的设备。


model = torch.nn.Sequential(
torch.nn.Linear(D_in,H),
torch.nn.ReLU(),
torch.nn.Linear(H, D_out),
).to(device)


'''
nn包中还有常用的损失函数的定义
MSELoss()中参数reducetion 初始为'mean',为均值,我们使用的是'sum'为和
但是在实践中,通过设置reduction='elementwise_mean'来使用均方误差作为损失更为常见
'''
loss_fn = torch.nn.MSELoss(reduction='elementwise_mean')

learning_rate = 1e-4

for t in range(500):

'''
该操作为前向传播,通过向模型中传入x,进而得到输出y
同时该模块有__call__属性可以像调用函数一样调用他们
这样我们输入张量x,得到了输出张量y_pred
'''
y_pred = model(x)
loss = loss_fn(y_pred,y)
print(t,loss.item())

#运算之前清除梯度
model.zero_grad()

'''
反向传播:计算模型的损失值对模型中可训练参数的梯度
每个参数是否可训练取决于require_grad的布尔值
所以此操作可以计算所有可训练参数的梯度
'''
loss.backward()

#使用梯度下降进行更新
#利用for循环取出model中的parameters()
#在对param.data进行操作
with torch.no_grad():
for param in model.parameters():
param.data -= learning_rate * param.grad

猜你喜欢

转载自www.cnblogs.com/sjq12138/p/12331891.html