在 Paddle 中,模型搭建的核心是组合各种 Layer(层)来构建神经网络。Paddle 提供了丰富的内置 Layer,同时也支持自定义 Layer 的实现。本节将介绍如何使用 Paddle 内置的 Layer 搭建模型。
paddle.nn.Layer是 PaddlePaddle 中用于构建神经网络模型的基础类,它对标于pytorch中的torch.nn.Module
【常见的Layer层】
Paddle 提供了大量的内置 Layer,涵盖了深度学习中的常见操作,例如:
线性层: paddle.nn.Linear
卷积层: paddle.nn.Conv2D, paddle.nn.Conv3D
池化层: paddle.nn.MaxPool2D, paddle.nn.AvgPool2D
激活函数层: paddle.nn.ReLU, paddle.nn.Sigmoid, paddle.nn.Tanh
归一化层: paddle.nn.BatchNorm2D, paddle.nn.LayerNorm
循环神经网络层: paddle.nn.LSTM, paddle.nn.GRU
Dropout 层: paddle.nn.Dropout
【paddle.nn.Sequential】
对于简单的模型,可以使用 paddle.nn.Sequential 将多个 Layer 按顺序组合起来
# 定义一个简单的全连接神经网络
import paddle
model = paddle.nn.Sequential(
paddle.nn.Linear(784, 512), # 输入层到隐藏层
paddle.nn.ReLU(), # 激活函数ReLU
paddle.nn.Linear(512, 10) # 隐藏层到输出层
)
print(model)
【自定义模型】
如果内置的 Layer 无法满足需求,可以自定义 Layer。
尤其是大型的复杂模型,基本都要使用自定义模型来实现
自定义 Layer 也需要继承 paddle.nn.Layer 类,并实现 __init__ 和 forward 方法
import paddle
class MyModel(paddle.nn.Layer):
def __init__(self, input_dim=784, hidden_dim=512, output_dim=10):
super(MyModel, self).__init__()
# 定义第一层线性层
self.layer1 = paddle.nn.Linear(input_dim, hidden_dim)
# 使用ReLU激活函数
self.relu1 = paddle.nn.ReLU()
# 定义第二层线性层
self.layer2 = paddle.nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = self.layer1(x)
x = self.relu1(x)
x = self.layer2(x)
return x
model = MyModel()
print(model)
魔法方法__init__通常用来定义一些模型中用到的各层的模块和信息
forward函数则定义了一个张量进入模型的整个计算过程,及时拿到一个比较复杂的模型,只要看懂了forward,就看懂了模型的构建过程
在今后的学习复杂模型时,可以使用打印shape的方法进行学习和调试
import paddle
class MyModel(paddle.nn.Layer):
def __init__(self, input_dim=784, hidden_dim=512, output_dim=10):
super(MyModel, self).__init__()
# 定义第一层线性层
self.layer1 = paddle.nn.Linear(input_dim, hidden_dim)
# 使用ReLU激活函数
self.relu1 = paddle.nn.ReLU()
# 定义第二层线性层
self.layer2 = paddle.nn.Linear(hidden_dim, output_dim)
def forward(self, x):
print('输入维度:',x.shape)
x = self.layer1(x)
print('第一层过后:',x.shape)
x = self.relu1(x)
print('激活函数relu过后:',x.shape)
x = self.layer2(x)
print('第二层过后:',x.shape)
return x
model = MyModel()
# 假设输入是一个 batch_size=4 的样本,每个样本的维度是 784
input_data = paddle.randn([4, 784])
# 使用模型进行前向传播
output = model(input_data)
【模型保存】
训练好的模型可以保存下来,以便后续使用或部署。
paddle.save(model.state_dict(), 'model.pdparams')
本地将生成一个名为model.pdparams的文件,它保存着模型当前的权重信息
【加载模型】
# 加载模型参数
model = MyModel()
model_state_dict = paddle.load('model.pdparams')
model.set_state_dict(model_state_dict)
保存好的模型权重,在今后可以随时从文件中调出
例如,可以将训练好的模型权重保存,在下次开机使用或者迁移到其它的项目中
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。