跟姥爷深度学习3 神经网络的调试实操
一、前言
前面我们做了一次天气预测的模型,训练的结果都还好,网络好歹是“拟合”了,但预测数据不合预期让我一直耿耿于怀。所以我又花了很长时间来研究为什么,我的理论依据明明没有问题(今日*均温度与*一周*均温度具有相关性),预测出来的数据却有问题。
为了解决这个问题,我构建了一个极简的问题和模型,从最简单的问题来入手,排查问题产生的原因,功夫不负有心人,还真给我排查到了。
二、一个极简的问题
假设现在有输入X=[1,2,3],对应的Y=[2,5,6]。我们按之前的步骤来构建神经网络。
如上图代码,训练数据(features)只有3行1列,对应的正确值(labels)也是3行1列。
如上图,构建一个非常简单的网络,神经元加起来也就10个。同时保留了之前气温预测的网络配置。训练结果还可以。
如上图,预测的结果不太如人意。正常应该是2、5、6,实际是2.3、4.3、6.3。这么简单的一个数据结构和网络,咋说都不应该偏差这么大吧。于是我尝试了只预测一个数据。
情况似乎更糟糕了,所以一定是哪里搞错了。我尝试过将所有能修改的参数都改了下,有一些参数的修改能够正常拟合,有的拟合都做不到。但即使正常拟合的网络结果也都是像上图一样,总是预测出错误值。
最后的最后,我突然想到3年前,第一次接触神经网络时,当时的教程说,如果要做“概率”预测,最好就将待训练的数据进行归一化,也就是将10、20、30,这样的数据,按正态分布转换成0.1、0.2、0.3这样介于0-1之间的数。但明显我们这里构建的小模型以及之前做的天气预测,都不是“概率”预测,而是“数值”预测,所以是不是不应该做归一化?
这时候虽然预测的结果一般,但是数值至少不是很奇葩了,所以问题应该是出在网络不够“拟合”。所以我随便调了下,真的只是随便改改。
增加了一个激活函数,虽然loss值很高,但是它减少的幅度非常喜人。
所以我增大了loss的幅度,并增加了训练的次数,然后网络就神奇的“收敛”了,而且收敛的特别好。
预测的结果也非常好。
三、对天气预测模型进行修改
在原来代码的基础上,只是去掉了归一化,增加了训练次数,预测的结果发生了极大的变化。虽然预测温度与实际温度还是有一些差异,但至少是在一个水*线上浮动,之前的预测结果直接就是翻倍了。
四、回顾
实际上前面天气预测的代码我也是从网上找来的,他的教程其实真的不错,但没料到也会有这么大个坑。所以搞神经网络,只是懂怎么改TensorFlow的参数可不行,还是得搞明白基本的数学原理。或者就像大家说的那样,直接使用经典的网络结构,很多细节的地方,不是自己随便改改就行的。