仅需5行代码!Go语言快速解决跨域问题的3种优雅写法

第一章:Go 跨域问题的本质与影响

跨域问题源于浏览器的同源策略(Same-Origin Policy),该策略限制了不同源之间的资源请求,以保障用户信息安全。当使用 Go 编写的后端服务被前端应用(如 React、Vue)通过 AJAX 或 Fetch 请求调用时,若前后端部署在不同的域名、端口或协议下,浏览器将触发预检请求(Preflight Request),并可能因缺少必要的 CORS 响应头而拒绝响应数据。

跨域请求的触发条件

以下情况会触发跨域机制:
  • 前端与后端的协议不同(如 http 与 https)
  • 域名不一致(如 api.example.com 与 app.example.com)
  • 端口号不同(如 :8080 与 :3000)

Go 中处理跨域的基本方式

在 Go 的 net/http 包中,可通过中间件设置 CORS 相关响应头,允许指定来源访问资源。例如:
// CORS 中间件示例
func corsMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*") // 允许所有源,生产环境应具体指定
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
        
        if r.Method == "OPTIONS" {
            w.WriteHeader(http.StatusOK)
            return
        }
        next.ServeHTTP(w, r)
    })
}
上述代码通过拦截请求,在响应头中添加 CORS 所需字段。对于 OPTIONS 预检请求直接返回成功状态,避免中断正常请求流程。

CORS 关键响应头说明

响应头名称作用
Access-Control-Allow-Origin指定允许访问资源的源
Access-Control-Allow-Methods允许的 HTTP 方法
Access-Control-Allow-Headers允许携带的请求头字段
不当配置可能导致安全漏洞或接口无法访问,因此建议在生产环境中精确控制允许的源和方法。

第二章:CORS 基础理论与 Go 实现方案

2.1 CORS 同源策略与预检请求机制解析

浏览器的同源策略(Same-Origin Policy)限制了不同源之间的资源访问,CORS(跨域资源共享)通过 HTTP 头信息实现安全的跨域通信。当发起跨域请求时,若为简单请求(如 GET、POST 且 Content-Type 为 text/plain 等),浏览器直接发送请求;否则需先执行预检请求(Preflight Request)。
预检请求触发条件
以下情况会触发 OPTIONS 方法的预检请求:
  • 使用了自定义请求头字段(如 X-Auth-Token)
  • Content-Type 值为 application/json、multipart/form-data 等非简单类型
  • 请求方法为 PUT、DELETE 等非简单方法
典型预检请求流程
OPTIONS /api/data HTTP/1.1
Host: api.example.com
Origin: https://myapp.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Auth-Token
服务器响应后,若包含有效的 CORS 头,浏览器才允许继续实际请求。
响应头作用
Access-Control-Allow-Origin指定允许的源
Access-Control-Allow-Methods允许的HTTP方法
Access-Control-Allow-Headers允许的自定义头字段

2.2 使用 net/http 自定义跨域中间件

在 Go 的 net/http 包中,可通过编写中间件函数灵活控制跨域请求行为。通过拦截请求并设置适当的响应头,实现自定义 CORS 策略。
中间件基本结构
中间件本质上是一个包装函数,接收 http.Handler 并返回新的处理器。
func CORSMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "*")
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
        
        if r.Method == "OPTIONS" {
            w.WriteHeader(http.StatusOK)
            return
        }
        
        next.ServeHTTP(w, r)
    })
}
上述代码中: - Access-Control-Allow-Origin: * 允许所有来源访问; - Access-Control-Allow-Methods 定义支持的 HTTP 方法; - 预检请求(OPTIONS)直接返回 200 状态码,避免中断后续请求。
集成到服务
使用该中间件时,只需将路由处理器包裹其中:
  1. 创建路由处理器;
  2. 用 CORSMiddleware 包装;
  3. 注册到 HTTP 服务器。

2.3 处理简单请求与复杂请求的差异化逻辑

在Web开发中,浏览器根据请求类型自动区分“简单请求”和“复杂请求”,并应用不同的CORS处理机制。
简单请求的判定条件
满足以下所有条件的请求被视为简单请求:
  • 使用GET、POST或HEAD方法
  • 仅包含标准CORS安全首部(如Accept、Content-Type等)
  • Content-Type限于text/plain、multipart/form-data或application/x-www-form-urlencoded
复杂请求的预检流程
当请求不符合简单请求条件时,浏览器会先发送OPTIONS预检请求:
OPTIONS /api/data HTTP/1.1
Host: example.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header
Origin: https://myapp.com
服务器需响应允许的方法与头部:
HTTP/1.1 200 OK
Access-Control-Allow-Origin: https://myapp.com
Access-Control-Allow-Methods: PUT, DELETE
Access-Control-Allow-Headers: X-Custom-Header
该机制确保了跨域操作的安全性与可控性。

2.4 配置 Access-Control-Allow-Headers 支持自定义头

在跨域请求中,浏览器会预检(preflight)携带自定义请求头的请求。服务器需通过 Access-Control-Allow-Headers 明确允许这些头部字段,否则请求将被拦截。
常见自定义头部示例
  • X-Auth-Token:用于传递认证令牌
  • X-Request-ID:请求追踪标识
  • Content-Type: application/json:需显式授权时
服务端配置示例(Node.js/Express)
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', 'https://example.com');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'X-Auth-Token, X-Request-ID, Content-Type');
  if (req.method === 'OPTIONS') return res.sendStatus(200);
  next();
});
上述代码中,Access-Control-Allow-Headers 指定允许的请求头,多个字段以逗号分隔。当浏览器发起 OPTIONS 预检请求时,服务器返回成功状态,后续实际请求方可继续执行。

2.5 允许凭证传递:withCredentials 的安全实践

在跨域请求中,涉及用户身份认证的场景需要传递 Cookie 或 HTTP 认证信息。此时,必须启用 `withCredentials` 属性以允许浏览器携带凭证。
基本用法与配置
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://api.example.com/user');
xhr.withCredentials = true;
xhr.send();
该代码配置了跨域请求携带凭证。`withCredentials = true` 表示请求包含 Cookie、Authorization 头等敏感信息。若未设置,即使服务器允许,浏览器也不会发送凭证。
服务端配合要求
  • 响应头必须包含 Access-Control-Allow-Origin,且不能为 *,需明确指定源
  • 需设置 Access-Control-Allow-Credentials: true
安全建议
仅在必要时启用 withCredentials,避免在不受信任的第三方请求中使用,防止 CSRF 和凭证泄露风险。

第三章:第三方库高效解决跨域

3.1 使用 gorilla/handlers/cors 快速集成

在 Go 语言开发中,处理跨域请求(CORS)是构建 Web API 的常见需求。`gorilla/handlers/cors` 提供了简洁而强大的中间件支持,可快速配置跨域策略。
安装与引入
首先通过以下命令安装依赖:
go get github.com/gorilla/handlers
该包提供了标准的 HTTP 中间件函数,便于集成到 `net/http` 或 `gorilla/mux` 路由器中。
基本配置示例
import "github.com/gorilla/handlers"
import "net/http"

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/api", someHandler)

    corsHandler := handlers.CORS(
        handlers.AllowedOrigins([]string{"https://example.com"}),
        handlers.AllowedMethods([]string{"GET", "POST", "PUT"}),
        handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type"}),
    )(mux)

    http.ListenAndServe(":8080", corsHandler)
}
上述代码中,`handlers.CORS` 接收多个选项参数: - `AllowedOrigins` 定义合法来源域名; - `AllowedMethods` 指定允许的 HTTP 方法; - `AllowedHeaders` 设置客户端可发送的自定义请求头。 此方式以声明式语法实现安全且灵活的跨域控制,适用于大多数生产环境场景。

3.2 gin 框架中通过 cors 中间件优雅配置

在构建现代 Web 应用时,跨域资源共享(CORS)是前后端分离架构中不可避免的问题。Gin 框架通过第三方中间件 `gin-contrib/cors` 提供了灵活且优雅的解决方案。
安装与引入中间件
首先需安装 cors 扩展包:
go get github.com/gin-contrib/cors
该命令将下载 Gin 官方维护的 CORS 中间件支持库。
基础配置示例
router := gin.Default()
router.Use(cors.New(cors.Config{
    AllowOrigins: []string{"http://localhost:3000"},
    AllowMethods: []string{"GET", "POST", "PUT", "DELETE"},
    AllowHeaders: []string{"Origin", "Content-Type"},
}))
上述代码配置了允许的源、HTTP 方法和请求头字段,有效控制跨域访问权限。
常用配置参数说明
参数作用
AllowOrigins指定可接受的来源域名
AllowMethods限制允许的 HTTP 动作
AllowHeaders定义客户端可发送的自定义头

3.3 echo 框架的 CORS 集成与自定义规则

在构建现代 Web 应用时,跨域资源共享(CORS)是前后端分离架构中不可或缺的一环。Echo 框架通过内置中间件提供了灵活的 CORS 配置能力。
启用默认 CORS 策略
使用 `echo.WrapMiddleware` 可快速集成标准 CORS 行为:
e.Use(middleware.CORS())
该配置允许所有域名、方法和头部访问,适用于开发环境快速调试。
自定义 CORS 规则
生产环境中需精细化控制跨域行为:
e.Use(middleware.CORSWithConfig(middleware.CORSConfig{
    AllowOrigins: []string{"https://trusted-site.com"},
    AllowMethods: []string{"GET", "POST", "PUT"},
    AllowHeaders: []string{"Content-Type", "Authorization"},
}))
上述代码限制仅来自指定域名的请求,并明确授权特定 HTTP 方法与请求头,提升应用安全性。
  • AllowOrigins:指定可接受的源列表
  • AllowMethods:定义允许的 HTTP 动作
  • AllowHeaders:声明客户端可发送的自定义头字段

第四章:生产环境中的跨域安全控制

4.1 白名单机制限制可信来源域名

在现代Web安全架构中,白名单机制是控制资源访问权限的核心策略之一。通过仅允许预定义的可信域名发起请求,有效防止跨站请求伪造(CSRF)和恶意数据注入。
配置示例

const whitelist = [
  'https://trusted-site.com',
  'https://api.partner.org'
];

function verifyOrigin(req, res, next) {
  const origin = req.headers.origin;
  if (whitelist.includes(origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
    next();
  } else {
    res.status(403).send('Forbidden: Origin not allowed');
  }
}
该中间件检查请求头中的 Origin 字段,匹配白名单后才放行。关键参数 origin 必须完整匹配,避免使用模糊匹配导致绕过风险。
管理建议
  • 定期审计白名单域名的有效性
  • 结合TLS证书验证增强身份认证
  • 日志记录所有非白名单访问尝试

4.2 动态 Origin 校验防止反射攻击

在跨域资源共享(CORS)机制中,静态的 Origin 白名单易被绕过,攻击者可通过伪造请求头实施反射型 XSS 攻击。为提升安全性,应采用动态 Origin 校验策略。
校验逻辑实现
通过中间件动态比对请求 Origin 是否属于预设可信源:
// Go 语言示例:动态 Origin 校验中间件
func CORSMiddleware(allowedOrigins map[string]bool) gin.HandlerFunc {
    return func(c *gin.Context) {
        origin := c.Request.Header.Get("Origin")
        if allowedOrigins[origin] {
            c.Header("Access-Control-Allow-Origin", origin)
            c.Header("Vary", "Origin")
        }
        c.Next()
    }
}
上述代码中,allowedOrigins 为运行时可更新的可信源集合,避免硬编码。每次请求动态判断,并设置 Vary: Origin 防止缓存污染。
安全增强措施
  • 禁止使用通配符 * 与凭证模式共存
  • 对敏感接口启用预检请求(Preflight)严格校验
  • 记录非法 Origin 请求行为用于审计

4.3 缓存预检请求提升接口性能

在现代Web应用中,跨域请求(CORS)的频繁预检(Preflight)会显著增加接口延迟。浏览器对携带自定义头或非简单方法的请求会先发送OPTIONS预检请求,验证服务器权限。
预检请求的优化策略
通过缓存预检响应,可避免重复请求。使用Access-Control-Max-Age头部指定缓存时长,使浏览器在有效期内复用结果。
Access-Control-Max-Age: 86400
该配置将预检结果缓存24小时,减少不必要的OPTIONS请求。
实际效果对比
场景预检次数平均延迟
未缓存每次请求120ms
缓存24小时首次20ms
合理设置缓存时间可在安全与性能间取得平衡,显著提升接口响应效率。

4.4 结合 JWT 鉴权实现安全的跨域访问

在现代前后端分离架构中,跨域请求与身份鉴权是核心安全议题。JWT(JSON Web Token)因其无状态性和自包含特性,成为解决此类问题的优选方案。
JWT 工作流程
用户登录后,服务端生成包含用户信息、过期时间及签名的 JWT,前端将其存储于 localStorage 或 Cookie,并在后续请求的 Authorization 头中携带:
Authorization: Bearer <token>
服务端通过验证签名和有效期来确认请求合法性。
CORS 与 JWT 协同配置
为确保跨域请求携带凭证,需设置 CORS 响应头:
r.Use(cors.New(cors.Config{
    AllowOrigins: []string{"https://example.com"},
    AllowMethods: []string{"GET", "POST"},
    AllowHeaders: []string{"Origin", "Content-Type", "Authorization"},
    ExposeHeaders: []string{"Content-Length"},
    AllowCredentials: true,
}))
该配置允许指定源携带认证信息进行跨域请求,AllowCredentials 必须为 true 才能传递凭证。
安全性增强建议
  • 使用 HTTPS 传输以防止中间人攻击
  • 设置合理的 token 过期时间
  • 对敏感操作实施二次验证

第五章:总结与最佳实践建议

性能监控与调优策略
在高并发系统中,持续的性能监控是保障稳定性的关键。建议集成 Prometheus 与 Grafana 构建可视化监控体系,实时追踪服务响应时间、GC 频率和内存使用情况。
  • 定期执行压力测试,识别瓶颈点
  • 设置告警阈值,如 CPU 使用率超过 80% 持续 5 分钟触发通知
  • 利用 pprof 工具分析 Go 服务运行时性能
代码健壮性增强
生产环境中的异常处理不容忽视。以下是一个带有上下文超时控制的 HTTP 请求示例:

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    log.Printf("请求失败: %v", err) // 记录错误上下文
    return
}
defer resp.Body.Close()
配置管理最佳实践
避免将配置硬编码在源码中。推荐使用环境变量或集中式配置中心(如 Consul)进行管理。以下是常见配置项的结构化表示:
配置项推荐值说明
DB_MAX_IDLE_CONNS10数据库空闲连接数
HTTP_TIMEOUT_MS3000外部调用超时时间
LOG_LEVELinfo生产环境避免使用 debug 级别
安全加固措施
确保所有对外暴露的服务均启用 TLS,并校验输入参数。部署 WAF 可有效防御 SQL 注入与 XSS 攻击。同时,定期更新依赖库以修复已知漏洞。
Go语言的语法糖 Go语言(又称Golang)是谷歌于2007年开始开发的一种编程语言,旨在解决大规模软件工程中的效率和可维护性问题。Go语言的设计理念包括简洁性、高效性和并发性,尤其适合用于云计算、网络服务等领域。Go的语法相对简单,学习门槛低,同时通过丰富的标准库和工具链,极大地提高了开发效率。Go语言通过多种语法糖特性极大地简化了开发者的编程体验。无论是简化变量声明、支持多返回值、延迟执行,还是通过结构体和接口实现面向对象的编程,或是引入泛型的灵活性,这些特性都让我们在编码过程中更加高效和舒适。 阅读详情

相关推荐

golang实现跨域访问的方法

主要介绍了golang实现跨域访问的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

golang解决跨域问题

今天中午在部署golang与vue搭建的一个项目时,因为将项目部署到了云端的Docker容器内,期间涉及到了一些跨域问题,本以为在后端配置一下跨域即可,没想到最后是因为非简单请求跨域的规范导致出错,本文章会介绍跨域的基础概念,解决跨域的方法都有什么,golang如何解决跨域问题,简单与非简单请求的基本概念及规定。

一个非常Cool的人 5436

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

Go处理跨域问题

使用core解决Go中的跨域问题

paterl的博客 1207

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

第三课 NXP S32K144 MCAL 集成到Vector davinci SIP-第一弹

将NXP S32K144 MCAL 集成到Vector davinci SIP的第三方库,导出ARXMl给Vector davinci SIP使用

candleer的博客 5857

Golang——通过实例了解并解决CORS跨域问题

通过一个基于简单易懂的例子,了解前后端交互时出现的CORS跨域问题,包括跨域问题出现的原因、前后端两种解决方法!!! 例子技术栈: 后端使用:golang net/http 前端使用:js express http-proxy-middleware

脑袋装水的博客 2116

树莓派驱动步进电机

步进电机一般由电机、驱动器构成,树莓派连接驱动器控制电机。 一、接线 DIR+/- 用于控制方向,PUL+/- 用于控制转动; 正极DIR+ 和 PUL+ 接到GPIO口,两个负极接到GPIO口或地线均可,控制的时候不使用。 实验中,DIR+ 接35口,PUL+ 接38口。 树莓派4B GPIO口如图所示 远离树莓派USB的一侧 是 1、2、3号口 二、驱动 DIR控制方向,使用高电平或低电平控制; PUL控制转动,使用脉冲驱动。 三、代码 import RPi.GPI.

weixin_42337765的博客 1万+

解决 go 接口跨域

type Options struct { Origin string } // 定义全局的CORS中间件 func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") //请求头部 if origin != "" { //接收客户端发送.

Half of if的博客 2229

保姆级教程:在ROS Noetic下,手把手教你将自定义A*全局规划器打包成插件(附避坑指南)

本文提供了一份详细的ROS Noetic下自定义A*全局规划器插件开发指南,涵盖从环境准备、算法优化到插件配置与调试的全流程。通过实战案例和避坑技巧,帮助开发者高效实现机器人导航中的全局路径规划,特别适合需要优化ROS导航栈的开发者。

weixin_29168675的博客 285

Nginx健康检查实战:如何用第三方模块提升服务可用性(附详细配置)

本文深入探讨了如何通过集成第三方健康检查模块来提升Nginx的服务可用性。文章对比了Nginx默认被动检查的局限性,并详细介绍了主动健康检查的核心优势、主流模块选型,以及以nginx_upstream_check_module为例的实战部署与配置指南,帮助运维人员构建更可靠的负载均衡架构。

weixin_28331555的博客 308

前端vue后端go如何进行跨域设置?一篇就通透理解

前端使用vue怎么设置跨域,后端使用go怎么设置跨域

m0_70208894的博客 2273

Python 爬虫实战:医学临床指南爬取(含 PDF 解析与结构化存储)

在当今数字化时代,医学临床指南作为医生进行科学诊疗的重要参考资料,包含大量经过临床验证的诊疗路径和建议。这些指南通常发布在权威医学网站上,数量庞大且更新频繁。如何自动化地抓取并存储这些指南,成为医疗数据分析、医学研究以及医疗 AI 模型训练等工作的关键第一步。本文将系统讲解如何利用 Python 爬虫技术从权威医学网站爬取临床指南内容,并实现 PDF 解析与结构化存储。

u014481728的博客 450

littleboss快速上手:5行代码让Go程序具备进程自监督能力(附完整示例)

littleboss(supervisor construction kit)是面向 Go 程序的自监督(进程监督者)工具包,只需几行代码就能让任意 Go 二进制具备进程自监督能力:它把自己启动为子进程,监控生命周期,崩溃后自动拉起,并支持零停机热重载而不丢失任何连接。✅ ## littleboss 是什么:Go 程序自监督的轻量方案 一句话概括:**把程序变成自监督二进制(self-supe

gitblog_00018的博客 1074

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2094

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Go语言的全栈开发

Go语言是由Google在2007年开发的开源编程语言,旨在解决大型系统开发中的一些不足,尤其是在并发处理和编译速度方面。Go语言的语法简洁,内置了强大的并发支持,程序员可以很方便地利用goroutine来处理并发任务。此外,Go语言还拥有丰富的标准库和良好的工具链,进一步提升了开发效率。Go语言作为一种现代编程语言,凭借其高效的并发处理能力和简洁的语法,成为全栈开发中不可或缺的工具之一。通过将Go语言的后端技术和现代前端框架结合,开发者能够构建出高效、易于维护的全栈应用。

2501_91185975的博客 1180

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Golang语言社区——为什么说未来 5 年将是 Go 语言的天下?

不吹不捧,也不想挑起语言争论的说,如果你是一名后端工程师,那我建议你一定要深入学习下 Go 语言。因为,在未来几年内,Go 语言的市场份额会越来越大,它的前途无可限量。为什么能有这样的判...

QQ1528884535的专栏 4173

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

学习 Go 语言,有哪些优质的开源项目?

必须推荐这18个golang开源项目,从新手到进阶该有的都有!!!

云原生之家 1万+

Go语言和Java、python等其他语言的对比分析

一、Go语言设计初衷 1、设计Go语言是为了解决当时Google开发遇到的问题: 大量的C++代码,同时又引入了Java和Python 成千上万的工程师 数以万计行的代码 分布式的编译系统 数百万的服务器 2、Google开发中的痛点: 编译慢 失控的依赖 每个工程师只是用了一个语言里面的一部分 程序难以维护(可读性差、文档不清晰等) 更新的花费越来越长 交叉编译困难 3、如何解决当前的问...

qfliweimin的博客 4万+

retry-go 快速入门:5分钟学会在 Go 项目中实现优雅重试

在网络请求、数据库操作等场景中,临时性错误是不可避免的。retry-go 是一个简单而强大的 Go 语言重试库,能够帮助开发者轻松实现优雅的重试机制,提升应用的稳定性和容错能力。💪 ## 为什么选择 retry-go? retry-go 提供了极其简洁的 API 设计,让重试逻辑变得直观易懂。相比其他复杂的重试库,它只需要几行代码就能实现完整的重试策略。 **核心优势:** - 🚀 简单

gitblog_00329的博客 905

如何快速上手go-workers:5分钟搭建Golang后台任务系统

go-workers是一个功能强大的Golang后台任务处理库,它提供了与Sidekiq兼容的可靠队列系统。这个终极指南将教你如何在5分钟内快速搭建一个高效的后台任务处理系统,让你的Go应用获得完整的异步处理能力。 ## 🚀 为什么选择go-workers后台任务系统? go-workers是一个专为Go语言设计的Sidekiq兼容后台任务处理库。它提供了可靠的消息队列、自动重试机制和灵活的

gitblog_01079的博客 1108

如何用raylib-go快速制作5个经典小游戏:Go语言游戏开发终极指南

raylib-go游戏开发正在成为Go语言开发者进入游戏编程世界的最佳入口。如果你正在寻找一个简单易用、功能强大的Go语言游戏开发库,那么raylib-go绝对是你的首选。这个库将C语言编写的raylib游戏库完美移植到Go语言环境,让Go开发者也能轻松享受游戏开发的乐趣。无论你是游戏开发新手,还是想尝试用Go语言制作小游戏的开发者,这篇raylib-go实战教程都将为你提供完整的入门指南。 #

gitblog_00759的博客 963

Golang基本语法看这一篇就够了(Go语言)

go语言基础语法笔记

怪力乌龟的博客 1192

10 款优雅的 Go 语言开发工具

以下内容来自公众号逆锋起笔,关注每日干货及时送达jaxenter 从 GitHub 上精选了一些最好 Golang 工具,希望可以为喜欢用Go编程的开发者提供帮助,一起来看一下都有哪些工具...

code小生 6260

ADK-Go:Golang开发AI Agent

ADK-Go:Golang开发AI Agent

猛犸象 1695

从阻塞到异步:Go语言优雅集成RabbitMQ的实战指南

Go语言(The Go programming language)凭借其简洁高效的并发模型,成为构建高性能消息系统的理想选择。本文将带你探索如何在Go项目中从零开始集成RabbitMQ,通过实战案例掌握从基础阻塞调用到高级异步处理的全流程,让你的消息通信架构更具弹性与可扩展性。 ## 一、环境准备:快速搭建Go与RabbitMQ开发环境 ### 1.1 安装Go语言环境 确保你的开发环境已安装

gitblog_00928的博客 476
上一篇: 从入门到上线:Go实现WebSocket服务的10个不可跳过的阶段
下一篇: 表单校验总出错?Go开发者必须掌握的10种防御性编程技巧
CompiShoal
博客等级 码龄1年 130粉丝 1955原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值