Paddle初识:从入门到入丹炉
- Paddle
- 深度学习开发的万能公式
- 关于学习资源
- 开源
- API文档
- 关于网页notebook
- 关于代码
- Ctrl c+ Ctrl v
- 总结
Paddle
你好!这里是真冷(Bleak Cold)。从零基础开始,结束了为期7天的Paddle高层api学习,诚心诚意与大家分享一下paddle的上手知识和内心感悟。诚邀各位新老司机前来交流经验!
深度学习开发的万能公式
如图,课程结束之后这张图已经刻进了DNA。不过有一说一,这个框架是真的好,让我知道每一步是该做什么,下一步该怎么走,脚踏实地。
关于学习资源
开源
paddlepaddle在GitHub上是有开源的,强烈建议去star支持一下。
开源好处多多:模型不知道怎么配置?看源码。有问题不知道怎么解决?提issues。工作日提出issues一定会有人帮忙回复的,可以节约时间,提高效率,记录问题。
API文档
想用哪个类不知道?上官方文档 没有什么是看文档解决不了的,如果有,就上GitHub看源码
百度把每一个模型都封装得好好的,想用什么模型一个api搞定。(除非没有的模型需要用paddle复现)
因为是面向对象编程,每一个方法的上下基本都是相关的方法。以数据增强transform为例:
另外,上课也很香。免费的课程天天送礼品,简直就是薅百度羊毛。可以到官网注册一个账号,玩转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项目进行学习,了解原理,熟练应用,定要经历九九八十一难,才可练就真丹。很感谢各位老师的付出,期待下期见。