炼丹tips
- 网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小
- 欠拟合:增加网络层数,增加节点数,减少dropout值,减少L2正则
过拟合:提高模型泛化能力的方向,调节参数 - 先参考相关论文, 以论文中给出的参数作为初始参数 。 至少论文中的参数,是个不差的结果。
- 对训练数据进行采样。例如原来100W条数据,先采样成1W,进行实验看看。
- dropout对小数据防止过拟合有很好的效果,值一般设为0.3,0.5,0.8, 然后依据这三个的结果进行微调
- 自动调参:
Gird Search.这个是最常见的。具体说,就是每种参数确定好几个要尝试的值,然后像一个网格一样,把所有参数值的组合遍历一下。优点是实现简单暴力,如果能全部遍历的话,结果比较可靠。缺点是太费时间了,特别像神经网络,一般尝试不了太多的参数组合。
Bayesian Optimization.贝叶斯优化,考虑到了不同参数对应的实验结果值,因此更节省时间。和网络搜索相比简直就是老牛和跑车的区别。具体原理可以参考这个论文:Practical Bayesian Optimization of Machine Learning Algorithms ,这里同时推荐两个实现了贝叶斯调参的Python库,可以上手即用 - 尽量对数据做shuffle
- 当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是可能影响最终性能 ),试着要做一些数据归一化。([作者:hzwer](https://www.zhihu.com/question/41631631/answer/859040970)
- tensorboard很好用
- 网络层数,参数量什么的都不是大问题,在性能不丢的情况下,减到最小
- pandas.describe()函数可以描述一维数据集或二维表结构的初步特征,目的在于观察这一系列数据的范围、大小、波动趋势等等。
- 同一套超参,没事多跑几遍,要是区别很大,就肯定有问题
- 实在没招了,调一调随机数种子,没准有奇效
参考:
时序tips
突然想起自己做的时序预测,那是不是可以找找相关炼丹tips
- 尝试一下序列做过一阶差分进行预测,尝试一下,看看效果怎么样
# DataFrame.diff(periods=1, axis=0)
import numpy as np
import pandas as pd
# 转化np.array数据为DataFrame数据类型
df = pd.DataFrame(df)
# 一阶差分
df.diff()
# 一阶差分 消除nan
df.diff().dropna()
# 二阶差分
df.diff(periods = 2)
# 纵向一阶差分, 当前行减去上一行,第一行变成Nan(x,y)->(x-1,y)
df.diff(axis=0).dropna()
# 横向一阶差分,当前列减去左边的列最左侧的列变为Nan(x,y)->(x,y-1)
df.diff(axis=1).dropna()
# 转化回np.array
df=df.values
因为我这是np数列,刚刚发现np也有diff函数呀,不过好像没有pd的用的人多,相关帖子并不算多
# np.diff()
np.diff(a, n=1,axis=-1)
# a:输入矩阵
# n:可选,代表要执行几次差值
# axis:默认是最后一个,估计和pd的差不多
np.diff(a, n=1, axis = 0) # 纵向一阶差分
差分完,预测出结果之后还要还原回去啊!别忘了还原回去啊!
先给数据加上差分前的第一行,np.append
np.append(a[0:1,...], diffed_a, axis = 0) # 向下拼接
凑成完整的后,还原,np.cumsum
np.cumsum()# numpy.cumsum(a, axis=None, dtype=None, out=None)
# axis = 0 纵向; 1 横向
#dtype = 输出类型,平台默认为整形,可改为float
np.cumsum(a) # 拉成一维,依次累加
np.cumsum(a, dtype=float) # 输出浮点型数据
np.cumsum(a, axis = 0) #纵向还原
np.cumsum(a, axis = 1) # 横向还原
效果出来了。。。啥也不是!