您现在的位置是:首页 >技术杂谈 >跟姥爷深度学习3 神经网络的调试实操网站首页技术杂谈

跟姥爷深度学习3 神经网络的调试实操

布兰姥爷 2023-05-13 16:00:02
简介跟姥爷深度学习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的参数可不行,还是得搞明白基本的数学原理。或者就像大家说的那样,直接使用经典的网络结构,很多细节的地方,不是自己随便改改就行的。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。