热门标签 | HotTags
当前位置:  开发笔记 > 开发工具 > 正文

用tensorflow2神经网络拟合二维函数曲面4/(3*x)+1/y

我们采用神经网络拟合43x11x2我们采用神经网络拟合\space\space\frac4{3x_1}\frac1{x_2}我们采用神经网络拟合3x1​4​x2​1​实验记录&#x

我们采用神经网络拟合43x1+1x2我们采用神经网络拟合\space\space\frac4{3x_1}+\frac1{x_2}   3x14+x21
实验记录:
无论改变网络层数,还是改变网络的激活函数,当随机取点的范围由0.1-0.5变为0.001到0.5时,误差总会迅速增大,直到0-0.5时彻底跑飞。
原因很明显,函数在x1,x2趋近0时值会变成无穷大,那么怎么解决这一问题呢?
答案非常简单,替换损失函数——由mse换为msle.
整体的代码可以参考我的github项目。
在进一步的实验又发现了许多有趣的现象,记录如下:
1.使用shuffle之后,训练效果变差,卡在8.多左右;
2.将第二个隐藏层的参数由2xsize变为3xsize之后,效果也变差了,也是误差下不去;
以上两点都是在换成msle后出现的问题。
此外,msle在拟合平面上效果也不错。(val集误差仅10-3量级)
至于优化算法:至少在目前这两个网络结构上,sgd和adam的表现差不多:

(sgd)loss: 0.3602 - mean_squared_logarithmic_error: 0.3602 - val_loss: 0.5258 - val_mean_squared_logarithmic_error: 0.5258

(adam)loss: 0.3477 - mean_squared_logarithmic_error: 0.3477 - val_loss: 0.5307 - val_mean_squared_logarithmic_error: 0.5307

但是,当sgd+将第二个隐藏层的参数由2xsize变为3xsize时(以下简称为“宽”()(9),效果竟然变的相当好,这一下子网络变宽的性能竟然体现出来了(后来重新实验发现这种现象消失了!!!why?):

3125/3125 [==============================] - 1s 466us/step - loss: 0.2471 - mean_squared_logarithmic_error: 0.2471 - val_loss: 0.2247 - val_mean_squared_logarithmic_error: 0.2247

我尝试加深一层网络,使用sgd和adam却都让网络变得很糟糕,几乎没能拟合到什么东西(误差8.多下不去,直接预测成平面)
尝试新的loss函数logcosh:
我尝试了logcosh+sgd或adam在窄网络上,logcosh+sgd在宽网络上,结果都差不多:误差一开始从80左右能降到40但之后就不行了,观察图像,发现他其实也差不多是平的,但是好歹平移了一下:
在这里插入图片描述
总结:下一步工作设计一个多层for循环自动调参,使我看得更清楚。

为了解决当务之急,我缩小了训练区域,企图通过在小区域内密集训练实现更好的拟合效果,但是效果仍不很明显:

在这里插入图片描述
train0-0.3 test0-1 1331.

种群信息导出完毕。
评价次数:25000
时间已过 1.6455268859863281 秒
最优的目标函数值为:8.9836
最优的控制变量值为:
0.10010000000000001
0.4438835845159062

总会有一个差值。。。不知道怎么来的,真实解是0.24-0.24

shuffle=True+1331+adam(sgd根本下不去,这是强行下去了,直接压成两个平面,我服了这个网络的想法):
在这里插入图片描述拟合平面时不使用(或少使用)relu效果更好
;
有时候就是运气不好,优化算法没有奏效,loss下不去,拟合平面时用adam+msle尤为如此;改为sgd+mse似乎更好一些


推荐阅读
author-avatar
哥哥很霸道_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有