如何安全解析深层嵌套JSON?json_decode深度限制配置全指南

第一章:JSON深度解析的安全挑战

在现代Web应用中,JSON(JavaScript Object Notation)已成为数据交换的事实标准。其轻量、易读和语言无关的特性使其广泛应用于API通信、配置文件和前后端数据传输。然而,随着使用场景的复杂化,JSON解析过程中的安全风险也日益凸显。

潜在的安全威胁

  • 注入攻击:恶意构造的JSON数据可能包含脚本或命令,导致执行非预期操作
  • 拒绝服务(DoS):超大JSON对象或深层嵌套结构可能导致内存溢出或解析阻塞
  • 类型混淆:JSON不支持特定数据类型(如日期),解析时可能引发逻辑错误

安全解析实践

为防范上述风险,开发者应采用严格的输入验证与安全解析策略。以下是一个使用Go语言进行安全JSON解析的示例:
// 安全解析用户输入的JSON数据
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "strings"
)

func safeJSONHandler(w http.ResponseWriter, r *http.Request) {
    // 限制请求体大小,防止超大Payload攻击
    r.Body = http.MaxBytesReader(w, r.Body, 1048576) // 1MB限制
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
        http.Error(w, "请求体过大或读取失败", http.StatusBadRequest)
        return
    }

    // 基础格式校验
    if !json.Valid(body) {
        http.Error(w, "无效的JSON格式", http.StatusBadRequest)
        return
    }

    var data map[string]interface{}
    if err := json.Unmarshal(body, &data); err != nil {
        http.Error(w, "解析失败", http.StatusBadRequest)
        return
    }

    // 进一步业务层校验逻辑...
    fmt.Fprintf(w, "解析成功: %+v", data)
}

常见防护措施对比

防护措施适用场景实施难度
请求体大小限制所有JSON接口低
Schema校验关键业务接口中
沙箱解析环境第三方数据导入高

第二章:理解json_decode的深度限制机制

2.1 JSON嵌套结构与解析器栈溢出风险

在处理深度嵌套的JSON数据时,解析器可能因递归层级过深而触发栈溢出。多数标准JSON库采用递归下降解析策略,当对象或数组嵌套层数超过系统调用栈限制时,将导致程序崩溃。
典型嵌套结构示例
{
  "level1": {
    "level2": {
      "level3": { "data": "value" }
    }
  }
}
上述结构看似简单,但若自动扩展至数百层,则极易引发问题。
风险缓解策略
  • 限制最大解析深度,通过配置如MaxDepth=100防御深层递归
  • 使用非递归解析器(如SAX模式)替代DOM树构建
  • 预检输入结构,拒绝异常嵌套模式
栈溢出防护配置对比
解析器默认最大深度可配置性
Python json1000是
Go encoding/json无硬限制需手动控制

2.2 PHP源码层面解析深度的实现原理

PHP的深度解析能力源于其内核中的编译与执行机制。当PHP脚本被加载时,Zend引擎首先将其转换为抽象语法树(AST),再编译为opcode指令序列。
核心执行流程
  • 词法分析:将源码切分为token
  • 语法分析:构建AST结构
  • 编译阶段:生成opcode供VM执行
关键代码片段

ZEND_API zend_op_array *zend_compile_file(zend_file_handle *file_handle, int type)
{
    // 核心编译入口,处理文件级编译逻辑
    zend_op_array *op_array = compile_file(file_handle, type);
    return op_array;
}
该函数是PHP源码编译的入口点,接收文件句柄并返回对应的opcode数组。其中compile_file为实际编译处理器,根据文件内容生成可执行的op_array结构。
数据结构对比
阶段输入输出
词法分析字符流Tokens
语法分析TokensAST
编译ASTOpcode

2.3 默认深度限制的兼容性与版本差异

在不同版本的序列化库中,默认深度限制策略存在显著差异。早期版本通常设置默认深度为10,以防止栈溢出;而新版本引入动态探测机制,允许最大深度提升至64。
典型版本对比
版本默认深度行为特征
v1.010固定限制,超出抛出 StackOverflowError
v2.132支持配置但不推荐修改
v3.0+64(动态)自动检测循环引用并优化深度分配
代码示例与分析

// 配置深度限制(v2.1+)
ObjectMapper mapper = new ObjectMapper();
mapper.getFactory().setStreamReadConstraints(
    StreamReadConstraints.builder().maxNestingDepth(32).build()
);
上述代码通过 StreamReadConstraints 显式设置嵌套深度上限。该方法适用于 Jackson 2.13 及以上版本,确保反序列化过程在可控范围内执行,避免因深层结构导致内存溢出。参数 maxNestingDepth 定义了对象图的最大层级,超过则触发 JsonProcessingException。

2.4 深度超限导致的拒绝服务攻击案例分析

在某些递归处理场景中,深度超限可能引发拒绝服务(DoS)攻击。攻击者通过构造嵌套层级极深的结构,迫使服务栈溢出或消耗过多资源。
典型攻击向量:JSON 嵌套爆炸

{
  "data": {
    "child": {
      "child": {
        ...
      }
    }
  }
}
当解析器未限制嵌套深度时,含有数百层嵌套的 JSON 可导致调用栈溢出或内存耗尽。
防御策略对比
策略有效性备注
限制解析深度高防止栈溢出
使用迭代替代递归中降低风险但需重构逻辑
通过设置解析器最大深度(如 Jackson 的 DeserializationFeature.FAIL_ON_TRAILING_TOKENS 配合自定义限制),可有效阻断此类攻击。

2.5 如何通过配置避免内存耗尽与执行超时

在高并发或大数据处理场景中,不当的资源配置极易引发内存耗尽与任务执行超时。合理设置运行时参数是保障系统稳定的关键。
调整JVM堆内存大小
通过限制最大堆内存,防止Java应用占用过多系统资源:
java -Xms512m -Xmx2g -jar app.jar
其中 -Xms512m 设置初始堆内存为512MB,-Xmx2g 限定最大堆为2GB,避免无节制增长。
配置超时与熔断机制
使用Spring Boot时可通过如下配置设置请求超时:
feign:
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 10000
连接超时设为5秒,读取超时10秒,有效防止线程长时间阻塞导致资源耗尽。
  • 监控GC频率与内存使用趋势
  • 启用限流与降级策略保护核心服务
  • 定期压测验证配置合理性

第三章:配置与调优实践

3.1 修改php.ini中最大解析深度参数

在处理复杂的嵌套数据结构时,PHP默认的解析深度限制可能导致脚本中断或解析失败。通过调整`php.ini`配置文件中的`max_input_nesting_level`参数,可有效控制POST数据、JSON输入等嵌套层级的最大深度。
参数配置示例
; 设置最大输入嵌套层级为100
max_input_nesting_level = 100
该参数默认值通常为64,表示允许最多64层的嵌套数组或对象结构。当应用涉及深层嵌套的JSON或表单数据时,建议适当调高此值以避免Input variables exceeded类错误。
调整建议与影响
  • 生产环境应根据实际业务复杂度评估合理值,避免设置过高导致内存溢出
  • 修改后需重启Web服务使配置生效
  • 结合memory_limit和max_execution_time协同优化性能

3.2 运行时动态调整深度限制的编码技巧

在处理递归或嵌套结构遍历时,硬编码的深度限制往往难以适应多变的运行环境。通过引入可配置的深度控制机制,能够在运行时根据系统负载或用户需求动态调整。
动态深度控制器实现
type DepthLimiter struct {
    current int
    max     int
}

func (d *DepthLimiter) Enter() bool {
    if d.current >= d.max {
        return false
    }
    d.current++
    return true
}

func (d *DepthLimiter) Exit() {
    d.current--
}
该结构体封装了进入与退出逻辑,Enter() 在超出最大深度时返回 false,用于中断递归;Exit() 确保回溯时正确减层。
运行时调节策略
  • 通过信号量或配置热更新 max 值
  • 结合监控指标自动降级深度以保护系统资源

3.3 结合业务场景设定合理的嵌套阈值

在复杂业务系统中,数据结构的嵌套深度直接影响解析性能与内存消耗。为避免过度嵌套导致栈溢出或解析延迟,需根据实际场景设定合理的阈值。
阈值设定原则
  • 高频交易系统:建议最大嵌套层级不超过5层,保障低延迟处理;
  • 报表分析系统:可放宽至8层,以支持复杂的聚合结构;
  • 日志采集场景:建议限制在3层以内,提升序列化效率。
配置示例

{
  "max_nesting_depth": 5,
  "enable_deep_validation": false,
  "on_exceed_strategy": "truncate"
}
上述配置表示当嵌套超过5层时自动截断,避免异常扩散。其中 on_exceed_strategy 支持 reject、truncate 和 flatten 三种策略,应根据业务容错能力选择。

第四章:安全解析的工程化解决方案

4.1 构建带深度检测的JSON预处理器类

在处理复杂嵌套结构时,标准JSON解析往往无法满足数据校验与清洗需求。构建支持深度检测的预处理器类,可实现对嵌套字段的递归遍历与类型验证。
核心设计思路
该类需具备递归探查、类型标记与异常捕获能力,通过路径追踪记录层级结构。

type JSONPreprocessor struct {
    MaxDepth int
}

func (j *JSONPreprocessor) Traverse(data map[string]interface{}, path string) {
    for key, value := range data {
        currentPath := path + "." + key
        if nested, ok := value.(map[string]interface{}); ok && j.isValidDepth(currentPath) {
            j.Traverse(nested, currentPath)
        }
    }
}
上述代码定义了基础结构体与递归方法。MaxDepth 控制最大探测层级,currentPath 跟踪当前访问路径,确保深层字段不被遗漏。
功能特性列表
  • 支持自定义最大探测深度
  • 路径字符串实时追踪
  • 动态类型断言处理

4.2 利用递归计数器实现自定义深度校验

在复杂的数据结构遍历中,控制递归深度是防止栈溢出的关键。通过引入递归计数器,可在运行时动态监控调用层级。
递归深度限制的必要性
深层嵌套对象可能导致无限递归,影响系统稳定性。使用计数器可主动中断超限操作。
核心实现逻辑

func traverse(node *Node, depth int, maxDepth int) error {
    if depth > maxDepth {
        return fmt.Errorf("maximum depth exceeded: %d", maxDepth)
    }
    // 处理当前节点
    for _, child := range node.Children {
        traverse(child, depth+1, maxDepth)
    }
    return nil
}
上述代码中,depth 跟踪当前层级,maxDepth 设定阈值。每次递归调用时深度加一,超出则终止。
  • 参数 depth:初始为0,表示根层级
  • 参数 maxDepth:业务预设的安全上限
  • 错误返回机制确保调用链及时响应

4.3 集成到API网关的JSON结构规范化策略

在微服务架构中,API网关承担着统一响应格式的职责。通过规范化JSON结构,可提升客户端解析效率并降低联调成本。
标准化响应结构
建议采用统一的响应体格式:
{
  "code": 0,
  "message": "success",
  "data": {}
}
其中 code 表示业务状态码,message 为描述信息,data 携带实际数据。该结构便于前端统一处理成功与异常逻辑。
中间件自动封装
在网关层注入响应拦截器,自动包装下游服务返回内容。对于非标准格式的响应,可通过配置规则进行映射转换,确保对外输出一致性。
错误码集中管理
  • 定义全局错误码区间,避免服务间冲突
  • 通过配置文件动态加载错误信息
  • 支持多语言 message 输出

4.4 单元测试覆盖深度边界条件验证

在单元测试中,确保边界条件的充分覆盖是提升代码健壮性的关键。许多缺陷往往隐藏在输入的极值、空值或临界状态中。
常见边界场景分类
  • 数值类:最小值、最大值、零值、负数
  • 集合类:空集合、单元素、满容量
  • 字符串类:空串、超长字符串、特殊字符
代码示例:整数除法边界测试

func TestDivide(t *testing.T) {
    // 正常情况
    if result, _ := Divide(10, 2); result != 5 {
        t.Error("Expected 5")
    }
    // 边界:被除数为零
    if _, err := Divide(0, 3); err != nil {
        t.Error("Should not error when dividend is 0")
    }
    // 边界:除数为零(异常路径)
    if _, err := Divide(5, 0); err == nil {
        t.Error("Expected error when divisor is 0")
    }
}
该测试覆盖了正常路径、被除数为零和除数为零三种边界情形,确保函数在极端输入下仍能正确处理并返回预期错误。
覆盖率评估矩阵
输入类型测试用例是否覆盖
整数正数、负数、零✅
浮点数极小值、溢出值⚠️ 部分

第五章:未来趋势与最佳实践建议

云原生架构的持续演进
现代应用正加速向云原生模式迁移,Kubernetes 已成为容器编排的事实标准。企业应优先采用声明式配置管理,并通过 GitOps 实现部署自动化。以下是一个典型的 Helm Chart values.yaml 配置片段,用于启用自动扩缩容:
replicaCount: 3
autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80
安全左移的最佳实践
在 CI/CD 流程中集成安全检测工具是关键。推荐使用以下工具链组合:
  • 静态代码分析:SonarQube 或 CodeQL
  • 依赖扫描:Snyk 或 Trivy
  • IaC 安全检测:Checkov 或 Terrascan
例如,在 GitHub Actions 中嵌入 Snyk 扫描任务:
- name: Run Snyk to check for vulnerabilities
  uses: snyk/actions/node@master
  env:
    SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
  with:
    args: --severity-threshold=high
可观测性体系构建
完整的可观测性需覆盖日志、指标与追踪三大支柱。建议采用如下技术栈组合:
类别推荐工具部署方式
日志收集Fluent Bit + LokiDaemonSet
指标监控Prometheus + GrafanaSidecar or Agent
分布式追踪OpenTelemetry + JaegerInstrumentation SDK
[Client] → HTTP → [Envoy Proxy] → [Service A] → [Service B] ↓ ↓ [OTLP Exporter] [Prometheus Metrics] ↓ [Collector Gateway] → [Jaeger Backend]
KUKA机器人自动回原点程序 创建两个全局变量分别用于储存机器人的笛卡尔姿态与关节角姿态。打开System文件夹中的config文件创建全局变量的点位。在USER GROBALS用户自定义变量Userdefined variables下创建一个E6POS类型的点位,一个E6AXIS类型的点位。 阅读详情

相关推荐

使用R语言(ggplot2)绘制KEGG信号通路富集气泡图

本文详细介绍了如何使用R语言的ggplot2包绘制KEGG信号通路富集气泡图,从数据预处理到高级定制技巧,帮助生物信息学研究者直观展示富集分析结果。文章涵盖了气泡图的核心绘制方法、布局优化、常见问题解决方案以及交互式可视化扩展,是进行KEGG富集分析可视化的实用指南。

weixin_42625070的博客 447

jackson修改请求最大长度

jackson修改请求最大长度

Crzep的博客 3256

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 272

揭秘json_decode嵌套限制:5步彻底掌握PHP安全解析JSON技巧

掌握json_decode深度限制的正确处理方法,有效防范PHP解析JSON时的栈溢出风险。详解嵌套层级控制、错误处理机制与安全配置,适用于API开发和数据验证场景。5步实现安全高效解析,值得收藏。

LearnPlex的博客 932

手把手教你复现KDD 2024时空预测顶会论文:以UniST和ImputeFormer为例的代码实战与避坑指南

本文详细指导如何复现KDD 2024顶会论文中的UniST和ImputeFormer模型,涵盖环境配置、数据处理、模型训练及评估等关键步骤。通过实战案例和避坑指南,帮助研究者掌握时空预测与插补技术,提升在智慧城市、交通管理等领域的应用能力。

weixin_29204205的博客 279

Word标题样式基准重置:彻底解决重新打开后自动缩进问题

本文深入剖析了Word文档中标题样式在重新打开后自动缩进问题的根源,并提供了两种根治方案。通过调整标题样式基准或将其设为“无样式”,并配合检查修正多级列表设置,可彻底解决这一常见格式顽疾,确保文档格式的稳定性与专业性。

weixin_29266647的博客 526

为什么你的JSON解析失败了?揭秘json_decode深度限制的5个真相

解决JSON解析失败问题,揭秘PHP json_decode的深度限制真相。涵盖常见报错场景、调整递归深度方法及安全解析技巧,助你稳定处理复杂JSON数据。实用指南值得收藏。

DevPath的博客 1426

ThingsBoard入门实战(二):ThingsBoard 设备接入

文章目录ThingsBoard 设备接入一、设备配置/设备类型二、设备三、设备接入HTTPCOAPMQTT四、下一步 ThingsBoard 设备接入 设备接入并不一定需要真正的设备,我们可以通过程序。或者命令来模拟设备,向平台发送信息。 这节我们先为用户分配一个设备,然后通过模拟设备命令更新设备的状态(遥测值)。 一、设备配置/设备类型 添加一个叫"路灯"的设备配置。 设备配置听起来比较抽象,可以认为是设备类型或者是设备类型的配置。实际上,ThingsBoard 中很多时候让选择设备类型,就是选的这个。

AIGC搞起 1万+

【PHP json_decode 深度限制揭秘】:如何突破嵌套层级瓶颈?

深入解析PHP json_decode 的深度限制问题,提供调整递归深度、预处理JSON等实用解决方案。适用于处理深层嵌套数据场景,提升程序兼容性与稳定性,值得收藏。

LogicGlow的博客 743

完整内、外期货量化交易系统源码可售

支持客户登录校验,支持所有的实时行情和汇总报价功能、实时资讯(报价,列表,分时,分钟成交明晰,),多线程支持盘后收盘作业下载(日线,5分钟线,15分钟, 30分钟,60分钟线,),支持从服务器下载相关运行配置(来自服务器动态配置信息,如收盘日期等),实现状态条显示。收盘作业包括日线、5分钟线、15分钟线、30分钟、60分钟线、2小时线、4小时线每日分时走势。综合信息栏显示用户账户信息、合约信息、当日委托单记录、当日成交记录、当日平仓记录、当日跟单记录、当日(月/周)排行榜、下单栏、持仓信息;

qq_35600909的博客 1805

测试人必看!正交表与Allpairs工具对比:如何选择最适合你的组合测试方案?

本文深入对比了正交表、PICT与Allpairs三种主流组合测试方案,帮助测试人员根据项目场景做出最佳选择。文章分析了各自的核心原理、优劣势及适用场景,特别强调了在涉及复杂约束时PICT工具的强大功能,并提供了从原理学习到CI/CD集成的实战选型指南。

weixin_29224309的博客 267

PHP中处理深层嵌套JSON的终极指南(突破默认1024层限制)

轻松突破PHP json_decode 的深度限制,解决深层嵌套JSON解析失败问题。适用于API数据处理、复杂配置读取等场景,通过调整递归深度参数实现稳定解析,提升程序兼容性与健壮性,值得收藏。

InitPulse的博客 882

Arduino、ESP32驱动AS3935数字闪电传感器(闪电传感器)

闪电传感器采用AMS独具创新的AS3935数字闪电传感芯片与Coilcraft的MA5532-AE专用天线,可在室内或室外,安全地检测方圆40km范围内发生闪电的距离,闪电相对强度与统计闪电发生次数。

不脱发的程序猿 2011

PHP中json_decode的最大嵌套深度是多少?(深度解析+实战测试)

掌握PHP json_decode 的深度限制,轻松应对深层JSON解析问题。本文详解默认嵌套深度、修改方法及实际应用场景,附实战测试代码。避免解析失败,提升程序稳定性,值得收藏。

FuncInk的博客 670

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

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

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

json_decode深度限制踩坑实录,你真的了解max_depth吗?

解决PHP处理深层JSON失败问题,本文深入解析json_decode的深度限制机制,涵盖实际开发中的常见场景与max_depth参数正确用法。通过调整深度阈值避免解析中断,提升程序健壮性。掌握这一细节,让数据处理更可靠,值得收藏。

PixelIsle的博客 947

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

json_decode深度限制详解:设置不当竟导致服务崩溃?

掌握json_decode深度限制有效防止服务崩溃,详解PHP中如何设置合理嵌套层级,避免恶意超长JSON攻击。涵盖实际应用场景与最佳配置方法,提升应用安全性与稳定性,值得收藏。

QuickCode的博客 969

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

为什么你的json_decode返回null?深度限制的隐藏坑点大曝光

解决json_decode返回null难题,深入解析深度限制机制。涵盖PHP中json_decode深度限制的触发场景与规避方法,揭示嵌套层级过深导致解析失败的根源,提供实用配置建议和替代方案,提升接口数据处理稳定性,值得收藏。

ByteGlow的博客 834

json_decode深度限制实战解析(99%开发者忽略的关键参数)

掌握json_decode深度限制技巧,有效防范解析异常。详解PHP中max_depth参数在处理嵌套JSON时的应用场景与配置方法,避免内存溢出与安全风险。合理设置深度层级,提升程序稳定性,99%开发者忽略的关键细节,值得收藏。

PoliSeed的博客 674

PHP json_decode 深度限制详解:99%开发者忽略的关键参数

深入解析PHP json_decode 的深度限制问题,揭示官方默认1024层限制的应对策略。涵盖API调用、嵌套数据处理等场景,教你通过调整递归深度参数避免解析失败。掌握关键配置,提升程序健壮性,值得收藏。

CompiGlow的博客 741

【PHP开发必知】:json_decode深度限制如何避免内存溢出?

掌握json_decode深度限制有效防止PHP解析深层JSON时内存溢出,适用于API处理与大数据交互场景。通过设置合理递归深度,提升程序稳定性与安全性,避免崩溃风险,值得收藏。

FuncWander的博客 421

【PHP性能优化必知】:json_decode深度限制如何避免内存溢出?

掌握json_decode深度限制有效防止内存溢出,适用于处理大型嵌套JSON数据。通过设置合理深度参数和预校验数据结构,提升PHP脚本稳定性与性能。避免解析异常导致的服务崩溃,保障系统安全运行。值得收藏

ProceNest的博客 601

PHP中json_decode最大深度设置,你真的用对了吗?

掌握json_decode深度限制的正确设置方法,避免PHP中JSON解析失败。适用于处理嵌套复杂的JSON数据,通过合理配置最大深度参数提升安全性与稳定性,防止栈溢出。实用技巧值得收藏。

GatherLume的博客 699

json_decode深度限制实战指南:从报错排查到安全调优全过程

掌握json_decode深度限制的正确用法,有效避免解析嵌套JSON时的栈溢出错误。涵盖常见报错排查、合理设置深度参数及安全调优策略,适用于API开发与数据验证场景。提升程序稳定性,值得收藏。

LearnFlow的博客 571

json_decode第三参数深度解析,设置错误等于埋下定时炸弹?

掌握json_decode深度限制,避免解析崩溃。详解PHP中json_decode第三参数的正确设置方法,适用于处理嵌套JSON数据,防止因递归过深导致的内存溢出。合理配置深度可提升稳定性与安全性,值得收藏。

PixelShoal的博客 810

PHP安全编码必须掌握的知识点,json_decode深度限制配置不当=系统风险,你中招了吗?

掌握json_decode深度限制配置技巧,有效防范PHP安全风险。本文详解其在防止栈溢出和解析攻击中的关键作用,涵盖合理设置嵌套层级、常见漏洞场景及修复方案,提升系统安全性,值得收藏。

SimSolve的博客 295

你以为只是JSON格式问题?其实是json_decode默认深度限制惹的祸(内附绕行方案)

解决JSON解析失败难题,关键在于理解json_decode深度限制。本文详解PHP中该限制的触发场景与绕行方案,包括调整递归深度、预处理数据结构等实用方法,避免因嵌套过深导致解析中断。提升接口兼容性与稳定性,值得收藏。

simcode的专栏 434
上一篇: 为什么你的cURL请求总在生产环境超时?深入剖析curl_setopt时间参数陷阱
下一篇: 【PHP 7.1类常量可见性深度解析】:掌握私有、受保护与公共常量的正确用法
ProceChat
博客等级 码龄1年 155粉丝 1997原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值