不知道大家有时候会不会有一个很好的idea,但是就是写不出来具体的代码,或者写的代码不够高效。

其实这种情况所有人都会遇到:

  • ​场景1​​:比赛期间有一个新特征的方法,但是用pandas实现太慢,时间复杂度太高。
  • ​场景2​​:科研或工作遇到一个新问题,进入一个新领域,不知道如何开始。
  • ​场景3​​:复现别人的深度学习论文,但就是没法成功。

场景1:代码太慢

现在不管是比赛还是常见的数据处理,都会遇到大规模的文件。此时如果你代码写的不够高效,代码肯定会运行的很慢很慢,基本上没法满足要求。

步骤1:写出基础代码

使用少量数据集来实践你的思路,代码可以不用很优化,优先写出来即可。写完后建议封装为函数,方便调用。

步骤2:优化代码逻辑

在不断增加数据量的过程中,你会发现代码越来越慢,逐渐达到你的预期上限。此时你应该尝试去优化你的代码了。

优化代码有一些基础的逻辑:

  1. 代码本身足够高效吗?
  2. 代码是否利用了所有的CPU/GPU?

例如在使用Pandas时,如果不了解具体的语法,很容易将代码写成​​for​​循环,可以参考以下优化过程。

  • 下标循环
df1 = df
for i in range(len(df)):
if df.iloc[i]['test'] != 1:
df1.iloc[i]['test'] = 0
  • Iterrows循环
i = 0
for ind, row in df.iterrows():
if row['test'] != 1:
df1.iloc[i]['test'] = 0
i += 1
  • Apply循环
df1['test'] = df['test'].apply(lambda x: x if x == 1 else 0)
  • 内置函数
res = df.sum()
  • Numpy函数
df_values = df.values
res = np.sum(df_values)

步骤3:提高资源利用率

当你逐步对Pandas和Numpy的熟悉过程中,你会发现自己的代码也运行的越来越快。如果最终代码都是用内置函数实现,基本上已经很好了。

但也可以进一步优化,因为Pandas很多操作都是串行单线程执行,所以可以手动开多线程进一步加速数据的计算过程,把所有CPU用上,或使用cuDF利用GPU加速。

场景2:新领域无从下手

阅读已有新工作的必经之路,所以努力要站在巨人的肩膀上。

  1. 阅读目标领域内近3-5年顶会论文,特别是综述论文。
  2. 收集公开赛事或榜单上学习Top名次的解决方案,包含思路和代码。

无他唯孰能尔,多收集多整理,理解领域思路和套路。

场景3:复现别人的论文

科研并不是从0到1,一定要多去了解已有的工作,以及已有的论文代码。在阅读完论文代码后,可以按照如下步骤逐步复现:

步骤1:找到有开源代码的论文

在Github上找到历史的有代码的论文,这些论文项目虽然比较旧,但参考价值很大。

步骤2:整理好数据集的加载

搞清楚数据集怎么制作怎么加载怎么输入怎么计算怎么输出,数据集如何处理,如何编码。

步骤3:搭建论文模型

基于论文思路整理好模型结构,有多少层,每层的细节,每层的维度,一步一步搭建。保证模型可以正常训练和预测。

步骤4:确定训练细节

根据论文实验部分的细节,确定具体的batch、epoch、学习率和优化器,确定训练的流程没有问题。

写代码复现论文的几点小建议!_机器学习


qq群955171419