神经网络训练新的之特征工程尽量不要加入过多的格式转换(从浮点到文本,再从文本到浮点)

神经网络训练日志

今日正在编写的样本生成工具处理数据非常慢,并且随着处理的进度增加,越来越慢,通常要几个小时,检查原因居然是numpy框架的concatenate函数效率低下,说白了这是个小白问题,它在不断重新扩大数组的大小,所有数据都要重新编排数组下标。

first_array = np.concatenate((first_array, features_of_row),
                                         axis=0)  # 这里有巨大的性能隐忧,尤其是在循环里面

因此,俺就放弃了这个函数,自己写了一个函数,通过一个临时文件,将数据追加到文件里面。然后再读取出来

 array_str_line = ';'.join("{:10.15f}".format(x[0]) for x in features_of_row)
 array_str_line = array_str_line + "\r\n"
 csv_file.write(array_str_line)

这方法果然有效,性能提升了10倍都不止,以前一天的工作,现在要2个小时就生成了100万的训练数据。于是赶紧将其拉到GPU中训练,谁料预测准确率下降了10%,百思不得其解。
在无聊的训练过程中,盯屏幕发呆的时候,无意中发现,之前的损失函数突发变的无比大的问题不见了,曲线上就是波动较大的波峰不见了。这是为什么呢?经过托着下巴一个小时的思考,灵机一动,得到了答案:肯定是训练数据有了巨大的变化,立刻检查刚才自己写的函数处理的临时文本中的数据,才发现,在文本和numpy array的来回倒腾的时候,一些数据精度丢失了,再拿这种损失精度的数据取训练,导致降低了准确率。

所以总结下,在特征工程阶段,尽量干这种丢失精度的数据转换,尤其是你的数据都是比较小的时候。

你可能感兴趣的:(机器学习,python)