为什么神经网络做不了2次函数拟合,网上的都是骗人的吗?

news2024/10/3 6:37:34

环境:tensorflow2 kaggle

这几天突发奇想,用深度学习训练2次函数。先在网上找找相同的资料这方面资料太少了。大多数如下:

给我的感觉就是,用深度学习来做,真的很容易。

网上写出代码分析的比较少。但是也找到了一篇,写的言简意赅,不过我自已训练时,却发现对训练之外的数据,预测的不好。下面分两部分来阐明这一现像与我的思考。

 

一、代码复现:

(204条消息) tensorflow2.0实现简单曲线拟合_一只双鱼儿的博客-CSDN博客_tensorflow2 曲线拟合

网络结构如下:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(10,input_shape=(1,),activation="elu"),
    tf.keras.layers.Dense(1)
])

该文章效果如下:

 可以看出,在训练集内效果是很好的,但是博主没有使用训练集外的数据。于是我扩展了预测集,效果如下:

可以发现 ,在[1,5]定义域内,基本就是直线了。

这就很奇怪了,在训练集内是曲线,之外是直线。看网络结构,确实引入了非线性的环节如:activation="elu"。那这个非线性环节究竟有多大用呢?这就引出了第一个问题。

我试着将网络结构改为如下(也就是只保留线性环节):

"""
model = tf.keras.Sequential([
    tf.keras.layers.Dense(10,input_shape=(1,),activation="elu"),
    tf.keras.layers.Dense(1)
])
"""
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1,input_shape=(1,)),
    tf.keras.layers.Dense(1)
])

效果如下:

 

 好吧,那第一个问题是解决了。activation="elu"效果是很明显的。

二、为什么在训练集之外,生成了直线?

是过拟合吗?将训练集变成了查表法?

我做了如下实验,这其实是我的第二步(y=ax^2+bx+c+[noise],第一步没保存),用来满足y=x^2已经足够了:

ds_x = []
ds_y = []


# 生成数据集
ds_x = np.linspace(-1,1,100)
ds_y = 5*ds_x**2 + 9*ds_x + 300 + np.random.randn(100)*0.05

class model_x2(tf.keras.Model):
    def __init__(self):
        super(model_x2,self).__init__()
        self.layer1   = tf.keras.layers.Dense(1)
        self.layer1_2 = tf.keras.layers.Dense(1)
        self.layer2   = tf.keras.layers.Dense(1)
        
        
        
        
    def call(self,in1):
        in2  = tf.keras.layers.Multiply()((in1,in1,in1)) #in1 * in1
        x    = self.layer1(in2)
        x1_2 = self.layer1_2(in1)
        x2   = tf.keras.layers.concatenate((x,x1_2))
        out  = self.layer2(x2)
        return out
    
model = model_x2()  
model.build(input_shape=(None,1))
model.summary()

opt       = tf.keras.optimizers.Adam(learning_rate=0.01)
los       = tf.keras.losses.MeanSquaredError()
acc       = tf.keras.metrics.MeanSquaredError()
model.compile(optimizer=opt,loss=los,metrics=acc)

model.fit(ds_x,ds_y,epochs=500)

#以下就是画图了,将数据集里【-1,1】添加到【-1,3】,多出来的【1,3】示为预测
x = np.linspace(-1,3,20000) #np.array(range(1,100,1))
#y = x**x

y_predict = model.predict(x)

ds_x = np.linspace(-1,3,100)
ds_y = 5*ds_x**2 + 9*ds_x + 300 + np.random.randn(100)*0.05

plt.scatter(ds_x,ds_y)
plt.plot(x,y_predict,'r')
plt.show()

#以下就是画图了,将数据集里【-1,1】添加到【-1,3】,多出来的【1,3】示为预测

效果如下:

 三、结论:

用深度学习的多层结构,拟合非线性数据???

NO,NO,NO

应该手动引用非线性因子。

这不禁让我想起了曾经的日子,我们都知道3极管可以线性放大,但是有没有一种方式可以产生x^2项。当然是可以的,这就涉及到2极管还是3极管。。。的物理公式如下。。。

知道的小伙伴可以在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337649.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云计算|OpenStack|社区版OpenStack安装部署文档(十二--- openstack的网络模型解析---Rocky版)

前言: https://zskjohn.blog.csdn.net/article/details/128846360 云计算|OpenStack|社区版OpenStack安装部署文档(六 --- 网络服务neutron的安装部署---Rocky版) (######注:以上文章使用的是openstack的provider网…

【Vue3】电商网站吸顶功能

头部分类导航-吸顶功能 电商网站的首页内容会比较多,页面比较长,为了能让用户在滚动浏览内容的过程中都能够快速的切换到其它分类。需要分类导航一直可见,所以需要一个吸顶导航的效果。 目标:完成头部组件吸顶效果的实现 交互要求 滚动距离大…

计算机视觉 对比学习13篇经典论文、解读、代码

为了快速对 机器视觉中的对比学习有一个快速了解,或者后续复习,此处收录了 13篇经典论文、一些讲解地较好的博客和相应的Github代码,用不同颜色标记。 ​ 对比学习 13篇经典论文 论文代码和博客http://​www.webhub123.com/#/home/detail?p…

Nextjs了解内容

目录Next.jsnext.js的实现1,nextjs初始化2, 项目结构3, 数据注入getInitialPropsgetServerSidePropsgetStaticProps客户端注入3,CSS Modules4,layout组件5,文件式路由6,BFF层的文件式路由7&…

爬虫笔记之——selenium安装与使用(1)

爬虫笔记之——selenium安装与使用(1)一、安装环境1、下载Chrome浏览器驱动(1)查看Chrome版本(2)下载相匹配的Chrome驱动程序地址:https://chromedriver.storage.googleapis.com/index.html2、学…

vue83-103

vue全局路由拦截路由懒加载路由原理swiper组件选项卡封装电影导航组件正在热映获取数据渲染axios封装详情渲染详情轮播详情Header-组件影院组件渲染全局路由拦截 即使路径对,也会被拦截 router.beforeEach((to,from, next) > { console.log(to) if(…

雅思经验(9)

写作:关于趋势的上升和下降在小作文中,真的是非常常见的,所以还是要积累一下。下面给出了很多词,但是在雅思写作中并不是词越丰富,分数就越高的。雅思写作强调的是准确性:在合适的地方用合适的词和句法。不…

【数据库】 数据库中表的基本操作

目录 表的基本操作 一, 创建表 1,单行命令创建表: 2,分行命令创建表: 二, 数据类型 1,文本类型: 2,数值类型: 3,日期/时间类型&#xff1a…

软件测试金融测试岗位,本人亲面

网上银行转账是怎么测的,设计一下测试用例。 回答思路: 宏观上可以从质量模型(万能公式)来考虑,重点需要测试转账的功能、性能与安全性。设计测试用例可以使用场景法为主,先列出转账的基本流和备选流。然…

一个图片对比的小工具【小工具制作】

目录逐一击破确定架构图片上传自适应生成对比界面切换对比模式打分功能审核进行提交项目负责人查看问题并改正总结前言:这是一个实际的需求,因为需要设计师给的原图和同学们制作出来的项目成品图进行比对打分,所以就有了一个图片对比的小工具…

用 Python 调用 GPT-3 API

用 Python 调用 GPT-3 API GPT-3 是去年由 Open AI 推出的语言机器学习模型。它因其能够写作、写歌、写诗,甚至写代码而获得了广泛的媒体关注!该工具免费使用,只需要注册一个电子邮件即可。 GPT-3 是一种叫 transformer 的机器学习模型。具体…

C语言(输入printf()函数)

printf()的细节操作很多,对于现阶段的朋友来说,主要还是以理解为主。因为很多的确很难用到。 目录 一.转换说明(占位符) 二.printf()转换说明修饰符 1.数字 2.%数字1.数字2 3.整型转换字符补充 4.标记 -符号 符号 空格符…

JavaWEB必知必会-Servlet

目录 Servlet简介Servlet快速入门Servlet配置详解ServletContext 1 Servlet简介 Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码&a…

电脑里的连接速度双工模式是什么?怎么设置

双工模式包括全双工、半双工模式。1.半双工1、半双工数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。所谓半双工就是指一个时间段内只有一个动作发生。早期的对…

十二、Linux文件 - fseek函数讲解

目录 一、fseek函数讲解 二、fseek函数实战 一、fseek函数讲解 重定向文件内部的指针 注:光标 ---- 文件内部的指针 函数原型: int fseek(FILE *stream,long offset,int framewhere) 参数: stream:文件指针offset:…

golang由浅入深

简介 Go语言(Golang)是由Google公司的Robert Griesemer、Rob Pike、Ken Thompson三位工程师开发的一种静态强类型、编译型、并发型、快速运行的编程语言。 Go语言诞生于2007年,旨在创造一种具有现代特性的编程语言,可以替代C和Jav…

DS期末复习卷(二)

选择题 1.下面关于线性表的叙述错误的是( D )。 (A) 线性表采用顺序存储必须占用一片连续的存储空间 (B) 线性表采用链式存储不必占用一片连续的存储空间 © 线性表采用链式存储便于插入和删除操作的实现 (D) 线性表采用顺序存储便于插…

2023春招100道软件测试高频面试题

给大家整理了2023春招的100道软件测试高频面试题,篇幅较长,所以只放出了题目,答案在文末,自行获取哦! 1.项目测试流程你是怎么开展的? 2.接口测试用例的编写要点有哪些? 3.APP测试和Web测试有…

ubuntu20.04安装docker与docker-compose

安装docker 查看系统发行版本 cat /proc/version1、更新apt包 sudo apt-get update2、安装必备的软件包以允许apt通过 HTTPS 使用存储库(repository): sudo apt-get install ca-certificates curl gnupg lsb-release3、添加Docker官方版本…

C语言学习笔记(一):了解C语言

什么是C语言 C语言是一种高级编程语言,最早由丹尼斯里奇在1972年开发。它是一种通用编程语言,提供了高级编程语言的方便和易用性,同时又有较低级别的编程语言的灵活性和效率。C语言在许多操作系统、编译器和应用程序开发中广泛使用&#xff…