揭秘EF Core多级关联查询:ThenInclude如何提升数据访问效率?

第一章:揭秘EF Core多级关联查询:ThenInclude的核心价值

在使用Entity Framework Core进行数据访问时,处理复杂的对象图是常见需求。当实体之间存在多层导航属性时,仅靠`Include`方法无法满足深层关联数据的加载需求,此时`ThenInclude`便展现出其核心价值。它允许开发者在已包含的关联基础上,进一步指定下一级关联属性,实现精准、高效的多级数据加载。

理解ThenInclude的作用场景

假设系统中存在三层关联结构:博客(Blog)拥有多个文章(Post),每篇文章又关联多个标签(Tag)。若需一次性加载博客及其所有文章和对应标签,必须通过`ThenInclude`链式调用完成。
// 查询博客,并加载其文章及每篇文章的标签
var blogs = context.Blogs
    .Include(blog => blog.Posts)           // 加载文章
    .ThenInclude(post => post.Tags)        // 再加载文章的标签
    .ToList();
上述代码中,`Include`首先指定加载`Posts`集合,随后`ThenInclude`在其基础上延伸至`Tags`,从而构建完整的三级对象图。

常见使用模式对比

  • 单级包含:仅使用Include加载直接关联实体
  • 多级包含:结合Include与ThenInclude深入导航属性
  • 并行包含:在同一层级使用多个ThenInclude加载不同子路径
查询目标语法结构
Blog → Posts → TagsInclude(b => b.Posts).ThenInclude(p => p.Tags)
Blog → Owner 和 Blog → PostsInclude(b => b.Owner).Include(b => b.Posts)
graph TD A[Blog] --> B[Posts] B --> C[Tags] A --> D[Owner] style A fill:#f9f,stroke:#333 style B fill:#bbf,stroke:#333 style C fill:#f96,stroke:#333 style D fill:#6cf,stroke:#333

第二章:ThenInclude基础与工作原理

2.1 理解导航属性与关联实体的关系

在实体框架中,导航属性用于表示实体之间的关联关系,允许开发者以面向对象的方式访问相关联的数据。例如,在“订单”与“客户”之间存在外键关系时,可通过导航属性直接访问订单所属的客户对象。
常见关联类型
  • 一对一:一个实体仅对应另一个实体的一个实例
  • 一对多:如一个客户拥有多个订单
  • 多对多:如学生与课程之间的关系
代码示例:定义导航属性
public class Order
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; } // 导航属性
}

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Order> Orders { get; set; }
}
上述代码中,Order 类中的 Customer 属性即为导航属性,它指向关联的 Customer 实体,无需手动编写 JOIN 查询即可实现数据联动访问。

2.2 ThenInclude语法结构与使用场景分析

嵌套关联查询的核心机制
在 Entity Framework 中,ThenInclude 用于在已调用 Include 的基础上继续加载导航属性的子级关联数据,适用于多层级对象关系的场景。
var blogs = context.Blogs
    .Include(b => b.Posts)
        .ThenInclude(p => p.Comments)
    .ToList();
上述代码首先加载博客及其文章,再进一步加载每篇文章下的评论。其中,Include 指定第一层关联(Posts),而 ThenInclude 延续该路径深入至 Comments。
复杂对象图的构建策略
当实体间存在多级引用时,合理使用 ThenInclude 可避免 N+1 查询问题,提升数据获取效率。
  • 支持链式调用,可逐层展开深度关联
  • 适用于一对多、多对多等复杂关系映射
  • 需注意过度加载可能导致性能下降

2.3 多级包含与数据库查询的映射机制

在复杂的数据模型中,多级包含关系常用于表达实体间的嵌套关联。ORM 框架通过预加载(Eager Loading)机制将这些层级关系映射为联表查询或批量查询。
数据加载策略
常见的加载方式包括:
  • 嵌套查询:逐层发起 SQL 查询,易产生 N+1 问题;
  • 联表查询:通过 JOIN 一次性获取数据,需去重处理。
代码示例

db.Preload("User").Preload("User.Profile").Preload("Comments").Find(&posts)
该 GORM 示例展示了三级包含:文章 → 用户 → 用户详情,并行加载评论。框架生成 LEFT JOIN 查询,避免循环请求,提升性能。
映射优化
层级结构SQL 行为
Post → UserJOIN users ON posts.user_id = users.id
User → ProfileJOIN profiles ON users.profile_id = profiles.id

2.4 单向与双向关联中的ThenInclude行为差异

在EF Core中,`ThenInclude`用于多级导航属性的加载,其行为在单向与双向关联中存在显著差异。
单向关联场景
当仅存在单向导航时,`ThenInclude`必须严格按照路径定义顺序调用。若中间属性为空或未映射,则无法正确解析后续层级。
var blogs = context.Blogs
    .Include(b => b.Posts)
    .ThenInclude(p => p.Comments)
    .ToList();
该代码从Blog到Post再到Comment形成链式加载,依赖显式声明路径。
双向关联的影响
在双向关系中(如Blog⇄Post),EF Core可利用关系逆导航推断路径,但`ThenInclude`仍需明确指定方向,不会自动跨反向属性继续展开。
  • 单向关联:路径必须完整、连续
  • 双向关联:虽有反向引用,但ThenInclude不自动识别逆导航

2.5 查询表达式树在多级包含中的构建过程

在处理复杂对象图时,查询表达式树需支持多级包含(Include)以加载关联数据。EF Core 通过表达式树解析导航属性路径,逐层构建 JOIN 逻辑。
表达式树的层级解析
当执行 Include(x => x.Orders).ThenInclude(y => y.OrderItems) 时,框架将该链式调用转换为表达式树节点,识别父子关系路径。
var query = context.Users
    .Include(u => u.Orders)
        .ThenInclude(o => o.OrderItems);
上述代码生成的表达式树会记录两个层级:首先从 User 到 Orders,再从 Order 到 OrderItems,最终翻译为 LEFT JOIN 语句。
多级包含的执行流程

Parse Include Chain → Build Navigation Path → Generate JOINs → Project Result

  • 解析包含链:将 Lambda 表达式分解为导航段
  • 路径绑定:验证每个导航属性是否存在且可访问
  • SQL 生成:根据路径深度生成相应数量的 JOIN 子句

第三章:性能影响与优化策略

3.1 多级查询对SQL生成的影响及执行计划解析

多级查询的SQL结构特征

多级查询,即嵌套查询,在复杂数据检索中广泛使用。其典型特征是在一个SELECT语句中包含另一个子查询,常用于实现条件过滤或聚合判断。

SELECT name FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);

该查询从users表中筛选出在orders表中有大额订单的用户。子查询先执行,结果作为外层查询的过滤条件。

执行计划分析

数据库优化器会根据统计信息决定是否将嵌套查询转换为JOIN操作。使用EXPLAIN可查看执行路径:

idselect_typetabletypeExtra
1PRIMARYusersALLUsing where
2SUBQUERYordersrangeUsing index

执行计划显示子查询独立运行,且对orders表使用了索引扫描,效率较高。

3.2 避免N+1查询问题:ThenInclude与显式加载对比

在使用Entity Framework Core进行数据访问时,N+1查询是常见的性能瓶颈。通过合理选择关联加载策略,可有效避免该问题。
使用ThenInclude实现级联预加载
var blogs = context.Blogs
    .Include(b => b.Posts)
    .ThenInclude(p => p.Comments)
    .ToList();
该方式通过链式调用ThenInclude,在一次查询中完成多层级导航属性的加载,生成单条SQL语句,避免循环查询。
显式加载控制数据获取时机
  • Entry(entity).Collection(e => e.Posts).Load():同步加载集合导航属性
  • Entry(entity).Reference(e => e.Author).Load():加载引用属性
显式加载适用于按需获取关联数据,但需注意调用时机,否则仍可能引发N+1问题。
性能对比
策略查询次数适用场景
ThenInclude1固定结构、全量加载
显式加载N动态条件、延迟加载

3.3 减少数据冗余:投影与Select操作的协同优化

在查询处理中,减少不必要的数据传输和存储是提升性能的关键。通过合理使用投影(Projection)与 Select 操作的协同优化,可显著降低中间结果集的数据冗余。
投影裁剪无效字段
投影操作仅选择所需列,避免全字段扫描。例如,在 SQL 查询中:
SELECT name, email FROM users WHERE age > 30;
该语句仅提取 name 和 email 字段,数据库引擎可在存储层提前过滤非必要列,减少 I/O 开销。
Select 条件下推优化
将 Select 的过滤条件下推至数据扫描阶段,结合投影可实现双重精简。优化器会重写执行计划,使谓词过滤早于其他操作执行。
  • 减少内存中的元组数量
  • 降低后续连接或聚合的计算负载
  • 提升缓存命中率
这种协同策略广泛应用于分布式查询引擎如 Spark SQL 和 Presto 中。

第四章:典型应用场景实战

4.1 电商平台中商品-分类-品牌-供应商的四级关联查询

在电商系统中,商品数据通常需要与分类、品牌、供应商三者建立深度关联,以支持精细化运营和多维检索。为实现高效查询,常采用联合外键设计,确保数据一致性的同时提升关联效率。
表结构设计示例
字段名类型说明
product_idBIGINT商品唯一ID
category_idINT所属分类
brand_idINT品牌ID
supplier_idINT供应商ID
关联查询SQL示例
SELECT 
  p.name AS product_name,
  c.name AS category_name,
  b.name AS brand_name,
  s.name AS supplier_name
FROM products p
JOIN categories c ON p.category_id = c.id
JOIN brands b ON p.brand_id = b.id
JOIN suppliers s ON p.supplier_id = s.id
WHERE p.status = 'active';
该查询通过四表JOIN实现完整信息拉取,适用于后台管理或商品详情页场景。索引优化建议:在category_id、brand_id、supplier_id上建立复合索引,显著提升查询性能。

4.2 博客系统文章-评论-用户-角色信息的完整拉取

在构建博客系统的数据访问层时,需实现对文章、评论、用户及角色信息的联合查询。通过一次高效的数据拉取操作,减少多次往返数据库的开销。
关联查询设计
使用左连接(LEFT JOIN)确保即使某些评论未绑定用户,也能保留文章数据:
SELECT 
    p.title AS article_title,
    c.content AS comment_content,
    u.username,
    r.role_name
FROM posts p
LEFT JOIN comments c ON p.id = c.post_id
LEFT JOIN users u ON c.user_id = u.id
LEFT JOIN roles r ON u.role_id = r.id;
上述SQL语句从`posts`表出发,逐级关联下游实体。其中,`c.post_id`关联文章与评论,`u.id`确保用户唯一性,`r.role_name`提供权限上下文。
字段映射逻辑
  • article_title:标识内容主题
  • comment_content:展示用户交互内容
  • username:体现发言者身份
  • role_name:用于前端权限渲染判断

4.3 组织架构中部门-员工-职位-权限的多层数据获取

在企业级系统中,组织架构的数据通常呈现为“部门-员工-职位-权限”的多层级关联结构。为了高效获取完整信息,需采用递归查询或联表加载策略。
数据模型关系
  • 部门:包含多个员工,具备层级嵌套特性
  • 员工:隶属于某部门,关联一个或多个职位
  • 职位:定义角色职责,并绑定具体权限集
  • 权限:最小访问控制单元,如“读取用户列表”
SQL 联查示例
SELECT 
  d.name AS department,
  e.name AS employee,
  p.title AS position,
  perm.action AS permission
FROM employees e
JOIN departments d ON e.dept_id = d.id
JOIN positions p ON e.pos_id = p.id
JOIN permissions perm ON p.perm_id = perm.id;
该查询一次性拉取四层关联数据,适用于静态权限场景。每条记录表示一名员工在其职位下所拥有的具体权限。
性能优化建议
对于深层嵌套结构,可引入缓存机制(如 Redis)预加载部门树,结合懒加载按需获取子节点数据,减少数据库压力。

4.4 使用ThenInclude处理可为空的中间导航属性

在EF Core中,当使用`Include`进行关联数据加载时,若中间导航属性可能为null,直接链式调用`ThenInclude`可能导致异常。为此,EF Core提供了安全的延迟加载机制,允许开发者通过条件判断规避空引用。
安全使用ThenInclude的模式
推荐采用`Include`与`ThenInclude`组合前,确保路径上的导航属性已正确配置为可空引用类型,并在查询中显式处理可能的null情况。
var result = context.Authors
    .Include(a => a.Blog)
    .ThenInclude(b => b.Posts)
    .ToList();
上述代码中,若`Blog`为null,则EF Core自动跳过`Posts`的加载,不会抛出异常。该行为依赖于数据库映射配置中的可空性声明。
配置建议
  • 确保实体类中导航属性正确使用可空引用类型(如Blog?)
  • 在OnModelCreating中明确配置外键约束与级联行为

第五章:结语:掌握ThenInclude,构建高效的数据访问层

优化多层级关联查询的实践
在处理复杂对象图时,ThenInclude 是 Entity Framework Core 中实现级联加载的关键工具。例如,从订单加载客户及其地址信息时,需精确控制导航属性的加载路径。

var orderDetails = context.Orders
    .Include(o => o.Customer)
        .ThenInclude(c => c.Addresses)
    .Include(o => o.OrderItems)
        .ThenInclude(oi => oi.Product)
    .Where(o => o.OrderDate >= startDate)
    .ToList();
该查询确保相关实体一次性加载,避免了 N+1 查询问题,显著提升数据访问性能。
常见陷阱与规避策略
  • 过度使用 ThenInclude 可能导致生成复杂的 SQL 查询,影响执行计划
  • 应结合 Select 投影仅获取必要字段,减少内存占用
  • 对于深度嵌套结构,考虑拆分查询或使用显式加载(Load 方法)
性能对比参考
加载方式查询次数平均响应时间 (ms)
Eager Loading + ThenInclude145
Lazy Loading1 + N320
Explicit Loading398
数据加载流程:
DbContext → 构建 Include 链 → 生成 JOIN 查询 → 执行并填充对象图 → 返回强类型结果
某二级支行网络的设计与实现——配置脚本(1) 【代码】某二级支行网络的设计与实现——配置脚本(1) 阅读详情

相关推荐

使用MLP解决OCR问题(OpenCV)(下)

分类模型:        分类模型涉及的一个比较关键的问题就是输出的10维向量是如何与具体的类别挂钩的。实际上:10维向量的每一位都代表一类,在对于训练集的表达中,如果输入数据是0,则10维向量的第一位赋值为1,其余均为0。即0对应[1,0,0,0,0,0,0,0,0,0]。MLP模型训练完成后,就需要对用户输入的数据所属类别进行判定。这时得到的输出数据基本不可能是正好的所属类为1,其他位置为0

qq_18515405的专栏 1906

EF Core中实现高效多级关联查询的5种方式(Include进阶用法大公开)

掌握EF Core Include多级导航的高效查询技巧,解决复杂关联数据加载难题。涵盖显式加载、ThenInclude链式调用等5种实用方法,提升查询性能与代码可读性,适用于多层级对象模型场景,值得收藏。

CompiGlow的博客 491

【物联网】探索NE555:一款经典的集成电路(超详细)

NE555是一种集成电路,其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块,外部引脚则提供了与其他电路元件进行连接的接口。NE555的设计目的是为了提供一种简单方便的定时器解决方案,它广泛应用于模拟和数字电路中。NE555作为一款经典的集成电路,具备设计简单、易于使用和稳定可靠的特点,在电子领域发展了广泛的应用。从单稳态模式到多稳态模式,再到振荡器模式,NE555可以满足不同的需求,并且可以与其他电路元件灵活组合,扩展其功能。然而,需要注意的是NE555也有一些限制。

Goforyouqp的博客 6万+

EntityFramework Core入门教程-07-级联查询 (关联数据查询)

级联查询 include关键字 注意: 1.IQueryable类型才会有Include,因此不能将Include方法哦FirstOrDefault后面 2.Find方法也不支持Include,Find不属于linq的方法,它是DbSet的方法 常规语法: _context.Enitties .Where(...) .Include(...) .ToList()//FirstOrDefault() 案例:将Club关联的League和Player全部查询出来 var club = contex

weixin_40719943的博客 2841

从Datasheet到可用的Verilog模块:手把手教你为N25Q128 SPI Flash写状态机驱动

本文详细介绍了如何从Datasheet到实现可用的Verilog模块,手把手教你为N25Q128 SPI Flash编写状态机驱动。文章涵盖SPI Flash的核心工作机制、数据手册解析方法、Verilog状态机设计实践以及调试与性能优化技巧,特别适合FPGA开发者和硬件设计工程师参考。

weixin_30596023的博客 176

手把手教你用RC桥式振荡器生成1Hz-1MHz正弦波(附完整电路图)

本文详细介绍了如何从零构建RC桥式振荡器,实现1Hz-1MHz正弦波的生成。通过核心元件选型、参数设计、电路搭建与优化等步骤,帮助读者掌握振荡器的工作原理和实战技巧。特别适合电子实验和信号处理领域的初学者和工程师,附完整电路图和常见问题解决方案。

weixin_30338481的博客 467

EF Core多级关联查询实战:ThenInclude与Include链式调用的最优配置方案

掌握EF Core多级关联查询技巧,高效解决复杂数据加载问题。通过ThenInclude与Include链式调用,精准配置多层级导航属性,提升查询性能与代码可读性。适用于深度关联模型的数据访问场景,值得收藏。

DevPath的博客 371

贝塞尔曲线在机器人路径平滑中的实战应用与优化

本文深入探讨了贝塞尔曲线算法在机器人路径平滑中的核心应用。通过对比G1CBS与G2CBS两种方法,详细阐述了如何实现从切线连续到曲率连续的平滑优化,以满足不同机器人对运动平稳性和效率的需求,并提供了完整的Python代码实现与关键参数调优指南。

weixin_29051811的博客 307

揭秘EF Core多级关联查询:ThenInclude如何提升数据访问性能?

掌握EF Core多级关联查询技巧,高效加载嵌套数据。本文详解EF Core ThenInclude 多级用法,适用于复杂对象关系的数据访问场景,提升查询性能与代码可读性,避免N+1问题,值得收藏

InstrWander的博客 419

数据驱动AI落地:从业务价值到技术实践的全链路方法论

以数据驱动为核心,围绕 AI 落地全链路展开:先建全域数据体系(拉通内外部数据、治理数据质量),再将 AI 嵌入研发、制造、营销、服务等业务链路解决痛点,搭配混合算力架构保障技术落地,辅以 “小场景试错 - 复制” 战略、跨部门团队等方法论。结合美的集团数字化转型实践,最终实现 AI 对业务降本、增效、增收的价值,为企业 AI 转型提供可复用路径。

专注数据驱动领域原创分享。拆解从数据采集、建模分析到业务价值落地的全链路实践,聊决策逻辑、技术工具与场景案例。用通俗语言讲透数据如何赋能业务,与同路人共探数据价值。 1892

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8173

EF Core中Include结合ThenInclude的极限操作:实现五级关联零延迟

掌握EF Core 的 Include 多级导航技巧,轻松实现五级关联查询零延迟。适用于复杂数据模型的高效加载,结合Include与ThenInclude优化性能,减少数据库往返。结构清晰、执行高效,值得收藏。

CodeTrick的博客 1029

最适合入门的100个深度学习项目

本专栏整理了《PyTorch深度学习项目实战100例》,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集。

优快云 精品推荐 12万+

为什么你的EF Core查询总是N+1?ThenInclude多级包含避坑全指南

掌握EF Core 的 ThenInclude 多级加载技巧,有效避免N+1查询性能陷阱。适用于复杂导航属性场景,通过链式包含一次性加载关联数据,提升查询效率。合理使用可大幅减少数据库往返次数,优化应用性能,值得收藏。

PixelGlow的博客 818

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

EF Core ThenInclude链式调用详解:从入门到精通,掌握复杂对象图加载

掌握EF Core 的 ThenInclude 多级关联查询,高效加载复杂对象图。适用于多层级导航属性场景,通过链式调用精准控制数据加载,减少数据库往返,提升性能。深入解析语法结构与最佳实践,值得收藏。

VarChat的博客 754

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【EF Core多级关联查询终极指南】:深入掌握ThenInclude的高级用法与性能优化技巧

掌握EF Core 的 ThenInclude 多级关联查询技巧,解决复杂数据加载难题。涵盖嵌套导航属性查询、性能优化策略与实际应用场景,提升数据访问效率。方法实用,案例清晰,值得收藏。

DeepLens的博客 437

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

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

【EF Core高级数据加载指南】:Include、ThenInclude与AsNoTracking的黄金组合

掌握EF Core包含查询Include技巧,高效加载关联数据。详解Include、ThenInclude与AsNoTracking的协同使用,提升查询性能,避免循环引用和数据冗余。适用于复杂对象图场景,优化数据库访问效率,值得收藏。

BytePulse的博客 962

(EF Core多级包含性能优化秘籍):ThenInclude与Split Queries的黄金搭配方案

掌握EF Core的多级关联查询性能瓶颈?本文深入解析EF Core的ThenInclude多级加载与Split Queries的协同优化方案,适用于复杂对象图场景。通过拆分查询减少数据冗余,显著提升查询效率,内存占用降低50%以上,值得收藏。

InstrIsle的博客 634

【EF Core性能调优实战】:ThenInclude多层包含的5种正确写法,第3种90%的人用错

掌握EF Core 的 ThenInclude 多级加载正确用法,解决查询性能瓶颈。详解5种写法适用场景,揭示90%开发者易错的第三种模式,提升数据访问效率。涵盖链式调用与集合导航优化技巧,值得收藏。

FastProceed的博客 901

【EF Core ThenInclude 多级加载终极指南】:掌握高效数据查询的5大核心技巧

掌握EF Core ThenInclude 多级加载技巧,高效解决复杂数据查询难题。适用于多层级关联实体场景,详解5种优化方法,提升查询性能与代码可读性,避免N+1问题。实用指南值得收藏。

ProceGlow的博客 347

揭秘EF Core ThenInclude多级嵌套:如何避免常见陷阱并提升数据加载效率

掌握EF Core 的 ThenInclude 多级嵌套技巧,轻松解决复杂关联数据加载难题。适用于一对多、多对多场景,通过合理链式调用提升查询效率,避免N+1问题。优化性能的同时确保数据完整性,值得收藏。

DebugLoom的博客 313

EF Core多级关联查询难题:如何正确使用ThenInclude避免N+1问题?

掌握EF Core多级关联查询难题的解决方案,详解如何通过ThenInclude实现高效多级导航属性加载。避免N+1查询问题,提升数据访问性能,适用于复杂对象关系场景。正确使用Include与ThenInclude链式调用,优化查询效率,值得收藏。

CompiGap的博客 296

EF Core多级关联加载全解析,彻底搞懂ThenInclude与Split Queries的取舍之道

掌握EF Core Include 多级导航的正确用法,彻底解决关联数据加载难题。深入解析ThenInclude与Split Queries的适用场景、性能差异及最佳实践,提升查询效率。多级关联加载全方案,值得收藏。

CompiGap的博客 419

【EF Core性能优化关键】:ThenInclude多级包含的3种高效写法,你掌握了吗?

掌握EF Core ThenInclude多级关联查询优化技巧,提升数据访问性能。详解三种高效写法及其适用场景,避免N+1查询问题,实现流畅的数据加载。方法实用,值得收藏。

ProceShoal的博客 453

EF Core中Include多级关联到底能嵌几层?90%开发者忽略的关键性能瓶颈

深入解析EF Core的Include多级导航性能瓶颈,揭示多层关联查询的最佳实践。涵盖真实应用场景、避免笛卡尔积的核心技巧及提升查询效率的关键方法,助你写出高性能数据访问代码。值得收藏

BytePulse的博客 1043

揭秘EF Core Include多级关联查询:如何避免N+1性能陷阱并提升数据加载效率

掌握EF Core Include多级导航查询技巧,有效避免N+1性能问题。适用于复杂实体关联场景,通过显式加载和ThenInclude实现高效数据获取,提升查询性能。合理使用可大幅减少数据库往返次数,优化应用响应速度,值得收藏。

SimSolve的博客 410
上一篇: 必须掌握的3种.NET MAUI 文件选择器用法:提升用户体验的关键一步
下一篇: 事件多播委托移除难题,如何避免程序运行时异常崩溃?
SimTrans
博客等级 码龄1年 158粉丝 2004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值