为什么你的MyBatis foreach无法正确遍历Map?揭秘参数命名的隐藏规则

第一章:MyBatis foreach循环Map参数的常见误区

在使用 MyBatis 进行数据库操作时,foreach 标签常用于处理集合类型的参数,例如数组、List 或 Map。然而,当 foreach 用于遍历 Map 类型参数时,开发者常常陷入一些不易察觉的误区,导致 SQL 执行异常或结果不符合预期。

Map 的键与值访问方式错误

在 foreach 中遍历 Map 时,每个元素是一个键值对。此时,应通过 entry.key 和 entry.value 访问键和值,而非直接使用 key 或 value。
<select id="selectByIds" parameterType="map" resultType="User">
  SELECT * FROM user 
  WHERE role_id IN
  <foreach collection="roles" item="entry" open="(" separator="," close=")">
    #{entry.value} <!-- 正确:获取 Map 的值 -->
  </foreach>
</select>
上述代码中,roles 是传入的 Map 参数,item="entry" 表示每次迭代的对象为键值对,需通过 entry.key 获取键,entry.value 获取值。

collection 属性命名不匹配

MyBatis 要求 collection 属性必须与接口方法中传入的 Map 的 key 名称一致。若不一致,则会抛出异常。
  • Java 方法:List selectByIds(@Param("roles") Map roles)
  • XML 中必须使用:collection="roles"
  • 若省略 @Param 注解,应使用 collection="_parameter"

Map 遍历场景对比

场景collection 值item 类型
使用 @Param 注解注解中的名称(如 "roles")Map.Entry
未使用 @Param_parameterMap.Entry

第二章:深入理解MyBatis中Map参数的传递机制

2.1 Map参数在MyBatis中的默认命名规则

当使用Map作为MyBatis映射语句的参数时,框架会自动将Map中的键视为参数名。若未显式指定参数名称,MyBatis将采用默认命名策略。
默认命名机制
对于未使用@Param注解的Map参数,MyBatis直接通过键名匹配SQL中的占位符。例如:
<select id="getUser" resultType="User">
  SELECT * FROM users WHERE id = #{userId} AND status = #{status}
</select>
若传入Map包含键userId和status,MyBatis会自动解析并赋值。
参数映射对照表
Map键名SQL占位符是否匹配
userId#{userId}是
status#{status}是
此机制简化了参数传递流程,适用于动态查询场景。

2.2 @Param注解如何影响Map参数的绑定

在MyBatis中,当DAO接口方法接收多个基本类型或非实体对象参数时,框架无法自动识别其对应关系。此时,@Param注解起到关键作用。
参数绑定机制
使用@Param("key")后,MyBatis会将参数封装进Map,键为注解值,值为实际参数。若未使用该注解,多参数将默认以param1、param2命名。
List<User> findUsers(@Param("dept") String dept, @Param("age") int age);
上述代码中,MyBatis会构建一个Map,包含键值对:{"dept": "IT", "age": 25},可在XML中通过#{dept}和#{age}直接引用。
与Map传参的对比
  • 使用@Param:参数名明确,SQL可读性强
  • 直接传Map:灵活性高,但易出错且不利于维护

2.3 源码解析:SqlNode与Ognl表达式中的参数查找流程

在 MyBatis 的映射解析过程中,`SqlNode` 接口负责动态 SQL 的构建。当遇到如 `` 这类结构时,MyBatis 会将 `test` 属性中的表达式交由 OGNL(Object-Graph Navigation Language)引擎求值。
参数解析的执行路径
OGNL 表达式中的变量查找依赖于 `OgnlContext` 和根对象(通常为传入的参数对象)。MyBatis 将参数封装为 `BindingTokenParser` 可识别的上下文环境。
// 示例:OGNL 表达式求值调用链
Object value = Ognl.getValue(
    "name",                           // 表达式
    context,                          // OgnlContext
    context.getRoot()                 // 根对象
);
上述代码中,`"name"` 是从当前参数对象中查找的属性或键名。若参数为 POJO,则尝试调用 getter;若为 Map,则按 key 查找。
参数查找顺序
  • 首先检查 `_parameter` 是否为 Map 类型,优先匹配键名
  • 其次尝试通过反射访问属性(适用于 JavaBean)
  • 最后支持内置变量如 `_databaseId`

2.4 实验验证:无@Param时map、parameterMap与collection的行为差异

在 MyBatis 中,当方法参数未使用 @Param 注解时,框架会自动将参数封装为默认的 Map 类型。此时,不同参数类型在 SQL 映射中的引用行为存在显著差异。
参数绑定机制对比
  • 单一参数:直接通过 #{param1} 访问
  • 多个参数:自动封装为 param1, param2, ... 的命名映射
  • 集合类型(List/Set):必须使用 collection 关键字引用,如 #{list} 实际需写为 collection
代码示例与分析
<select id="selectByIds" resultType="User">
  SELECT * FROM user WHERE id IN 
  <foreach collection="list" item="id" open="(" separator="," close=")">
    #{id}
  </foreach>
</select>
上述 XML 映射中,即使传入参数名为 list,MyBatis 在无 @Param 时仍要求使用默认关键字 collection 而非变量名,否则抛出异常。
参数类型引用方式注意事项
Listcollection 或 list无 @Param 时仅 collection 有效
Arrayarray 或 collection优先使用 array 提高可读性

2.5 常见错误堆栈分析:Invalid bound statement与BindingException解读

在使用 MyBatis 进行持久层开发时,`Invalid bound statement (not found)` 与 `BindingException` 是高频出现的异常,通常指向映射配置未正确加载或绑定。
常见触发场景
  • Mapper 接口与 XML 文件命名空间不匹配
  • SQL ID 在 XML 中不存在或拼写错误
  • Spring Boot 未扫描到 Mapper 接口
  • XML 文件未被编译至目标 classpath
典型异常堆栈片段
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.example.mapper.UserMapper.selectById
该异常表明 MyBatis 无法通过接口方法定位到对应的 SQL 映射语句。核心原因是:MyBatis 使用接口全限定名 + 方法名作为 key 查找 SQL,若 XML 中 namespace 不一致或语句未定义,则查找失败。
解决方案对照表
问题原因解决方案
namespace 不匹配确保 XML 中 namespace 等于 Mapper 接口的全类名
XML 未被加载检查 pom.xml 是否包含 <resources> 配置以包含 *.xml

第三章:foreach标签处理Map的核心原理

3.1 foreach标签语法详解及其对Map的支持特性

`foreach` 标签是 MyBatis 动态 SQL 中处理集合遍历的核心工具,支持 List、Array 和 Map 等多种数据结构。
基本语法结构
<foreach collection="mapKey" item="entry" open="(" separator="," close=")">
    #{entry.key} = #{entry.value}
</foreach>
其中,`collection` 指定要遍历的参数名;`item` 为当前元素别名;`open` 和 `close` 定义起止符号;`separator` 设置分隔符。
对Map的特殊支持
当传入参数为 Map 类型时,MyBatis 允许直接访问其键值对。通过 `entry.key` 和 `entry.value` 可分别获取键与值,适用于构建动态 IN 条件或更新语句。
  • 若 collection 为 Map,其 key 自动作为索引,value 为元素值
  • 在多参数场景下,需使用 @Param 注解显式命名 Map 参数

3.2 collection属性应如何正确指向Map类型的参数

在MyBatis中,当使用<foreach>标签遍历Map类型参数时,collection属性的值必须与Mapper接口中@Param注解指定的名称一致。
Map参数传递示例
public List<User> selectUsersByIds(@Param("userMap") Map<String, List<Integer>> map);
上述代码中,Map参数被命名为userMap,因此在XML中必须使用相同名称。
XML映射配置
<select id="selectUsersByIds" resultType="User">
  SELECT * FROM users
  WHERE id IN
  <foreach item="item" index="key" collection="userMap.values" open="(" separator="," close=")">
    #{item}
  </foreach>
</select>
此处collection="userMap.values"正确指向Map的值集合,index接收键名,item为值对象。若忽略@Param命名或拼写错误,将导致“Invalid bound statement”异常。

3.3 item、index、separator在遍历Map时的实际作用解析

在模板引擎中遍历Map时,`item`、`index`和`separator`是控制输出结构的关键参数。
核心参数说明
  • item:代表当前迭代的键值对,通常以 key=value 形式暴露
  • index:从0开始的整数索引,标识当前项的位置
  • separator:置于每两项之间的分隔字符串,避免末尾冗余
典型代码示例
range $key, $value := .UserMap
  {{if $index}} | {{end}}{{$key}}: {{$value}}
该代码通过判断 $index 是否为0来决定是否插入分隔符,等效于使用 separator=" | " 的声明式写法,提升可读性。
输出控制对比
参数用途
item访问键和值
index条件渲染位置逻辑
separator简化分隔处理

第四章:解决Map遍历失败的实践方案

4.1 使用@Param显式命名Map参数的最佳实践

在MyBatis中,当DAO接口方法需要传递多个参数时,使用@Param注解显式命名参数是推荐做法。它不仅提升代码可读性,还避免因参数顺序变化导致的运行时错误。
为什么要使用@Param?
MyBatis默认将多个基本类型或POJO参数封装为Map,键名为param1、param2等。通过@Param("name")可自定义键名,使SQL更清晰。
public interface UserMapper {
    List<User> findByCondition(
        @Param("username") String username,
        @Param("status") Integer status
    );
}
上述代码中,XML映射文件可直接使用#{username}和#{status},语义明确。
最佳实践建议
  • 所有多参数方法均应使用@Param注解
  • 参数名应具有业务含义,避免使用p1、arg0等无意义名称
  • 结合动态SQL使用时,能有效避免空值判断错误

4.2 在XML中通过_parameter访问默认Map参数的技巧

在MyBatis的XML映射文件中,当传递多个简单类型参数或未命名参数时,框架会自动将它们封装到一个默认的`Map`中,并可通过_parameter关键字进行访问。
参数绑定机制
当执行如selectList(Object parameter)方法时,若传入的是单个Map或多个@Param注解参数,MyBatis会将其整合为内部参数映射。此时使用_parameter可直接引用该Map。
<select id="findUser" resultType="User">
  SELECT * FROM users 
  WHERE name = #{_parameter['name']} 
    AND age = #{_parameter['age']}
</select>
上述代码中,_parameter代表传入的Map参数,通过键名访问具体值,适用于动态SQL构建场景。
适用场景与注意事项
  • 适用于未使用@Param注解的多参数传递
  • 在OGNL表达式中支持复杂取值逻辑
  • 建议配合<if test>实现条件判断

4.3 复合参数场景下Map与其他类型共存的处理策略

在复杂接口设计中,常需将 Map 类型与基础类型、结构体等共同作为方法参数传递。为确保数据清晰且易于维护,推荐使用封装结构体的方式统一管理复合参数。
结构体封装策略
通过结构体整合 Map 与其他类型,提升可读性与类型安全性:

type RequestParams struct {
    UserID   int               `json:"user_id"`
    Metadata map[string]string `json:"metadata"`
    Active   bool              `json:"active"`
}
上述代码定义了一个包含整型、字符串映射和布尔值的结构体。Metadata 可动态扩展,UserID 和 Active 则保留强类型约束,便于 JSON 解析与校验。
使用场景对比
方式可维护性类型安全适用场景
纯 Map低弱高度动态字段
结构体 + Map 字段高强混合静态/动态参数

4.4 单元测试驱动:编写可验证的foreach遍历Map用例

在Java开发中,确保Map遍历逻辑的正确性是保障数据处理一致性的关键。通过单元测试驱动开发(TDD),可以提前定义行为预期,提升代码可靠性。
测试用例设计原则
  • 覆盖空Map、单元素、多元素等边界场景
  • 验证键值对的完整性和遍历顺序(如LinkedHashMap)
  • 断言副作用操作,如集合修改或外部状态变更
示例代码与验证逻辑
@Test
public void testForEachTraversal() {
    Map<String, Integer> map = new HashMap<>();
    map.put("a", 1);
    map.put("b", 2);

    List<String> keys = new ArrayList<>();
    map.forEach((k, v) -> keys.add(k));

    assertEquals(2, keys.size());
    assertTrue(keys.contains("a"));
    assertTrue(keys.contains("b"));
}
该测试通过收集遍历过程中访问的键,验证是否完整覆盖所有条目。使用forEach方法结合Lambda表达式,确保函数式风格的遍历逻辑可预测且易于测试。参数(k, v)分别代表当前键值对,循环体内应避免修改原Map以防止并发异常。

第五章:总结与建议

性能优化的实践路径
在高并发系统中,数据库查询往往是瓶颈所在。通过引入缓存层可显著降低响应延迟。以下是一个使用 Redis 缓存用户信息的 Go 示例:

// 查询用户信息,优先从 Redis 获取
func GetUser(id int) (*User, error) {
    key := fmt.Sprintf("user:%d", id)
    val, err := redisClient.Get(context.Background(), key).Result()
    if err == nil {
        var user User
        json.Unmarshal([]byte(val), &user)
        return &user, nil
    }
    // 缓存未命中,查数据库
    user := queryFromDB(id)
    jsonData, _ := json.Marshal(user)
    redisClient.Set(context.Background(), key, jsonData, 5*time.Minute)
    return user, nil
}
技术选型的权衡清单
合理的技术栈选择直接影响系统长期维护成本。以下是微服务架构下常见组件的对比参考:
组件类型候选方案适用场景运维复杂度
服务发现Consul多数据中心高
服务发现EurekaSpring Cloud 生态中
消息队列Kafka高吞吐日志处理高
消息队列RabbitMQ业务解耦、延迟消息中
持续交付的关键步骤
实现高效 CI/CD 流程需遵循标准化流程:
  • 代码提交触发自动化测试套件
  • 通过后构建镜像并打标签(如 git commit hash)
  • 部署至预发布环境进行集成验证
  • 执行蓝绿部署或金丝雀发布策略
  • 监控关键指标(延迟、错误率、QPS)
吃透MyBatis底层原理:从JDBC封装到Spring Boot整合实战 MyBatis本质是对JDBC使用模式的标准化封装,其核心在于将SQL执行抽象为SqlSession工作单元、Mapper动态代理与配置驱动的执行链路。理解其原理需回归JDBC原始痛点——参数绑定脆弱、结果映射冗余、资源管理易错,进而掌握SqlSession生命周期、Executor执行器机制及XML与注解双轨制的工程权衡。技术价值体现在提升SQL可治理性、支持插件化横切(如分页/日志)、实现线程安全的数据库会话隔离;典型应用场景包括Spring Boot中多数据源路由、二级缓存集成Redis、动态SQL精 阅读详情

相关推荐

Java异常处理核心原理与企业级实践指南

Java异常处理是JVM层面的结构化控制流机制,而非简单的错误兜底。其本质基于Throwable继承体系,通过Checked/Unchecked异常分类实现编译期契约与运行时语义分离。throw语句触发athrow字节码指令,throws声明构建调用链异常契约,而try-with-resources等语法糖背后是异常抑制(addSuppressed)与资源确定性释放的底层保障。该机制的技术价值在于将外部故障(如IO超时)与编程错误(如空指针)解耦,支撑高可用系统中的分级响应、全链路追踪与业务指标化。本文聚焦

weixin_33888907的博客 316

Mybaits 使用过程中mapper.xml foreach List<String[]>的时候报错

摘要:本文分析了MyBatis中#{}和${}的核心区别,解释了为何在动态SQL中使用#{}会报错。#{}采用预编译参数占位符,安全但只能替换参数值;${}直接拼接SQL,存在注入风险但支持动态语法。针对rangeItem参数未找到的问题,给出两种解决方案:1)使用${}直接拼接(需注意注入风险);2)将列表元素封装为对象后使用#{}安全调用。最后强调应根据场景选择合适方式,动态语法用${}需手动过滤,普通参数优先使用#{}。

小夏卷编程的博客,欢迎大家留言讨论 978

Cursor架构师模式与静默审查:系统级代码治理实战

在现代软件工程中,代码质量已不止于语法正确,更关乎系统一致性、契约合规性与工程意图的准确表达。架构师模式通过构建项目拓扑图、领域契约库和约束规则集,实现从文件级补全到系统级影响推演的跃迁;静默审查则基于控制流、数据流与框架语义建模,识别N+1查询、硬编码配置、事务缺失等典型工程隐患。二者共同构成面向真实生产环境的轻量级静态治理能力,适用于微服务拆分评估、遗留系统重构、中级开发者能力进阶等高价值场景。

weixin_34128839的博客 345

MyBatis详解八股文

Mybatismybatis简介什么是框架?为什么要用框架?Mybatis的发展史myBatis的优点Mybatis配置mybatis.xml配置文件 mybatis简介 MyBatis 是支持定制化 SQL以及高级映射(ORM)的优秀的持久层框架。 什么是框架?为什么要用框架? 1、框架即framework 其实就是某种应用的半成品,就是一组组件,供你选用完成自己的系统。 简单理解就是一套资源,包含jar包、源码、帮助文档、示例等 2、为什么要用框架 使用别人成熟的框架,就相当于让别人帮你完成一些基础工作

韩小兔修媛史的博客 231

钉钉Java面经及参考答案

TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自

大模型大数据攻城狮的专栏 238

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

面试问题总结

文章目录1.abstract和interface异同2.构造方法3.final关键字作用4.重写和重载的区别4.1重载4.2重写5.this关键字6.封装的作用,实现封装的步骤7.封装中的getter和setter方法分别作用7.1setter方法7.2getter方法8.Mybatis-plus与Spring Data JPA9.装箱和拆箱9.1装箱9.2拆箱10.ArrayList底层原理11.反射12.Filter13.$与#的区别14.js中的DOM对象与jQuery中的DOM区别15.四大元注解1

肥猫不是猫 1111

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

练功秘籍---A

常用整理

CarryBest的博客 1650

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

在windows上,在WSL 2(windows subsystem linux) 里一步步安装vLLM

本文介绍了在Windows系统上通过WSL2配置GPU加速的AI开发环境的完整流程。主要包括四个步骤: 1)安装WSL2并配置Ubuntu环境; 2)安装NVIDIA驱动和CUDA工具包; 3)搭建Python虚拟环境并安装vLLM; 4)验证环境并启动AI模型服务。

2601_96126911的博客 421

JavaWeb学习

#前端部分(了解)课程思路、前端要素(Web了解、html、JS、vue、ajax、Element等)传统路线现在课程大纲路线## 前端要素(Web了解、html)HTML语法特点基本标签html标签(span)html标签(a)html标签(video)盒子模型:html标签(div)html标签(表格)html标签(表单)## 前端要素(JS)JS引入方式JS基础语法JS函数JS对象(基础(只关注Array、String、JSON)、BOM、DOM)JS事件监听## 前端要素(Vue)插值表达式Vue常

qq_2634545805的博客 430

用STM32L552驱动AD9102:一个硬件工程师的实战避坑指南(附完整代码)

本文详细介绍了如何使用STM32L552微控制器驱动AD9102任意波形发生器芯片,从硬件设计到波形生成的完整实战指南。内容包括电源架构、时钟电路设计、输出调理电路等关键硬件设计要点,以及软件驱动架构、波形存储优化和典型波形生成实例。通过实战经验分享,帮助硬件工程师避开常见设计陷阱,提升开发效率。

weixin_30889885的博客 333

JavaWeb知识点

1.Maven中的仓库用来存储什么的?Maven的仓库是用来存储和管理jar包的2.Maven中有哪几类仓库?查找依赖(jar)的顺序是什么样的?本地仓库(1)远程仓库(2)中央仓库(3)

ql200106的博客 304

峰岹FU6832L双核电机控制芯片实战:从FOC算法到BLDC/PMSM驱动开发

在嵌入式系统和电机控制领域,磁场定向控制(FOC)是实现无刷直流电机(BLDC)和永磁同步电机(PMSM)高效、平稳运行的核心算法。其原理是通过坐标变换将三相交流量分解为直流量,实现类似直流电机的转矩与磁场解耦控制,从而提升效率、降低噪音与振动。这项技术的工程价值在于能以更低的处理器开销实现高性能驱动,广泛应用于消费电子、工业自动化与智能家电。本文以峰岹FU6832L芯片为例,深入解析其独特的双核架构——将实时性要求极高的FOC运算交由专用硬件引擎处理,解放主控CPU处理应用逻辑,并结合PID参数整定、电流

weixin_29570795的博客 512

CVE-2021-3156本地提权漏洞复现

受影响版本 sudo: 1.8.2 - 1.8.31p2 sudo: 1.9.0 - 1.9.5p1 测试 我这里是在本地centos7上进行测试。 需要目标机器上存在python编译器、目标主机出网或者能上传文件到目标主机。 以非root用户登录系统,并运行如下命令: sudoedit -s / 通常响应一个以 sudoedit: / 开头的报错,多半存在漏洞。 利用 提权脚本: https://www.o2oxy.cn/wp-content/uploa

The current road is different, love needs to distinguish between right and wrong 3780

数据字段集管理:从字符串列表到健壮模型的工程实践

在数据处理与接口设计中,对一组特定字段的管理是常见需求,这通常涉及字段过滤、校验与动态纳排。其核心概念在于将字段从简单的字符串列表抽象为包含元信息的对象模型,以实现类型安全与逻辑复用。这一设计模式的技术价值在于提升代码可维护性,避免因业务膨胀导致的逻辑混乱。其应用场景广泛,涵盖API字段过滤、表单校验、数据库查询优化以及规则引擎条件配置。通过构建不可变的字段集(FieldSet)并提供并集、差集等集合操作,可以清晰、高效地实现复杂的动态纳排逻辑,例如在用户信息脱敏和权限控制中,结合配置化与面向对象设计,能有

weixin_30553777的博客 354

利用AWVS进行反制

awvs 10.5下载 http://www.32r.com/soft/12986.html

渗透之路,攻防之间皆学问 6653

前端学 Java 课程笔记

面向前端开发人员:大量以前端概念类比

estrusKing的博客 230

车载以太网-组播

车载以太网-组播

天赐好车的博客 253

【AMD | Docker】超级全面版本:在Docker中验证AMD GPU移动显卡可用性的方法

1. 安装ROCm Docker支持 ■AMD GPU驱动 ■ROCM ■Docker 2. 配置Docker使用ROCm 3. 使用官方ROCm Docker镜像 4. 使用Docker CLI参数访问GPU

静谧、淡雅 684

JavaSE『学习笔记』

本教程以 JDK8 为主,新版本与新特性以介绍与使用为辅。

小哞^同^学的技术博客 1237

Python爬虫实战:利用Selenium与Playwright抓取美团外卖数据

在当今大数据时代,网络数据采集已成为商业分析和市场研究的重要手段。本文以美团外卖平台为例,详细介绍如何使用Python最新爬虫技术(Selenium、Playwright)进行数据采集,并探讨相关技术原理、反爬应对策略及数据存储方案。通过5000+字的详细讲解和完整代码示例,帮助读者掌握现代网络爬虫开发的核心技能。本文详细介绍了使用Python最新爬虫技术采集美团外卖数据的完整流程,涵盖了从环境配置、页面分析到数据存储的全链路解决方案。

2201_76125261的博客 2550

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Redis企业实战:从基础到高级架构的完整指南(不全)

《Redis企业级实战与高级架构》课程摘要 本课程全面讲解Redis从基础到企业级应用的完整知识体系,分为基础篇、实战篇和高级篇三部分,总时长超过13小时。 基础篇(12章): 系统讲解Redis核心概念、安装部署和5种数据结构 详细演示String/Hash/List/Set/ZSet等命令操作 深入讲解Key层级设计、通用命令和图形化工具 实战篇(30章): 通过黑马点评项目实现短信登录、商户缓存等10大业务场景 解决缓存穿透/击穿/雪崩问题,实现分布式锁方案 使用Lua脚本、Redisson和消息队列

2501_90864902的博客 267

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: Stream操作总出错?map和flatMap的5大使用场景对比,开发老手都在看
下一篇: 掌握这3种RememberMe配置模式,轻松实现无感知安全登录
FuncFun
博客等级 码龄1年 133粉丝 1996原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值