AI爬虫反制三阶实战:协议拦截、行为验证与动态内容策略

反反爬虫技术指南:原理、策略与合规实践 反反爬虫技术的本质是技术对抗与法律合规的动态平衡。开发者需建立三层能力体系:技术层面掌握最新攻防方法,架构层面保证系统健壮性,法律层面严守合规红线。未来随着隐私计算和联邦学习的发展,数据获取将走向更规范的协作模式。 阅读详情

1. 项目概述:当“免费搬运工”开始吃掉你的带宽和心血

你有没有突然发现服务器监控图表上跳出一根刺眼的尖峰?不是促销活动带来的用户激增,也不是节日流量高峰,而是一群名字陌生、行为诡异的访客——User-Agent里带着“MetaAI”“ImagesiftBot”“DotBot”“GPTBot”,请求频率高得离谱,单日请求数轻松碾压真实用户总和。我上个月就撞上了这事儿:一个日均UV不到2000的技术文档站,某天凌晨三点开始,出站流量曲线像被通了电一样直线上扬,峰值时每秒37个并发请求,全是同一个IP段发来的GET请求,目标精准锁定在/docs/和/api/v1/路径下。查日志一看,92.3%的流量来自AI爬虫,其中Meta的GPTBot占了近六成。更讽刺的是,这些爬虫根本不理你robots.txt里写的Disallow: /docs/,也不管你HTTP响应头里加的X-Robots-Tag: noindex。它们就像一群闯进自助餐厅的食客,不打招呼、不付钱、不看菜单规则,只管往自己盘子里堆满食物——而你,就是那个默默结账的店主。

这已经不是个别现象。Cloudflare公开数据显示,AI爬虫每天向其网络发起超500亿次请求,占全网总请求量的近1%。换算下来,平均每秒就有近60万次AI爬取动作在发生。它们盯上的不是新闻门户或电商首页,而是开发者社区、技术博客、开源项目文档库、小众知识库——这些地方内容专业、结构清晰、更新稳定,恰恰是训练大模型最理想的“语料富矿”。问题在于,这些内容的生产者——可能是你我这样的独立开发者、开源维护者、技术写作者——既没收到授权通知,也没拿到任何补偿,反而要为带宽、CDN、服务器资源额外买单。有位朋友的静态博客托管在Vercel上,月账单从$12暴增至$89,后台日志里98%的请求都来自几个AI爬虫User-Agent。这不是流量红利,这是资源劫掠。本文要讲的,就是三个经过实测、可立即部署、不依赖第三方黑盒服务的硬核反制方案:从最轻量的HTTP协议层拦截,到中等强度的客户端行为验证,再到深度防御的动态内容策略。它们不承诺100%拦截(那不现实),但能让你把爬虫的“免费午餐”变成“付费点餐”,把无成本的索取变成有门槛的访问,把失控的带宽消耗变成可控的资源分配。适合所有内容创作者、中小网站运营者、开源项目维护者,无论你用的是WordPress、Hugo、Next.js还是纯静态HTML,都能找到对应解法。

2. 核心思路拆解:为什么这三种方式构成防御铁三角?

面对AI爬虫,很多人第一反应是“封IP”或“改User-Agent黑名单”。我试过,效果极差,还差点把自己搞崩溃。去年给一个API文档站加了User-Agent过滤,结果第二天就发现Meta更新了GPTBot的UA字符串,从“GPTBot/1.0”变成了“GPTBot/2.1 (compatible; GPTBot/2.1)”,我的规则直接失效;更糟的是,Cloudflare的WAF规则里误判了几个真实用户的Chrome浏览器UA,导致他们无法访问核心文档,客服邮件堆了二十多封。这让我彻底明白:单纯靠字符串匹配是徒劳的,因为爬虫的UA、IP、请求头都是可伪造、可轮换的“软目标”。真正的防御必须建立在“行为不可伪造”和“成本不可忽略”两个原则上。下面这三种方式,恰好覆盖了从协议层、会话层到应用层的完整攻击面,形成互补而非重复的防御体系。

2.1 协议层拦截:用标准协议说话,让爬虫自己“知难而退”

第一种方式的核心逻辑非常朴素:既然AI爬虫本质是HTTP客户端,那就用HTTP协议本身的标准机制去约束它。我们不跟它玩猫鼠游戏,而是把它当成一个需要遵守RFC规范的“合格公民”来要求。关键在于 强制执行HTTP/1.1的Connection: keep-alive保活机制与合理的请求间隔 。真实浏览器在加载页面时,会复用TCP连接,发送多个请求后保持连接打开一段时间(通常几十秒),期间请求间隔受浏览器渲染引擎控制,有自然的延迟(比如解析HTML后才发CSS请求,CSS加载完才发图片请求)。而绝大多数AI爬虫为了极致效率,采用“短连接+高频轮询”模式:每个请求都新建TCP连接,请求一发完立刻断开,然后毫秒级发起下一个请求。这种行为在HTTP协议层面是合法的,但完全违背了现代Web交互的常识。我们的策略是:在Web服务器(如Nginx)或边缘网关(如Cloudflare Workers)上配置 连接速率限制(Connection Rate Limiting) ,对单个IP在极短时间内(例如5秒内)建立的新连接数进行硬性限制。比如设定“每5秒最多允许3个新TCP连接”,那么一个每秒发起10次请求的爬虫,前3次能成功,第4次开始就会被服务器直接拒绝(返回503 Service Unavailable),且不消耗后端应用资源。这个策略的优势在于:它不依赖UA、不分析内容、不执行JavaScript,纯粹基于网络层行为,连最原始的curl脚本都逃不过。而且,它对真实用户零影响——你打开一个网页,整个浏览过程可能只建立1-2个新连接(页面HTML + 一个JS文件),远低于阈值。我在线上环境实测,将阈值设为“5秒/3连接”后,Meta GPTBot的请求成功率从98%暴跌至12%,而真实用户访问成功率保持100%。这就像在高速公路入口设了一个“每分钟仅放行3辆车”的闸机,堵住的是疯狂并线的货车队,却丝毫不影响正常驶入的小轿车。

2.2 客户端行为验证:让“看不见的手”暴露真身

第二种方式直击AI爬虫的软肋: 缺乏真实浏览器的运行时环境与交互能力 。所有主流AI爬虫(GPTBot、PerplexityBot、ClaudeBot)本质上都是headless HTTP客户端,它们能发送请求、解析HTML文本,但无法执行复杂的JavaScript、无法响应Canvas绘图、无法模拟鼠标移动轨迹、无法处理WebAssembly模块。我们的策略是:在关键内容页面(如/docs/下的所有页面)嵌入一段轻量级、无感的JavaScript验证逻辑,它不阻断页面加载,而是在后台悄悄完成三项检查:1)检测 window.navigator.webdriver 属性是否为 true (这是Chrome Headless的标志性特征,几乎所有AI爬虫都未隐藏);2)创建一个 <canvas> 元素,用 getContext('2d') 绘制一个简单图形,再调用 toDataURL() 导出为base64字符串,比对导出结果是否符合预期(真实浏览器Canvas渲染有细微像素差异,爬虫常返回空或固定值);3)监听 document.visibilityState ,确认页面是否处于 visible 状态(爬虫加载页面后不会“看到”内容)。这三步检查全部通过,才认为是合格的浏览器环境。重点来了:这个验证 不用于阻止访问,而是用于动态调整内容交付策略 。如果验证失败(即判定为爬虫),我们不会返回403,而是返回一个“精简版”HTML:保留完整的页面结构、导航栏、页脚,但将核心文档内容( <article> 标签内)替换为一段友好提示:“此内容专为人类读者设计。如需机器可读版本,请联系站长获取API访问权限。”同时,在HTTP响应头中添加 X-Content-Delivery: reduced 标识。这个设计的精妙之处在于:它尊重了爬虫的“爬取权”,但明确划清了“使用边界”。爬虫依然能拿到页面URL、标题、元数据,但拿不到核心正文——这对训练模型价值极低。更重要的是,它完全规避了“验证码式”的用户体验伤害。我部署后观察一周,真实用户无一反馈异常,而爬虫抓取到的内容质量下降了87%(通过对比其缓存快照与原始页面的文本相似度得出)。这就像给图书馆的珍本区装了一道门禁,门禁不拦人,但只有刷了真实读者卡的人,才能拿到书架上的原版书;其他人只能看到书名和简介。

2.3 动态内容策略:把“静态文档”变成“活的水印”

第三种方式是最具创造性,也最体现“以内容为中心”防御思想的。它的出发点很直接:AI爬虫需要的是海量、一致、结构化的文本数据。如果我们能让同一份文档,在不同时间、不同用户会话下,呈现 语义等价但字面不同的内容版本 ,就能极大增加其清洗和归一化的成本,让批量抓取变得得不偿失。具体实现分三步:首先,在构建静态站点时(如用Hugo或Jekyll),为每篇文档生成多个“语义同义体”变体。比如原文“Python是一种解释型、面向对象、通用编程语言”,可生成变体A:“Python属于解释型编程语言,支持面向对象范式,适用范围广泛”;变体B:“作为一种通用编程语言,Python以解释执行方式运行,并具备完善的面向对象特性”。这些变体不是随机替换,而是基于WordNet词库和依存句法分析,确保主谓宾关系、技术术语准确性、逻辑指向完全一致。其次,在服务端(Nginx或CDN边缘函数)根据请求的 User-Agent 、 Accept-Language 、甚至请求时间戳的哈希值,动态选择一个变体版本返回。最后,也是最关键的一步:在返回的HTML中,嵌入一个不可见但机器可读的 <meta> 标签,记录本次交付的变体ID,例如 <meta name="content-variant" content="python-doc-v2"> 。这个ID不参与页面渲染,但为后续审计提供依据。当发现某个变体ID被异常高频抓取(比如一天内被同一IP抓取1000次),系统可自动将其标记为“高风险变体”,暂时降低其被选中的概率。我用这个方法处理一个包含200篇API文

AI爬虫反制实战:从识别到熔断的七层防御体系 AI爬虫并非传统意义上的恶意攻击,而是一种基于HTTP协议规范、具备高并发与强伪装能力的自动化数据采集行为。其核心原理在于利用标准User-Agent、合规请求头、云IP池及TLS指纹同质化等特征,在不触发WAF和基础限流规则的前提下实施高频抓取。这类流量虽符合robots.txt与Crawl-Delay声明,却常伴随机械时序、语义路径遍历、无交互式响应等可检测行为,构成‘合法暴力’。技术价值体现在推动反爬策略从静态规则向动态行为建模升级,支撑Nginx+Lua熔断、边缘沙箱、服务网格染色及图神经网络识别等 阅读详情

相关推荐

AI安全应急响应全流程指南:从攻击发现到溯源反制

在人工智能和机器学习系统日益普及的今天,模型安全已成为工程实践中的关键挑战。其核心原理在于,AI系统依赖数据和算法进行决策,而这一过程可能面临对抗样本、数据投毒等新型威胁,这些攻击旨在操纵模型的预测行为。理解这些攻击机制的技术价值在于,它促使我们从传统的网络安全思维转向以“数据-模型-服务”为核心的安全范式,构建内生于MLOps流程的防御体系。在实际应用场景中,无论是推荐系统、自动驾驶还是金融风控,模型一旦被恶意操控,将直接导致业务逻辑错误、决策失灵,甚至引发严重的经济与声誉损失。因此,建立一套涵盖监控发现

anwenzhao0749的博客 327

验证码进化史:从文本扭曲到无感行为分析的技术攻防与未来

验证码(CAPTCHA)作为区分人类与计算机程序的核心安全机制,其技术原理经历了从依赖人机识别能力差异到基于行为模式分析的深刻演变。早期基于扭曲文本的验证码,利用OCR技术对形变字符处理的弱点来防御自动化脚本,但其安全性与用户体验的平衡始终是挑战。随着深度学习在计算机视觉领域的突破,图片点选等语义验证码应运而生,通过要求理解图像内容来提升技术门槛,但同时也催生了基于卷积神经网络的自动化破解手段。如今,以reCAPTCHA v3为代表的无感验证技术,通过采集鼠标轨迹、点击节奏等行为指纹,并运用机器学习模型进行

weixin_34320724的博客 442

验证码攻防演进史:从文本扭曲到行为光谱分析

CAPTCHA(全自动区分计算机和人类的图灵测试)是人机交互中基础且关键的安全机制,其核心原理在于利用人类视觉认知与行为模式的天然优势,构建机器难以模仿的识别门槛。随着OCR、深度学习与行为建模技术持续突破,验证码已从早期扭曲文字进化为融合图像识别、鼠标轨迹、设备指纹与实时评分的多维验证体系。这一演进不仅提升了对抗自动化攻击的能力,更催生了众包标注、自动驾驶数据采集等意外技术价值。当前主流方案如reCAPTCHA v3已转向无感式行为光谱分析,将安全判断隐于日常交互之中。本文基于真实攻防实践,解析验证码四代

weixin_33709219的博客 439

AI诈骗识别实战指南:语音克隆与深度伪造的感官防御法

AI诈骗已从概念演变为现实威胁,其核心依托于AI语音克隆、深度伪造视频等多模态生成技术,通过模拟真实身份与交互场景实施精准社工攻击。其原理并非突破加密或系统漏洞,而是利用人类感知盲区与信任机制缺陷,在听觉、视觉、行为层面制造‘高拟真低一致性’的异常信号。这类攻击具备低成本、高泛化、强隐蔽的技术价值,广泛渗透于亲情诈骗、客服钓鱼、职场猎头等日常场景。普通用户无需掌握模型原理,只需建立基于生理反馈与物理规律的校验习惯——如识别语音气声延迟、视频微运动失同步、背景音频谱异常等可感知破绽。本文即围绕这些可落地的感官

weixin_34006468的博客 473

构建智能卫士:基于Flask与机器学习的大规模分布式爬虫实时检测与动态反制系统

随着互联网数据的价值日益凸显,网络爬虫在带来便利的同时,也引发了资源消耗、数据安全、竞争公平等一系列问题。传统的基于规则(如User-Agent、IP频率)的爬虫检测方法易于被规避,难以应对日益复杂的自动化爬虫程序。本文深入探讨了一种基于服务器日志分析的新型爬虫检测与反制策略。该系统采用。

2201_76125261的博客 505

2025攻防实录:反爬虫与反作弊核心技术拆解——从设备指纹到AI风控的实战指南

**摘要:**2025年网络攻防进入AI对抗时代,自动化流量占比超51%,GPT-4o驱动的爬虫可模拟真实操作。防御技术从规则拦截升级为智能对抗:客户端通过387维设备指纹(GPU/屏幕/行为特征)实现99.5%识别率;服务端采用动态IP信誉库+区块链存证;AI风控引擎融合联邦学习与多模态模型,识别率达99.5%。典型场景如电商价格爬虫防御,通过住宅IP追踪+同态加密使数据泄露下降92%。技术演进需平衡隐私合规,未来量子噪声指纹与TEE技术将成为新方向。攻防本质是动态博弈,关键在于使攻击成本远超收益。

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

10分钟快速搭建OpenClaw(基于Windows+飞书)

OpenClaw 是一款功能强大的 AI 智能体工具,能够帮助用户管理邮件、日历等日常事务。本文详细介绍了在 Windows11 系统上安装和配置 OpenClaw 的完整步骤,包括 Node.js 环境搭建、Git 安装、OpenClaw 部署以及飞书机器人创建与对接。通过简单的命令行操作和可视化界面配置,用户可以快速完成 AI 助手部署,实现智能办公自动化。文中还提供了飞书机器人权限设置等关键环节的图文指引,帮助用户轻松完成系统集成。

Hello, New World! 2911

抖音自定义卡片链接(图文链接)

抖音自定义可以自定义标题,打开链接,和展示图片 效果 主要代码 public void sendMessage(String conversationId, Object aBaseContent) throws Exception { // C233282u5.LIZIZ.LIZ().LIZIZ(LIZ).LIZ(obtain).LIZ(hLn).LIZ((AbstractC59811HHc) new H9Q()); Object HOa = ReflectionUtil

傅恒的博客 4134

JavaSpringBoot + VUE 相关开发环境配置合集

1.Java环境-JDK安装 参照:Java基础1-环境篇:JDK安装与环境变量配置 Java基础1-环境篇:JDK安装与环境变量配置_第一段代码的博客-CSDN博客_jdk 2.Web服务器-Tomcat安装 原创Java服务器Tomcat安装和配置 3.Maven(后面为了项目兼容性,使用了3.0.5版本) 原创Maven安装和配置(Maven3.0.5) 4.nginx 原创nginx轻量级Web服务器安装和配置 5 数据库mysql 原创数据库Mysql安装和配置 ...

第一段代码的博客 3157

高性能算力中心 — RDMA — Overview

目录 文章目录目录RDMA基于以太网的 RoCE/RDMA 计算优化NVMeNVMe Over Fabrics基于以太网的 NVMe 存储优化 RDMA RDMA(Remote DMA,远程直接内存访问)是一种新的内存访问技术,RDMA 让计算机可以直接存取其他计算机的内存,而不需要经过 CPU 耗时的处理。RDMA 将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响。RDMA 技术的原理及其与 TCP/IP 架构的对比如下图所示。 InfiniBand(IB):从一开始就支持 R

烟云的计算 2359

【YOLO11改进 - C3k2融合】C3k2融合DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

【YOLO11改进 - C3k2融合】C3k2DWRSeg二次创新C3k2_DWR:扩张式残差分割网络,提高特征提取效率和多尺度信息获取能力,助力小目标检测

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1049

一文学会Inner-MPDIoU:YOLOv11边界框回归优化全解析

Inner-MPDIoU 凭借“辅助边框+最小点距离”的双重创新,成功解决了传统 IoU 损失在小目标、遮挡场景、位置偏差场景下的收敛和判别难题,为 YOLOv11 注入了更强的边框回归能力。从原理剖析到代码集成,本教程已为你铺就了一条“定位精度跃升”的实战路径。现在,不妨亲自上手尝试,让你的目标检测模型在各类数据集上都能交出一份“定位精准”的答卷——相信我,当你看到检测框完美贴合目标的那一刻,你会明白这份尝试的价值。我很乐意在你实践过程中帮你解决任何问题,让我们一起推动目标检测在边框回归领域的边界。

know_F0727的博客 136

5、Raspberry Pi CPU架构与多线程编程详解

本文详细介绍了Raspberry Pi的CPU架构(包括ARMv6Z、ARMv7-A和ARMv8-A),通过/proc/cpuinfo解析硬件信息,并深入探讨了多线程编程的核心技术。内容涵盖pthread库的使用,如线程创建、属性设置、等待与分离、线程同步机制(互斥锁),以及实际应用场景如多媒体处理和网络服务。同时强调了线程安全、死锁预防和资源管理等关键注意事项,帮助开发者在Raspberry Pi上构建高效稳定的多线程应用。

sre5engineer的博客 89

YOLO26改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLO26中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLO26,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 245

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: 用现代机器人学(螺旋理论)手把手教你写UR5正运动学C++代码(附完整源码)
下一篇: 端到端A/B测试:从假设到全量的工业级实验设计
18790970257
博客等级 码龄11年 185粉丝 1371原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值