Paddle初识:从入门到入丹炉

  • Paddle
  • 深度学习开发的万能公式
  • 关于学习资源
  • 开源
  • API文档
  • 关于网页notebook
  • 关于代码
  • Ctrl c+ Ctrl v
  • 总结


Paddle

你好!这里是真冷(Bleak Cold)。从零基础开始,结束了为期7天的Paddle高层api学习,诚心诚意与大家分享一下paddle的上手知识和内心感悟。诚邀各位新老司机前来交流经验!

深度学习开发的万能公式

paddle支持的python paddle入门_深度学习


如图,课程结束之后这张图已经刻进了DNA。不过有一说一,这个框架是真的好,让我知道每一步是该做什么,下一步该怎么走,脚踏实地。

关于学习资源

开源

paddlepaddle在GitHub上是有开源的,强烈建议去star支持一下。
开源好处多多:模型不知道怎么配置?看源码。有问题不知道怎么解决?提issues。工作日提出issues一定会有人帮忙回复的,可以节约时间,提高效率,记录问题。

API文档

想用哪个类不知道?上官方文档 没有什么是看文档解决不了的,如果有,就上GitHub看源码

百度把每一个模型都封装得好好的,想用什么模型一个api搞定。(除非没有的模型需要用paddle复现)

因为是面向对象编程,每一个方法的上下基本都是相关的方法。以数据增强transform为例:

paddle支持的python paddle入门_git_02


另外,上课也很香。免费的课程天天送礼品,简直就是薅百度羊毛。可以到官网注册一个账号,玩转Baidu AI stdio。

关于网页notebook

每天10个小时的GPU算力实在是太香了。获得算力的途径包括但不限于:新手礼包、精品项目创建、百度比赛奖品、内部获取

各种环境配置问题迎刃而解,因为不存在环境配置问题。

Model文件直接保存,会有相关api

关于代码

健壮性强:如下,将LSTM网络换为其它网络。

class LSTM_Model(nn.Layer):
    def __init__(self,
                 vocab_size,
                 num_classes,
                 emb_dim=128,
                 padding_idx=0,
                 lstm_hidden_size=198,
                 direction='forward',
                 gru_layers=1,
                 dropout_rate=0,
                 pooling_type=None,
                 fc_hidden_size=96):
        super().__init__()

        # 首先将输入word id 查表后映射成 word embedding
        self.embedder = nn.Embedding(
            num_embeddings=vocab_size,
            embedding_dim=emb_dim,
            padding_idx=padding_idx)

        # 将word embedding经过LSTMEncoder变换到文本语义表征空间中
            self.lstm_encoder = ppnlp.seq2vec.LSTMEncoder(
            emb_dim,
            lstm_hidden_size,
            num_layers=lstm_layers,
            direction=direction,
            dropout=dropout_rate,
            pooling_type=pooling_type)

        # LSTM_Encoder.get_output_dim()方法可以获取经过encoder之后的文本表示hidden_size
        self.fc = nn.Linear(self.LSTM_encoder.get_output_dim(), fc_hidden_size)

        # 最后的分类器
        self.output_layer = nn.Linear(fc_hidden_size, num_classes)

    def forward(self, text, seq_len):
        # text shape: (batch_size, num_tokens)
        
        # Shape: (batch_size, num_tokens, embedding_dim)
        embedded_text = self.embedder(text)
        
        text_repr = self.LSTM_encoder(embedded_text, sequence_length=seq_len)

        # Shape: (batch_size, fc_hidden_size)
        fc_out = paddle.tanh(self.fc(text_repr))

        # Shape: (batch_size, num_classes)
        logits = self.output_layer(fc_out)
        
        # probs 分类概率值
        probs = F.softmax(logits, axis=-1)
        return probs

这里我选择使用GRU,只需要换名字即可:

class GRU_Model(nn.Layer):
    def __init__(self,
                 vocab_size,
                 num_classes,
                 emb_dim=128,
                 padding_idx=0,
                 gru_hidden_size=198,
                 direction='forward',
                 gru_layers=1,
                 dropout_rate=0,
                 pooling_type=None,
                 fc_hidden_size=96):
        super().__init__()

        # 首先将输入word id 查表后映射成 word embedding
        self.embedder = nn.Embedding(
            num_embeddings=vocab_size,
            embedding_dim=emb_dim,
            padding_idx=padding_idx)

        # 将word embedding经过GRUEncoder变换到文本语义表征空间中
        self.GRU_encoder = ppnlp.seq2vec.GRUEncoder(
            emb_dim,
            gru_hidden_size,
            num_layers = gru_layers,
            direction = direction,
            dropout = dropout_rate,
            pooling_type = pooling_type
        )

        # GRU_Encoder.get_output_dim()方法可以获取经过encoder之后的文本表示hidden_size
        self.fc = nn.Linear(self.GRU_encoder.get_output_dim(), fc_hidden_size)

        # 最后的分类器
        self.output_layer = nn.Linear(fc_hidden_size, num_classes)

    def forward(self, text, seq_len):
        # text shape: (batch_size, num_tokens)
        
        # Shape: (batch_size, num_tokens, embedding_dim)
        embedded_text = self.embedder(text)
        
        text_repr = self.GRU_encoder(embedded_text, sequence_length=seq_len)

        # Shape: (batch_size, fc_hidden_size)
        fc_out = paddle.tanh(self.fc(text_repr))

        # Shape: (batch_size, num_classes)
        logits = self.output_layer(fc_out)
        
        # probs 分类概率值
        probs = F.softmax(logits, axis=-1)
        return probs

怎么样?是不是代码健壮性很强?(面向对象当然这样)

Ctrl c+ Ctrl v

很多时候,有那么一大串代码,你打来打去就是那么几个东西,可是你又不能舍掉它。这时候,就可以考虑将它放在一个特定的文件里,放在方便找的地方。需要的时候一个复制粘贴下来,省了不少时间~

还有比如上一堂课里面的优化器,感觉不错,打算这节课使用。一套复制粘贴下来,微调一下learning_rate就可以用,而且精度提升不少。

十二生肖里面dataset.py文件,打开,数据增强transform搬过来,一个Compose下来数据增强搞定。

总结

师傅引进门,修行在个人。七天的学习不可能支撑起整个深度学习体系。多看api文档,疯狂实践,fork项目进行学习,了解原理,熟练应用,定要经历九九八十一难,才可练就真丹。很感谢各位老师的付出,期待下期见。

paddle支持的python paddle入门_paddle_03