PaddlePaddle简介
PaddlePaddle是非常好用的深度学习库,尤其是2.0版本发布以来,高低层API可以自由结合使用,优点如下:
- 可以像tensorflow里面的keras一样非常方便的用几行代码完成模型构建和训练
- 可以像pytorch一样使用通过继承layer层方便结合各种高级神经网络模型
PaddleClas
为了保持PaddlePaddle主库的核心功能性(主要实现基本算子的优化加速代码),网络种类不能太多,通常不会加入太多高级网络,因此只会留少量的常用的基础网络。
如果我们想要体验比较新鲜的高级网络就需要其生态系统下的其他代码仓库,幸运的是,PaddlePaddle生态系统下有大量高级网络的实现,以及对应的预训练参数,这对迁移学习非常友好,比如图像分类库PaddleClas。
为了对PaddleClas网络预训练模型进行加载,首先需要了解加载模型的文档的方法:
然后我们以EfficientNetB7
网络的加载为例:
- 首先图像分类库PaddleClas里fork下源码
- 然后还在那个网页里下面的说明中找到
EfficientNetB7
参数下载链接并下载模型参数 - 最后根据上文中提到的载模型参数方式进行代码编写,具体代码如下
# 直接从源码读取动态图并加载参数数
import paddle
from work.PaddleClas.ppcls.modeling.architectures.efficientnet import EfficientNetB7
# 得到EfficientNetB7模型
eb7 = EfficientNetB7()
# 加载模型预训练参数
layer_state_dict = paddle.load('./EfficientNetB7_pretrained.pdparams')
eb7.set_state_dict(layer_state_dict)
实现模型构建和加载后即可根据输出分类数目简单加一个线性层搭建自己的网络:(当然你也可以自由发挥,比如和其他高级网络并联组网或者串联组网)
class SimpleNet(paddle.nn.Layer):
def __init__(self):
super(SimpleNet, self).__init__()
# __
self.chooseModel = eb7
self.fc1 = paddle.nn.Linear(in_features=1000, out_features=512)
self.re = paddle.nn.ReLU()
self.fc2 = paddle.nn.Linear(in_features=512, out_features=100)
def forward(self, x):
# 使用预训练模型的网络
x = self.chooseModel(x)
##不更新预训练网络及其之前的层,可加速,比如注释前:466ms/step 之后750ms/step
# x.stop_gradient=True
x = self.fc1(x)
x = self.re(x)
x = self.fc2(x)
return x
network = SimpleNet()
下面我们可以使用高级API模块对network
进行加载,然后非常简单的进行配置和训练:
# 模型配置
model = paddle.Model(network)
model.prepare(paddle.optimizer.Adam(learning_rate=0.0002, parameters=model.parameters()),
paddle.nn.CrossEntropyLoss(),
# paddle.metric.Accuracy(topk=(1, 5)), #这里可以选择输出结果显示前几位预测命中结果的准确度
paddle.metric.Accuracy()) # 这里选择top1的准确度,因为作业要求以top1作为评价指标
callback_visual = paddle.callbacks.VisualDL(log_dir='./visualdl') # 设置visualdl可视化路径
# 模型训练
model.fit(train_dataset, # 训练数据集
eval_dataset, # 评估数据集
epochs=50, # 总的训练轮次
batch_size=32, #次计算的样本量大小----原参数:64 显存充足,因此调大该参数提高训练速度
callbacks=[callback_visual], #可视化
save_dir='./chk_points/', # 分阶段的训练模型存储路径
save_freq = 2, #保存模型频率
verbose=1)