本站原创文章,转载请说明来自《老饼讲解-深度学习》www.bbbdata.com
本节展示如何在pytorch中构建一个神经网络模型
pytorch的模型构建
在pytorch中构建一个模型的形式如下:
from torch import nn
import torch
from torch.nn import functional as F
# ------构建神经网络模型----------------
class BPModle(nn.Module):
def __init__(self):
super().__init__()
self.L1= nn.Linear(1, 5)
self.L2= nn.Linear(5, 1)
def forward(self, x):
y = self.L2(F.tanh(self.L1(x)))
return y
#---------模型的使用-----------
model = BPModle() # 实例化模型
x = torch.tensor([0.1]) # 需要预测的x
y = model(x) # 用模型进行预测
print(y) # 打印预测结果:0.5107
模型构建的整体代码解说
BPModle是我们定义的模型类名,它必须继承pytorch的nn.Module类
然后需要实现__init__和forward两个方法,它们的意义如下
1. __init__方法是模型的初始化部分,它代表模型初始化时执行的逻辑
2. forward方法是模型的前馈部分,它代表模型的计算逻辑,即传入x给模型时,模型是如何计算得到输出的
代码中__init__部分的代码解说
在__init__里一般先初始化forward中所需要用到的模块,这里我们初始化了两个线性层模块L1和L2,
nn.Linear是pytorch提供的全连接线性层模块,类似的还有卷积层、池化层等等常用的运算模型
代码中forward部分的代码解说
在 forward里我们定义模型的计算方式为self.L2(F.tanh(self.L1(x))),
也即传入一个x=0.1后,模型先经过L1的计算以及tanh函数的激活,再经过L2模块的运算,就得到模型的输出结果0.5107
pytorch中关于前馈模型的构建
由于在深度学习中,模型往往都是层层前馈的方式进行计算
所以,pytorch还提供了Sequential函数,方便我们将顺序前馈计算的模块组装在一起
具体示例如下
from torch import nn
# ------构建神经网络模型----------------
class BPModle(nn.Module):
def __init__(self):
super().__init__()
self.nn = nn.Sequential(
nn.Linear(1, 5),
nn.Tanh(),
nn.Linear(5, 1)
)
def forward(self, x):
y = self.nn(x)
return y
在这里我们在__init__中只定义了一个nn模块,它把nn.Linear(1, 5)、nn.Tanh()、nn.Linear(5, 1) 组装在一起,
在forward中调用self.nn模块时,self.nn就会顺序调用nn.Linear(1, 5)、nn.Tanh()、nn.Linear(5, 1) 三个模块进行计算
本节我们讲解如何查看pytorch中模型的参数,以及如何为模型定义一个模型参数
pytorch模型的参数
要查看模型的参数,可以在模型初始化后,通过state_dict函数来查看模型的参数,
具体示例如下:
from torch import nn
from torch.nn import functional as F
# ------构建神经网络模型----------------
class BPModle(nn.Module):
def __init__(self):
super().__init__()
self.L1= nn.Linear(1, 5)
self.L2= nn.Linear(5, 1)
def forward(self, x):
y = self.L2(F.tanh(self.L1(x)))
return y
model = BPModle()
print(model.state_dict())
运行结果如下:
可以看到,模型中共包含了四个参数,L1的权重与阈值、L2的权重与阈值
在代码里我们没有看模型参数的定义,这是因为nn.Linear已经为我们定义好了weight和bias作为参数
而我们在BPModle里使用nn.Linear时,BPModle就会自动把nn.Linear的参数收集和管理起来
所以最终BPModle就包含了L1和L2的四个参数:L1.weight、L1.bias、L2.weight、L2.bias
pytorch如何定义一个模型的参数
如何我们要在pytorch的模型里定义一个模型的参数,则需要将变量定义为Parameter对象
只有Parameter对象才会被模型作为模型参数收集与管理起来
具体示例如下:
from torch import nn
import torch
from torch.nn import functional as F
# ------构建神经网络模型----------------
class BPModle(nn.Module):
def __init__(self):
super().__init__()
self.L1= nn.Linear(1, 5)
self.L2= nn.Linear(5, 1)
self.w = nn.Parameter(torch.randn(1,1)) # 定义模型参数w
def forward(self, x):
y = self.L2(F.tanh(self.L1(x)))* self.w
return y
model = BPModle()
print(model.state_dict())
运行结果如下:
从运行结果中可以看到模型里已经添加了我们定义的模型参数w
End