图像分类之PaddleClas⽹络预训练模型加载⽅法PaddlePaddle简介 左旋肉碱论坛
PaddlePaddle是⾮常好⽤的深度学习库,尤其是2.0版本发布以来,⾼低层API可以⾃由结合使⽤,优点如下:可以像tensorflow⾥⾯的keras⼀样⾮常⽅便的⽤⼏⾏代码完成模型构建和训练可以像pytorch⼀样使⽤通过继承layer层⽅便结合各种⾼级神经⽹络模型
PaddleClas
为了保持PaddlePaddle主库的核⼼功能性(主要实现基本算⼦的优化加速代码),⽹络种类不能太多,通常不会加⼊太多⾼级⽹络,因此只会留少量的常⽤的基础⽹络。
如果我们想要体验⽐较新鲜的⾼级⽹络就需要其⽣态系统下的其他代码仓库,幸运的是,下有⼤量⾼级⽹络的实现,以及对应的预训练参数,这对迁移学习⾮常友好,⽐如。 为了对PaddleClas⽹络预训练模型进⾏加载,⾸先需要了解加载模型的⽂档的⽅法:
源码中加载模型参数⽅式
模型加载存储
然后我们以EfficientNetB7⽹络的加载为例:
⾸先⾥fork下源码
然后还在那个⽹页⾥下⾯的说明中到EfficientNetB7参数下载链接并下载模型参数
最后根据上⽂中提到的载模型参数⽅式进⾏代码编写,具体代码如下
# 直接从源码读取动态图并加载参数数
import paddle
from work.deling.architectures.efficientnet import EfficientNetB7
# 得到EfficientNetB7模型
eb7 = EfficientNetB7()
# 加载模型预训练参数
layer_state_dict = paddle.load('./EfficientNetB7_pretrained.pdparams')
eb7.set_state_dict(layer_state_dict)
实现模型构建和加载后即可根据输出分类数⽬简单加⼀个线性层搭建⾃⼰的⽹络:(当然你也可以⾃由发挥,⽐如和其他⾼级⽹络并联组⽹或者串联组⽹)
class Layer):
def __init__(self):
super(SimpleNet, self).__init__()pfa
# __
self.chooseModel = eb7
self.fc1 = Linear(in_features=1000, out_features=512)
< = ReLU()
社会科学论坛
self.fc2 = 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 = (x)
x = self.fc2(x)
return x
cdn服务
network = SimpleNet()
下⾯我们可以使⽤⾼级API模块对network进⾏加载,然后⾮常简单的进⾏配置和训练:梦溪学林
# 模型配置
model = paddle.Model(network)
model.prepare(paddle.optimizer.Adam(learning_rate=0.0002, parameters=model.parameters()),
# ic.Accuracy(topk=(1, 5)), #这⾥可以选择输出结果显⽰前⼏位预测命中结果的准确度 ic.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)