Access-Control-Allow-Origin跨域解决及详细介绍

跨源资源共享(CORS)Access-Control-Allow-Origin 好啦,jsonp的原理:通过script标签引入一个js文件,这个js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入,有种回调的味道!服务器:诶,你是谁,我来看看你的origin,嗯嗯,可以,符合我的要求,放行!没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任。,标识允许哪个域的请求。,浏览器也不会理,并且即使有目标站点的cookies,浏览器也不会发送。返回的是满足服务器要求的所有请求方式,请求头,不限于该次请求, 阅读详情
AI摘要

本文深入解析跨域问题的本质,即浏览器同源策略导致的请求限制,详细介绍了CORS、JSONP等常见解决方法,以及VUE项目中代理配置的作用。强调了解决跨域问题需前后端协同。

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

本文更新不及时,建议到原文地址浏览:跨域解决及详细介绍。

首先,跨域不是问题。是一种安全机制。 这是你在开发时、上线前就必须提前考虑到的安全问题并且采取合适的手段去避免这个问题带来的程序错误。不过通常情况下,前端开发的小伙伴们都非常坚信后端小伙伴的接口一定已经处理好了跨域这个需求。然而事实上许多的前端拿到的都是没有解决跨域的接口。又出于某种原因不便与后端交涉并且对方视乎态度不是很友好。在这种情况下作为前端的小伙伴们心里简直一万头草泥马飞过。

不过现在你不必为之犯困了,哪个后端要是不协助处理跨域导致的一系列问题的话,请将本文直接甩给后台,脸必须打响。要解决跨域必须由后端来一起协同解决,且主要解决工作在后端。

为了能够更加快速的解决跨域带来的问题,下面对跨域进行详细介绍。

一、跨域是什么

跨域是浏览器加载了与当前域名、协议、端口不同另一站点下的资源,这与各大支持JavaScript的浏览器的同源策略是违背的。所谓同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。

比如说,下面的几个域名是同源的:

  1. http://example.com/
  2. http://example.com:80/
  3. http://example.com/path/file

它们都具有相同的协议、相同的域名、相同的端口(不指定端口默认80)。

而下面几个域名是不同源的:

  1. http://example.com/
  2. http://example.com:8080/
  3. http://www.example.com/
  4. https://example.com:80/
  5. https://example.com/
  6. http://example.org/
  7. http://ietf.org/

它们有不同的协议或不同的域名或不同的端口,要注意顶级域名和二级域名也是认为不同的域名。

二、解决跨域导致的问题

跨域并不会阻止请求的发出,也不会阻止请求的接受,跨域是浏览器为了保护当前页面,你的请求得到了响应,浏览器不会把响应的数据交给页面上的回调,取而代之的是去提示你这是一个跨域数据。提示就是一个报错提示,就像这样:

跨域报错截图

我们知道了浏览器是如何处理的了,才能对症下药来解决这个问题,下面介绍几种常用的跨域解决方法:

1、CORS,跨域资源共享

这是最靠谱也是非常科学的解决方案,通过上面的截图我们可以看到,它提示了一个:从某某位置请求的资源被阻挡了,因为没有在响应头里发现:"Access-Control-Allow-Origin"的响应头。看到这个错误,我们不得不百度一下,这个Access-Control-Allow-Origin是个何方神圣。

通过Access-Control-Allow-Origin响应头,就告诉了浏览器。如果请求我的资源的页面是我这个响应头里记录了的"源",则不要拦截此响应,允许数据通行。比如说下面示列了一个场景:

// 从 http://example.com 界面发出了一个请求到:http://example2.com,因为不同源,导致了跨域。
// 而 http://example2.com 返回了下面的响应头:
Content-Type: application/json;charset=utf-8
Content-Length: 3210
Server: apache
Access-Control-Allow-Origin: http://example.com

由于浏览器检测到 http://example2.com 的响应头中显示的写着:Access-Control-Allow-Origin: http://example.com,也就是,如果请求数据的源是 http://example.com 则可以允许访问返回的数据。这样浏览器就不会抛出错误提示,而是正确的将数据交给你的ajax回调。

在这个过程中跨域也存在,但跨域并没有导致问题了。因为后端的响应充分考虑到了某个页面源要使用这个资源,早就帮对方做好了跨域资源共享。这才可以顺利的进行对接。

所以,要最简单解决跨域导致的问题,只需要后端响应时,在响应头里指定允许调用资源的源就可以了。除了设定指定的源以外,你还可以直接写一个*号,这样就表示:此数据允许被任何其他的源进行获取。

现在,你了解了Access-Control-Allow-Origin,其实除了它,还有与之相关的更多字段,它们也起到了更多的个性定值效果。下面进行了详细介绍。

header头字段含义取值
Access-Control-Allow-Credentials响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以。true/false
Access-Control-Allow-Headers表示此次请求中可以使用那些header字段符合请求头规范的字符串
Access-Control-Allow-Methods表示此次请求中可以使用那些请求方法GET/POST(多个使用逗号隔开)
2、使用JSONP方案

当服务端没有返回Access-Control-Allow-Origin这样的字段时,是否就意味着不能使用此资源了吗?不!只能说不建议使用此资源了。但我们还有另一种办法,那就是通过JSONP。看到这个名字,似乎和json有关,说有也有,但也可以说没有,JSONP只是大多数甚至全部人们对这种解决办法的称呼。

为了更灵活的使用这中解决办法,就必须要先了解它的实现原理。我们知道,在页面内使用ajax加载别的域名下的数据时,是会被跨域阻止的。那有没有办法让我们的请求不通过页内的ajax,而是让浏览器直接走这个请求?

有!如果你足够细心,你会发现,<script>节点当有一个src值时,浏览器就会去加载这个js,然后并执行这个js文件,同样的,<img>也可以设置一个src,浏览器会加载这个图片并显示。那么,其中<script>节点在获取到js后还会执行,而我们的业务逻辑代码也是执行在相同的js环境下的。我们能不能想办法,让我们的请求不通过ajax,而是通过给body中追加一个<script>节点,这个节点的src值就是我们希望的要请求的目标接口,这样,服务器端返回的数据不就绕过这个跨域限制,将数据拿回来了。

是的,不过千万要注意,<script>要求你的返回内容必须是一段可以执行的js,因此你的返回数据就必须是一个可以执行的js语句,而不能是随便一个字符串。并且还要保证在执行js后我们要知道数据回来了。那么综合这些考虑,我们想到了一个解决方案:

我们先定义一个方法:

// 注意这是前端代码

var datasuccess = function (data) {
    // TODO
}

现在有了这个方法,我们将服务器返回的数据改成这种格式:

// 注意这是后端代码

response.getWrite().print("datasuccess({name: \"Jack\", age: 23});");

后端通过返回一段js,而这段js实际上就是在执行之前定义好了的datasuccess方法,并且在执行的时候,还把一些数据传入了进来。嘶~~,这是什么啊,这不就正好我们可以在datasuccess方法里面拿到返回的data数据吗,而且还是在正确的时机进行执行。这样,数据就名正言顺的被我们拿到了啊!

它之所以叫JSONP,可能就是因为几乎所有后端在写返回数据的时候都是将数据参数传入的一个json对象。其实你可以甚至可以定义多个参数,每个参数的意义用途你也可以自己设定。

现在来看看一个完整的jsonp方法来进行跨域解决的代码:

// 先定义要执行的方法。
var datasuccess =function(data) {
    console.log("数据已获取:", data);
}

// 然后构建一个script节点,
var scriptDom = document.createElement("script");
scriptDom.src = "http://example2.com/?k=jack";
// 将节点添加到body,浏览器就会立即开始请求。当请求顺利,就会执行 datasuccess 方法
// 在该方法里执行获取到请求数据的逻辑。

而通常我们的接搜数据的方法名称并不是一直不变的,而是每次一个新的,在script节点中还会把方法名称传上去,让服务端知道我们获取数据的方法名,从而顺利的完成调用。

尽管这个方法很好,但是它只能走GET的请求方法,因为每次script节点的请求只有GET请求嘛。所以我们使用JSONP的接口,就只有GET方式。

三、VUE提供的代理配置

如果你是VUE项目,那么你在开发时,通常会配置一个代理,来完成跨域问题的修复,似乎没有后端的事情,但当你正式上线你才知道,代理没效果了。是的。现在介绍一下这个代理干了一件什么事情。

当你在开发VUE项目时,就必然会开一个server去实时预览你的代码效果,这是毋庸置疑的。但你要注意,开了一个server,这个server能做到事情,可不就是单单给你提供预览这么简单。它还可以进行请求转发,实际上你配置的那些代理,是先会请求到你的server,你开的server检查到你对应的配置,再请求你配的目标地址。这之间发生了什么,实际上就是把你的实际请求转到了你开的server里面去请求了,这就不存在什么浏览器同源安全的支配了,当然也就没有了跨域问题。

而当你上线项目时,如果你的代理配置得不够优雅,或者不够标准,你要小心了,非常有可能你的请求就都会失败。最佳的跨域解决方案,无非就是后端协助一起解决,单方面可不能达到完美。

四、总结

解决方式还有更多各种各样的,但我认为最优雅的莫过于这两种,因此其他的解决方式可以暂时不提及,那些方法不仅增加了阅读复杂度还增加了维护成本不建议使用。无论是采用何种方式,我们都是要让后端修改代码,修改header或修改返回数据格式,都离不开后端的参与,所以遇到跨域问题,赶快找后端,一起解决这个问题。

计算机网络(五)什么是跨域问题(CORS)(Access-Control-Allow-Origin)(Access-Control-Allow-Credentials) 跨域是指浏览器在请求不同源(协议、域名或端口)的资源时遇到的限制,这是浏览器的内置安全机制。跨域问题通常发生在需要访问多个后端服务的场景中。为解决这一问题,W3C制定了CORS(跨源资源共享)协议,允许服务端通过特定的响应头字段(如Access-Control-Allow-Origin)来放行特定来源的请求。 CORS协议区分简单请求和非简单请求,简单请求自动携带Origin字段,非简单请求则先发送OPTIONS预检请求。服务端需正确设置Access-Control-Allow-Methods和Access 阅读详情

相关推荐

Springboot解决Access-Control-Allow-Origin跨域问题

最近在开发过程中遇到Access-Control-Allow-Origin这个问题,下面是个人网上搜罗的方法 文章目录前言一、添加配置文件二,创建文件1.创建CorsFilter类2.创建CorsConfig类 前言 这个方法适用于springboot 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加配置文件 springboot的配置文件里添加,允许同一个局域网下的人访问 #配置同一个局域网访问 server.address=0.0.0.0 二,创建文件 1.创建CorsFilter类 代

qq_42112979的博客 4811

跨域(Access-Control-Allow-Origin)解决方案详解

摘要: 浏览器的同源安全策略限制跨域访问,要求协议、域名和端口相同。跨域请求会被浏览器拦截,但服务器仍能正常响应。解决方案包括: CORS:通过设置响应头(如Access-Control-Allow-Origin)允许跨域访问,支持动态配置域名或使用通配符*(需注意安全性)。 SpringBoot配置:通过重写addCorsMappings方法全局设置跨域规则,或直接在接口中添加响应头。 Nginx代理:在反向代理中配置add_header实现跨域支持,适用于多域名场景。 这些方法灵活平衡安全性与跨域需求,

前G厂程序员/架构/产研经理,AI 进化派,一线 OPC 实践者。 持续分享编程、职场、AI、副业/创业干货~ 7万+

解决宝塔 Nginx 跨域问题Access-Control-Allow-Origin

先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。同源策略/SOP(Sameoriginpolicy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。a前端页面想调取b的接口,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。...

m0_67394360的博客 2715

使用Access-Control-Allow-Origin解决跨域问题

CORS 全称是"跨域资源共享"(Cross-origin resource sharing),解决跨域的方式很多,比如: 1.1前端JSONP 跨域原理: 通常为了减轻web服务器的负载,我们把js、css,img等静态资源分离到另一台独立域名的服务器上,在html页面中再通过相应的标签从不同域名下加载静态资源,而被浏览器允许,基于此原理,我们可以通过动态创建script,再请求一个带参...

hucbmz的博客 2428

Allow CORS: Access-Control-Allow-Origin插件安装与使用教程【Chrome插件小白式教程】

Allow CORS: Access-Control-Allow-Origin插件安装与使用教程【Chrome插件小白式教程】 文章目录插件介绍插件下载优快云论坛下载地址官方的下载地址ZIP包安装插件开关与使用测试是否开启成功注意点关闭插件卸载插件 插件介绍 解决Chrome浏览器跨域的问题,2021年1月14日,确保能用。 QQ群:819539788 插件下载 优快云论坛下载地址 官方的链接,可能会有朋友无法下载,别方,我准备了国内的下载地址: 关注微信公众号获取下载地址。 回复关键字:chrome

谙忆-陈浩翔 1万+

浏览器提示Access-Control-Allow-Origin 站点跨域请求资源问题解决

由于之前设计不完善,之前在做给项目增加一个gephi图功能的时候,构建图的json文件都放置在了项目中,随着数据更新,体积逐步增大,为服务器更新项目造成不必要的麻烦,今天抽出时间把问题来解决了一下。 在项目的ftp文件目录新建了一个位置存放json文件,利用nginx代理服务器取文件位置。 将代码改好之后调试发现问题,chrome控制台提示 Font from origin 'http:/...

马句 4888

Access-Control-Allow-Origin跨域问题的报错以及解决

Access-Control-Allow-Origin跨域问题的报错以及解决 这是浏览器控制台报错详情,在前后端分离,前段需要传数据进入后端时报的错 解决方案:配置跨域过滤器 1、先复制以下代码(过滤器)生成一个.java文件 package com.zking.ssh.base.util; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.se

m0_49359842的博客 2922

ROS1集群通信的可靠升级方案:为什么在无线环境下我选择了swarm_ros_bridge而非原生DDS

本文探讨了ROS1集群通信在无线环境下的可靠升级方案,重点分析了swarm_ros_bridge相较于原生DDS的优势。通过实际案例和性能对比,展示了ZeroMQ在无线通信中的稳定性和高效性,特别适合无人机编队和移动机器人集群等场景。

weixin_42567279的博客 386

使用Access-Control-Allow-Origin解决跨域

什么是跨域 当两个域具有相同的协议(如http/https),相同的端口(如80),相同的host( www.baidu.com),那么我们就可以认为它们是相同的域(协议,域名,端口都必须相同)。 跨域是指协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的。 解决方案 解决方案是很多的,如前端通过jsonp, window.name , location.hash, window.d...

qq_29055201的博客 2070

高速窄脉冲峰值保持设计

一、目的 在激光探测领域,探测器发出的高速窄脉冲,单片机AD进行采样,很难捕捉到窄脉冲的幅值,即使使用高速AD进行采样,也存在一定的难度。因此,本方案设计了一种高速窄脉冲峰值保持电路,有助于单片机AD采样能很好的捕捉到脉冲幅值。 二、方案分析与比较 峰值保持器一般分为两种:电压型和跨导型。 方案一:电压型峰值保持器,由电压型运放、二极管、保持电容、缓冲器组成,优点是元件成本低,缺点是峰值保持存在过...

weixin_43184208的博客 9292

gradle报错:A problem occurred configuring root project ‘My Application‘.

即使翻译了,我开始也看不懂,到处找网上教程,但都是改环境变量。马虎的我即使看了很多遍,改了很多遍也没反应过来,今天第一次搞gradle,突然就报错了,打印出。好了我就继续看项目了。

m0_59878789的博客 4091

Access-Control-Allow-Origin跨域问题,使用Nginx配置来解决

例如:A服务器是liunx系统部署了一个java程序,B服务器是本地服务器,A服务器需要请求访问B服务器的资源,可以用nginx代理来请求到B服务器的资源。链接: nginx步骤:下载完成后安装运行在A服务器上面,先运行看看有没有问题,这里不细说,然后找到开始配置nginx.conf文件(重点) 一、如何配置你的nginx.conf 添加一个server{},这是你的服务,listen参数是你要监听的端口,这个端口可以自定义,server_name localhost,这个一般就是A服务器的域名地址,记

wangzuao的博客 1万+

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 303

Spring Boot如何解决前端的Access-Control-Allow-Origin跨域问题

当我们在做前后端分离的开发时,提示Access-Control-Allow-Origin跨域问题,解决方案跟客户端没关系,修改的是服务端 一、在过滤器中设置响应头: @WebFilter(filterName = "CorsFilter ") public class CorsFilter implements Filter { @Override public void doFi...

京北游戏官方 2万+

PowerDesigner16.5下载和安装教程

一、软件下载 1.下载地址(不用复制,直接点击下载链接即可):链接:https://pan.baidu.com/s/1MSnWHWt3SO2Uz5dt9AANAg提取码:z9kk 二、软件安装 1.下载安装包(包含安装文件、汉化包、注册文件) 2.下载后文件内容如下 3....

cicong2374的博客 10万+

uniapp(微信小程序):实现PDF在线预览+在线预览pdf文件完整示例源码,支持文件来源:服务器pdf外链URL预览、调用后端API接口获取PDF文件流二进制下载及解析打开、上传本地PDF文件预览

uni-app实现PDF预览功能,uniapp微信小程序预览PDF,uniapp开发微信小程序在线预览pdf等文件,uniApp微信小程序实现PDF在线预览,Uniapp app在线预览pdf文件流,微信小程序实现pdf预览(苹果安卓兼容),uniapp-微信小程序 实现pdf外链在线预览,uniapp小程序如何做在线预览pdf功能,uniapp小程序端 实现pdf文件预览,微信小程序(uniapp)PDF预览完整实现方案示例demo源码,uni-app预览PDF,小程序pdf预览插件插件,Uniapp微信

✅ 精选推荐文章 4704

Nginx解决Access-Control-Allow-Origin跨域问题完全指南

以上就是今天要讲的内容,本文仅仅简单介绍了用nginx来解决Access-Control-Allow-Origin跨域问题;

m0_67392010的博客 7170

为YOLOv11引入自适应特征融合模块(ASFF)

本文探讨了在YOLOv11中引入ASFF(自适应空间特征融合)模块以解决多尺度目标检测性能不均衡的问题。作者分析了传统FPN固定融合策略的缺陷,详细介绍了ASFF模块的实现原理,包括动态权重生成网络设计和特征融合机制。通过将ASFF集成到YOLOv11颈部网络,实现了特征在双向流动时的自适应融合,在复杂场景下mAP提升1.2%而推理时间仅增加3-5ms。文章还分享了训练调参技巧和部署注意事项,指出ASFF特别适合交通监控等目标尺度变化大的场景,但强调需根据实际需求平衡模型复杂度与性能。最后提供了工程实践建议

as1225120794的博客 320

【JavaWeb】HTML5中Access-Control-Allow-Origin解决跨域问题

Access-Control-Allow-Origin解决跨域问题,是html5新增的一项标准功能,因此 IE10以下 版本的浏览器是不支持 的,因此,如果要求兼容IE9或更低版本的ie浏览器,会导致使用此种方式的跨域请求以及传递Cookie的计划夭折,最终还得回归JSONP(目前主流的处理方式是使用JSONP,易于实现,兼容性好,可查的资料也很多。之所以会有跨域问题,实则是因为www.abc.com其实同A.abc.com一样,也是一个二级域名,而非一级域名(一级域名是http://abc.com)

精益求精 2050

用一组可复现实验讲清 ABAP 内表 Standard / Sorted / Hashed 的性能差异

摘要(150字): SAP项目中性能问题常源于ABAP内表选型不当。标准表(STANDARD TABLE)写入快但查找慢(线性扫描),适合遍历场景;排序表(SORTED TABLE)保持有序,支持二分查找,适合范围查询;哈希表(HASHED TABLE)基于唯一键实现常数级查找,适合高频精确匹配。实验表明:标准表+BINARY SEARCH需预排序,成本可能高于直接使用排序表;哈希表在键匹配时性能最优。Gateway和RAP场景中,内表选型直接影响接口响应,建议根据读写负载(追加/遍历/精确查找)选择对应类

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 202

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 解决layui的table组件更新数据后每行toolbar工具栏不更新的问题
下一篇: 解决layui的table组件data-content未转义导致的注入问题。
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值