百度飞桨(Paddle2.0)预训练模型加载、训练、预防过拟合(Dropout)–以柠檬分类数据集为例

课程连接:

飞桨开源框架(PaddlePaddle)是一个易用、高效、灵活、可扩展的深度学习框架。自2.0版本颁布以来,简洁的代码设计、高效的数据转换让paddle入门学习不再成为难题!
与两大常用框架不同的是,paddle2.0同时支持 动态图静态图模式。同时,丰富的低层API和高效的高层API能够帮助您轻松实现您的任何想法。 xxtorch和xxras合体有木有啊!!!
深度学习,有卡才能笑到最后。良心百度为广大用户(穷学生们)推出 AI Studio在线学习平台,工业界最强 Tesla V100算力任你白嫖!!!xdm冲起来!!!
接下来,本文将用柠檬分类的例子为大家介绍一个完整的开发流程。

预训练模型

深度学习最重要的是什么?是数据!!!
可实际应用中,我们无法收集到那么多的数据。这个时候就需要使用预训练模型。相同模型,使用or not预训练参数,最后训练结果往往会差距很大。
paddle也为我们提供了基本的预训练模型和参数(ImageNet)。
常见模型有: VGG系列、ResNet系列、MobileNet系列

import paddle
from paddle.vision.models import resnet50

build model
model = resnet50()

build model and load imagenet pretrained weight
model = resnet50(pretrained=True)

x = paddle.rand([1, 3, 224, 224])
out = model(x)

print(out.shape)

自定义模型

在预训练模型的基础上,我们需要修改一下结果来符合任务要求。
下面,我们将添加Dropout层,来减少过拟合的发生。

#定义模型
class resNet(paddle.nn.Layer):
    def __init__(self):
        super(resNet,self).__init__()
        #加载resnet101
        self.layer=paddle.vision.models.resnet101(pretrained=True)
        # dropout层
        self.dropout = paddle.nn.Dropout(0.5)
        # 全连接层
        self.fc1 = paddle.nn.Linear(1000,100)
        self.fc2 = paddle.nn.Linear(100, 4)

    #网络的前向计算过程
    def forward(self,x):
        x=self.layer(x)
        x = self.dropout(x)
        x=self.fc1(x)
        x = self.dropout(x)
        x=self.fc2(x)
        return x

至此,我们成功定义了自己的修改版resNet。

高层API训练

paddle2.0提供了丰富的高层API函数,让我们仅用一两行代码就能完成任务的训练与调参。

模型封装
model_res = resNet()
model = paddle.Model(model_res)

#学习率策略
scheduler = paddle.optimizer.lr.LinearWarmup(
        learning_rate=0.0003, warmup_steps=20, start_lr=0, end_lr=0.003, verbose=False)
定义优化器
optim = paddle.optimizer.SGD(learning_rate=scheduler, parameters=model.parameters())

配置模型
model.prepare(
    optim,
    paddle.nn.CrossEntropyLoss(soft_label=True),
    Accuracy()
    )

模型训练与评估
model.fit(train_loader,
        val_loader,
        log_freq=10,
        epochs=80,
        # callbacks=Callbk(write=write, iters=iters),
        verbose=1,
        )

评估精度

也是一行代码完成对测试集的精度评估,非常方便。

result = model.evaluate(val_loader,batch_size=64,log_freq=100, verbose=1, num_workers=0, callbacks=None)

我们的修改版resnet101训练80个epoch后,在柠檬分类数据集上的测试集精度可以达到90.69%

Eval samples: 290
Eval begin...

The loss value printed in the log is the current batch, and the metric is the average value of previous step.

step 5/5 [==============================] - loss: 0.5985 - acc: 0.9069 - 567ms/step

简单几行代码就完成了任务。更好的体验请大家到AI Studio课程栏目里去体验。

Original: https://blog.csdn.net/qq_33441431/article/details/114543818
Author: qq_33441431
Title: 百度飞桨(Paddle2.0)预训练模型加载、训练、预防过拟合(Dropout)–以柠檬分类数据集为例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/666910/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球