最熟悉的陌生人:5分钟快速理解 HTTP2

BBR算法实现服务器加速 DO搭建专属服务器:http://blog.youkuaiyun.com/cracked_hitter/article/details/54456691 BBR算法实现服务器加速请参考:http://blog.youkuaiyun.com/cracked_hitter/article/details/79119745 空闲硬盘资源建立私有网盘参考:http://blog.youkuaiyun.com/cracke 阅读详情

最熟悉的陌生人系列,将带你快速理解熟悉的名词如:HTTP2、HTTP3、IPV6、BBR等。

通读 90 年代上下的论文,你会发现,在已经基本建成的计算机科学大厦中,后辈码农只要做一些零星的修补工作就行了。

在计算机科学晴朗天空的远处,还有几朵令人不安的小小乌云。

——皓尼・郝里斯(HioHio)

而其中一朵小小乌云,就是前辈的协议制定实现得太牢靠了,就算有着诸多不足,还是用的好好的,让后辈没什么动力去创新替换。。

HTTP 的不足

在阅读此章时,读者可以给自己一个思考时间,锻炼设计与思考能力—— 目前在用的 HTTP 协议,你认为有哪些不足呢?你可以重新设计一个替代它并且尽可能兼容的协议,你会怎么做呢?

可尝试自己写下设计,定会受益甚多。

TCP连接数过多

HTTP1.0 只允许一条 tcp 链接上处理一个 request,尽管后来的 HTTP1.1(现在常用的版本)允许 pipelining, 管道,通过这个管道,浏览器的多个请求可以同时发到服务器,但是服务器的响应只能够一个接着一个的返回 (但各大浏览器有些不支持 / 默认关闭,因此这功能可以说是鸡肋)。

HTTP 头部过多重复

Host、Accept-Encoding、Connection、origin、content-type 等等一堆头部,都在不同的请求中重复出现。

除了浪费大量流量,还会导致 TCP 的初始拥塞窗口(initcwnd)快速满了,当多个请求准备在同一个tcp 连接上发送时,会导致大量延迟——当 initcwnd >= ssthresh(slow start threshold) 时,tcp就会进入 “拥塞避免算法”,把发送的速度调慢,避免增长过快导致网络拥塞,慢慢的增加调整到网络的最佳值。

当然初始拥塞窗口(initcwnd)也不能调太大来避免。

If the initcwnd values is large, then there will be fewer RTTs required to download the same file. But we cannot set initcwnd to a huge value as the network environment and the routers also has the limitation of having limited buffers. If exceedingly large values are set, it may lead to router buffer overflows, packet loss, packet re-transmissions. So, we need to set an optimal value for the initcwnd which is directly proportional to the network bandwidth.

使用文本协议

文本协议尽管带来了可读性以及方便程序员 debug,但这是高性能网络程序要竭力避免的——君不见每个公司内部都要搞一个自己的二进制协议吗?二进制,每个在网络上交流的 bit 的意义都被发挥得淋漓尽致。

而说到 可读与debug 的问题,自然浏览器(客户端),服务器(框架)可以帮你解决,套上一层中间层就好。

HTTP2 概览

HTTP2, 为解决以上问题而生。

•允许多个 request/response在同一个 tcp 链接上发送•高效压缩头部(http header)•二进制协议,真正的多路复用•还有自己的流量控制,保证各个 stream不被互相干扰;•支持请求分优先级发送,优先级越高如核心 css、html,优先发给客户端•支持服务器预测并推送客户端可能需要的资源,让客户端先做缓存(server push),榨干服务器•兼容 HTTP1.1 的语义,尽可能一致。

兼容 HTTP1.1

其实平常我们在用的网站都支持 HTTP2 了,如

•国外的 google.com、tour.golang.org、facebook.com、stackoverflow.com 、shopee.sg•国内的 zhihu.com(点赞)、v2ex.com、vgtime.com(我擦,这个做的UI看起来有点渣的游戏资讯网站竟然支持你敢信,人家gcores 都不支持)、youku.com

而想找一些不支持的,找一些小型网站就好,如 yonghaowu.github.io、gcores.com,douban.com、bilibili.com/,还有臭名昭著的 baidu.com

当然,这里说不支持时,只是说这个域名不支持,他可能 api 是用另外的域名然后是支持的。

升级 HTTP2

兼容,或者说客户端要求升级到 HTTP2,主要有两种方法:

•客户端的 HTTP header 的 Upgrade 指定 h2c(HTTP/2 ClearText)

•如你所知,Connection: Upgrade 与 Upgrade: websocket,Websocket 就是这样子变换协议的;

•ALPN(Application Layer Protocol Negotiation,应用层协议协商), TLS 的扩展功能

•客户端在建立 TLS 连接的 Client Hello 握手中,通过 ALPN 扩展列出了自己支持的各种应用层协议•如果服务端支持 HTTP/2,在 Server Hello 中指定 ALPN 的结果为 h2 就可以了•如果服务端不支持 HTTP/2,从客户端的 ALPN 列表中选一个自己支持的即可

而一般你看现在的网站请求,都用第二种方式了,因为第一种方式服务端接收到后还需要返回 101状态码 Switching Protocols 告知客户端,客户端再发送 http2 的数据。

HTTP2 的 帧(frame)

HTTP2中二进制协议的基本单元叫 frame(帧),不同frame 有不同作用,如:

•SETTING 帧:建立连接时,向对方传达一些配置信息如是否开启 server push 功能、最大帧 size等等(牢记,下文不累述此);•HEADERS 帧:发送 http 的 request 或者response的头部;•CONTINUATION 帧:headers 要跨越多个帧,用此来指示头部上一个 HEADERS;本质就是 HEADERS 帧,但是为了轻松处理,就用明确的类型来区分这种情况;•DATA 帧:发送body数据用;•PUSH_PROMISE 帧:用来告知对端初始化哪些数据,就是以上说到的 server push 功能•WINDOW_UPDATE 帧:用来做流量控制

等。

帧的格式如下,熟悉二进制协议的你对此想必很清晰:

+-----------------------------------------------+|                 Length (24)                   |+---------------+---------------+---------------+|   Type (8)    |   Flags (8)   |+-+-------------+---------------+-------------------------------+|R|                 Stream Identifier (31)                      |+=+=============================================================+|                   Frame Payload (0...)                      ...+---------------------------------------------------------------+

•length: frame payload 的长度;•type:frame 的类型;•flag:保留给 frame 的类型使用;•R:保留的一个 bit,没有任何作用;•Stream Identifier:unsigned 31 位整数 id,用来区分 stream;•Frame Payload: frame 携带的可变长数据,可为空;

以上 6 种东西,Frame Payload 可以没有,但是其他必须有。

所以所有 frame 必定会有至少 24 + 8 + 8 + 1 + 31 + (0…) = 72 位的数据。

一个经典的 http 请求在 http2 中对应如下,可以看到 HEADERS 跟 DATA 两个 frame:

值得注意的是,当 data 过大的时候,http2 的 rfc 没有规定 data frame 应该拆分与否(翻了一大堆资料都没有找到)。

然而去用一些工具如nghttp去看详细过程,可看到 data frame 都是拆开一个个的,原因就是为了多路复用。这

$ nghttp -v -n --no-dep -w 14 -a https://www.vgtime.com

  [  0.063] recv (stream_id=9) eagleid: 2ff6019a15691588216324974e  [  0.063] recv (stream_id=9) content-encoding: gzip  [  0.063] recv HEADERS frame <length=188, flags=0x04, stream_id=9>            ; END_HEADERS            (padlen=0)            ; First response header  [  0.063] recv DATA frame <length=8192, flags=0x00, stream_id=9>  [  0.063] recv DATA frame <length=464, flags=0x00, stream_id=9>  [  0.063] recv DATA frame <length=2510, flags=0x00, stream_id=9>  [  0.063] recv DATA frame <length=10, flags=0x01, stream_id=9>            ; END_STREAM

所以一个大的请求如下图,常见的帧就是每一个 Frame Header 接一个 Frame Body。

帧的大小范围规定为 2的14次方 (16,384) 到 2的24次方-1 (16,777,215) 字节,也就是大概 16KB 到 16MB。

但若双方没有协议,一般默认为 16Kb,假如 HEADERS 帧不够装完头部时,就用第二个 CONTINUATION 帧来装,

所以你看到可以有多个 CONTINUATETION 帧下有省略号,因为可以有多个。

流(stream)

流在HTTP2 一条连接中,在客户端与服务端之间,双向交换帧(frame)。

简单说,客户端与服务端之间相互发送的帧,都通过一个个独立流来传输,多个流可以在同一http2 连接中并发,而每个流都有一个 ID(Stream Identifier),frame 就是通过此来识别流。

流你可以理解为一个抽象概念,就是为了区分不同的请求,用于多路复用。

流的状态机如下:

我们常见的 HTTP 请求就是走黄色的线:

idle 状态 -> 发送 HEADER 帧后变成 OPEN -> 发送完数据后发送 END_STREAM 代表发完 -> 变成 half closed 状态 -> 等待对方发送END_STREAM 代表对方发完 。

你会发现这个流程非常像 TCP 的四次挥手,因为本质都是自己关闭流后,要等待对方关闭并自己来确认。

当然,也会有像四次挥手一样的 RESET 一样 reset stream 的功能,我就不累述了。

Stream流量控制

HTTP2 的Stream有流量控制功能,HTTP2 的接收方通过 WINDOW_UPDATE[1] 帧告诉对方自己准备接收多少字节的数据,注意只有 DATA 帧才会受限制,因为其他帧都不大,而且也比较重要。

Stream 优先级

客户端可以在开启一个流时,通过设置在 HEADER 帧里的 PRIORITY 这个 flag,来指定流的优先级。这样子就可以做到优先级越高如核心 css、html,优先发给客户端

Server Push

HTTP2 打破了以往 HTTP1 一问一答的范式,允许服务器主动往客户端推数据了,但值得注意的是,这依然不能代替 Websoket,两者是不等价的,除非你自己重新实现 http2 客户端服务端的功能——也就是改 HTTP2 协议了。

服务器可以通过 PUSH_PROMISE 帧,把预估客户端可能需要的资源,在其没有请求前直接发送给对方,让对方缓存。如下图就直接发了 styles.css 给对方。

头部压缩(HPACK)

HPACK 就是专门用来处理重复冗余的头部的,对这个优化,自然就想到查表法——客户端发送请求前,在内部创建一个哈希表,索引对应着头部与值,并将此对应表发送供给服务器;服务器首次接收到后,也维护一个一模一样的表,之后有重复头部时,客户端直接发索引值即可。

后记

拖拖拉拉,写了一两周总算把这篇学习笔记写完了,相比网上很多文章或者书籍(比如网上很多人没讲明白流是什么,frame 如何分段等),我觉得这篇笔记是系统性的且非常符合不熟悉 HTTP2 的同学理解它是什么的。

有很多知识是精简了的,以后看读者反馈再补充。

如果您觉得写的好,对您有用,不妨用行动(你懂的)多多支持~

References

[1] WINDOW_UPDATE: https://http2.github.io/http2-spec/#WINDOW_UPDATE

热门阅读:

前端薪资调查,你属于哪一级别?

如何架构一个中后台项目的前端部分(接口配置篇)

如何架构一个中后台项目的前端部分(webpack 配置篇)

SAP系统HTTPS通信证书信任问题:STRUST事务5分钟解决ICM_HTTP_SSL_PEER_CERT_UNTRUSTED错误 HTTPS通信依赖数字证书建立信任,其核心原理是通过证书链验证确保通信安全。在SAP系统中,当作为客户端调用外部HTTPS服务时,若对方证书的签发机构不在系统信任列表中,就会触发ICM_HTTP_SSL_PEER_CERT_UNTRUSTED错误,导致连接失败。这一机制保障了企业级应用集成的安全性,尤其在SAP与银行网关、云平台API等关键业务对接场景中至关重要。解决此类问题的技术关键在于理解SAP的SSL客户端PSE(个人安全环境)文件管理机制,并通过STRUST事务高效导入缺失的根证书或中间证书。掌握证 阅读详情

相关推荐

h2:基于HTTP2状态机的协议实现

h2:HTTP / 2协议栈 该存储库包含HTTP / 2协议栈的纯Python实现。 它是从头开始编写的,可嵌入到您选择使用的任何程序中,以确保无论您使用哪种编程范例,都可以说HTTP / 2。 您可以这样使用它: import h2 . connection import h2 . config config = h2 . config . H2Configuration () conn = h2 . connection . H2Connection ( config = config ) conn . send_headers ( stream_id = stream_id , headers = headers ) conn . send_data ( stream_id , data ) socket . sendall ( conn . data_to_send ())

BBR拥塞算法的简单解释

TCP BBR的ACM论文中,开篇就引入了图1,以此来说明BBR算法的切入点: 为何当前基于丢包探测的TCP拥塞控制算法还有优化空间? BBR算法的优化极限在哪儿? 图1 为了理解这张图花了我整整一个晚上的时间,它使我重新审视了所有基础概念,而我以下的讨论对于TCP定义的RTT、带宽、Inflight data都作了简化,从而使讨论更易于满足物理直觉,但又不影响最终结论。 为了便于讨论...

kopoo的博客 2989

hyper-h2, 基于 http/2 状态机的协议实现.zip

hyper-h2, 基于 http/2 状态机的协议实现 hyper-h2: http/2 协议栈 这个存储库包含一个 http/2 协议栈的纯python实现。 它是从地面编写的,可以以在任何你选择使用的程序中可以嵌入,确保你可以以说 http/2.你可以这样使用它:imp

一文解释清楚Google BBR拥塞控制算法原理

下图中是先以10Mbps的链路传输TCP,在第20秒网络切换到了更快的40Mbps链路,由于1.25的存在BBR很快发现了更大的带宽,而第40秒又切换回了10Mbps链路,2秒内由于RTT的快速增加BBR调低了发送速率,可以看到由于有了pacing_gain周期变换BBR工作得很好。慢启动在BBR中仍然保留,它的意义是在不知道连接的瓶颈带宽时,以起始较低的发送速率,以每RTT两倍的速度快速增加发送速率,直到到达一个阈值,对应上图中0-4秒。第1条灰色竖线,是瓶颈路由器的缓冲队列刚刚开始积压时的节点。....

Lce的专栏 2117

Tlk。Io-一种简单的聊天方式。「Tlk.Io- An easy way to chat」-crx插件

轻松创建或加入一个在线聊天框在几秒钟! Tlk.io是托管或加入在线聊天框的快速简便的方法。 立即创建一个具有自定义名称和URL的聊天框,以与您的朋友,同事,员工和家人共享。 只需输入聊天框的名称,然后单击“开始”即可! 支持语言:English (United States)

保姆级避坑指南:用Keil和J-Flash搞定凌思微LE5010蓝牙芯片的首次程序下载

本文提供了一份详细的保姆级避坑指南,帮助开发者使用Keil和J-Flash工具完成凌思微LE5010蓝牙芯片的首次程序下载。文章重点解决了算法文件混淆、协议栈漏烧和仿真器连接异常等常见问题,并详细介绍了开发环境配置、协议栈烧录和下载接口的物理层奥秘,助力开发者高效完成蓝牙开发任务。

weixin_28739079的博客 466

HTTP/2 协议详解

HTTP/2 协议详解 作者保留所有权利。All rights reserved. 关于作者 目录 HTTP/1.x 简介 要想深刻的了解 HTTP/2 ,那么我们必须对 HTTP/1.x 本身以及它的缺点有一定程度的熟悉,而这一节,我们对 HTTP/1.x 的请求 形式以及其缺点进行一个简单的回顾。首先, HTTP/1.x 的一个非常明显的特征是...

神棍之路 3077

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

Github Push时报HTTP2错误

【代码】Github Push时报HTTP2错误

天天向上 Up Up Up (*^▽^*) 340

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 433

如果这篇文章说不清HTTP2的本质,那就过来掐死我吧!

最熟悉的陌生人:5分钟快速理解 HTTP2最熟悉的陌生人系列,将带你快速理解熟悉的名词如:HTTP2、HTTP3、IPV6、BBR等。通读 90 年代上下的论文,你会发现,在已经基本建成的计算机科学大厦中,后辈码农只要做一些零星的修补工作就行了。在计算机科学晴朗天空的远处,还有几朵令人不安的小小乌云。——皓尼・郝里斯(HioHio) 而其中一朵小小乌云,就是前辈的协议制定实现得太牢靠了,就算有着诸多不足,还是用的好好的,让后辈没什么动力去创新替换。。HTTP 的不足在阅读此章时,读者可以给自己一个

hiohiohu的博客 296

Python爬虫实战 | 拼多多商品评论采集与深度分析

本文从 API 调用、网页渲染到情感分析与关键词提取,全流程剖析了“拼多多商品评论采集与分析”项目。Scrapy + API 可快速抓取评论;Playwright 可突破 API 限制,抓取完整页面内容;数据清洗 + 分析揭示用户真实反馈;可持续部署、扩展至更多商品 & 时间段;

2201_76125261的博客 1696

快速入门:AI人脸隐私卫士本地离线打码,5分钟从部署到使用

本文介绍了如何在星图GPU平台上自动化部署AI人脸隐私卫士 - 智能自动打码镜像,实现本地离线人脸打码功能。该工具基于MediaPipe技术,可快速检测并模糊图片中的人脸,适用于社交媒体分享、新闻报道等需要隐私保护的场景,确保数据安全且处理高效。

weixin_35516273的博客 311

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5001

VEML7700环境光传感器原理图设计,已量产(光线传感器)

最近做便携显示设备的自动亮度调节模块,最终敲定了 VEML7700 这款数字光传感器 —— 一是它 0~120klx 的宽量程刚好覆盖 “暗室→户外强光” 的全场景,二是 Filtron™技术让它的光谱响应和人眼高度贴合,测出来的 “亮度” 更符合实际视觉感受,加上 O-Trim™技术把输出公差压到 10% 以内,省了不少后期校准的功夫。搭好电路后串口直接读 lx 数值,稳定性和精度都够,这篇聊聊这个模块的硬件设计细节。

不脱发的程序猿 598

如何在Windows上安装APK:APK Installer从部署到装好第一个应用的完整指南

想在电脑上直接跑一个安卓游戏?APK Installer 可以帮你把 .apk 文件装进 Windows 安卓子系统(WSA)或配对的安卓手机。按本文走完,你能独立完成一次真实的 APK 安装。 ## APK Installer 是什么,不是什么 APK Installer 是一款 UWP 应用,只做一件事:解析 .apk,把权限清单摆给你确认,再通过 ADB 把应用装进 WSA 或配对设备。

gitblog_00995的博客 213

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

将电位器Rp调至中心位置,用双综示波器观察并绘制方波U0的波形,测量其幅值和频率;将电位器RP调至中心位置,用示波器观察并绘制锯齿波U0的波形,记录;示波器基线调零,Ui输入1000HZ、幅值为2V的正弦信号,观察并记录Ui与U0波形,读出图中波形跳变时的Ui临界值;用万用表电位器RP调至预测结果位置,用示波器观察并描绘三角波输出U0及方波输出uo’,测其幅值、频率及Rp值,记录之。示波器基线调零,U输入1000HZ、幅值为2V的正弦信号,观察UI与U0波形。理论算法公式:当Ui

Welcome To My6n Blog 3934

Qwen2.5-0.5B游戏NPC对话生成:快速打造开放世界

本文介绍了如何在星图GPU平台上自动化部署Qwen2.5-0.5B-Instruct镜像,快速构建游戏NPC对话系统。该轻量级模型支持中文语境与角色扮演,可在4GB显存下流畅运行,并通过REST API与Unity无缝对接,实现实时、低延迟的开放世界NPC智能对话生成,助力独立开发者高效打造沉浸式游戏体验。

MagentaSky55的博客 410

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

深度学习工具包 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")

人脸识别OOD模型5分钟快速上手:高精度特征提取与质量评估实战

本文介绍了如何在星图GPU平台上自动化部署人脸识别OOD模型镜像,实现高精度人脸特征提取与质量评估。用户可快速完成图片上传、实时获取512维特征向量及0~1质量分,典型应用于考勤系统质检、安防监控帧过滤等需可信识别的业务场景。

weixin_42627459的博客 347

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

五分钟救回一张废片:darktable 免费开源修图软件从零到出图全解

傍晚拍的一组 RAW 打开是灰的、脏的,人脸发黑——JPEG 只能删,RAW 却还留着感光元件上的全部信息。darktable 就是为这种时刻准备的免费开源摄影工作流软件兼 RAW 处理器:它管理你的照片库,把 RAW 无损地"冲洗"成成片,原始文件自始至终不动。下面这条线,装好到出第一张片大约五分钟。 [![darktable 仓库中用于启动画面的暗光样片,高反差夜景正适合 RAW 无损调色]

gitblog_01111的博客 441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Moondream2智能家居:家庭摄像头场景理解本地化实现

本文介绍了如何在星图GPU平台上一键自动化部署🌙 Local Moondream2镜像,实现家庭摄像头的智能场景理解。该方案支持完全本地化的图像分析,可实时识别家人活动、宠物状态及异常情况,为智能家居安防和看护提供高效、隐私安全的AI视觉解决方案。

weixin_42163404的博客 101

5分钟创建你的AI灵魂伴侣:SillyTavern角色创建终极指南

想不想拥有一个真正懂你的虚拟伙伴?一个能够记住你喜好、理解你情绪、陪你聊天的AI角色?今天我要向你介绍SillyTavern——一个让普通人也能轻松创建智能AI角色的神奇工具!无论你是想打造一个虚拟朋友、游戏NPC还是创意写作伙伴,SillyTavern都能帮你实现。最棒的是,这一切都封装在一张简单的图片中,分享角色就像发送照片一样简单! ## 为什么SillyTavern是你的最佳选择? 想

gitblog_01069的博客 1072

ClawdBot/MoltBot:5分钟50元体验低代码AI自动化平台部署与应用实战

低代码平台通过可视化拖拽方式,让开发者无需编写复杂代码即可快速构建应用,解决了传统开发效率低下的问题。其核心原理是将常见的功能模块封装成可复用的组件,通过图形化界面进行逻辑编排,从而大幅降低应用开发的技术门槛。结合人工智能技术,特别是大语言模型(LLM),低代码平台能够为应用注入智能处理能力,实现自动化决策、内容生成与数据分析。这种低代码与AI的融合,在智能客服、自动化报告生成、内容审核等场景中展现出巨大价值,使得中小企业也能低成本地验证和落地AI解决方案。本文以ClawdBot/MoltBot为例,通过实

weixin_33738578的博客 445

MacOS极简部署OpenClaw:5分钟连接Phi-3-vision-128k-instruct模型

本文介绍了如何在星图GPU平台上自动化部署Phi-3-vision-128k-instruct镜像,实现多模态AI应用。该镜像结合OpenClaw框架,可快速搭建本地化AI助手,特别适用于处理截图、PDF等非结构化数据的视觉理解任务,提升办公自动化效率。

weixin_42609225的博客 416

Local Moondream2智能家居:家庭监控画面主动描述与报警联动

本文介绍了如何在星图GPU平台自动化部署🌙 Local Moondream2镜像,实现智能家居监控画面的主动描述与报警联动。该方案支持完全本地的视觉理解,能实时分析监控画面,检测异常情况(如陌生人识别、危险状态),并通过多方式触发警报,提升家庭安防的智能化与隐私安全性。

weixin_33759613的博客 308
上一篇: 用CSS3实现惊艳面试官的背景及背景动画(建议收藏)
劳卜
博客等级 码龄10年 5粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值