58、Linux系统中CPU亲和性、调度策略与cgroups的深入解析

Linux系统中CPU亲和性、调度策略与cgroups的深入解析

1. 使用taskset进行CPU亲和性设置

在Linux系统中,我们可以使用用户空间工具 taskset 来获取或设置进程(或线程)的CPU亲和性掩码。以下是具体操作步骤:
- 查询系统进程 systemd (PID为1)的CPU亲和性掩码 :

$ taskset -p 1
pid 1's current affinity mask: 3f 
$

这里的 0x3f 转换为二进制是 0011 1111 ,表示该进程(这里是 systemd )可以在所有6个CPU核心上运行。
- 使用 taskset 运行编译器,确保GCC及其派生进程仅在头两个CPU核心上运行 :

$ taskset 03 gcc userspc_cpuaffinity.c -o userspc_cpuaffinity -Wall -O3

其中, 03 的二进制是 0011 ,代表仅使用头两个CPU核心。

此外, schedtool(8) 工具也可用于获取或设置给定线程/进程的CPU亲和性掩码。

1.1 设置内核线程的CPU亲和性掩码

若要演示一种名为每CPU变量的同步技术,需要创建两个内核线程,并确保它们分别在不同的CPU核心上运行。为实现这一点,需明确设置每个内核线程的CPU亲和性掩码,使其不同且不重叠。例如,将第一个内核线程的亲和性掩码设为0,第二个设为1,以保证它们分别仅在CPU核心0和1上执行。

1.2 非导出符号的使用问题

在模块内部设置CPU亲和性并非易事,因为内核中用于设置CPU亲和性位掩码的API sched_setaffinity() 虽存在但未导出。以往,模块开发者会使用 kallsyms_lookup_name() 函数查找内核中的符号并获取其地址,然后将该地址作为函数指针调用。然而,从内核版本5.7开始, kallsyms_lookup_name() 和 kallsyms_on_each_symbol() 函数被取消导出。

现在,我们可以通过 /proc/kallsyms 伪文件查找内核符号,但前提是拥有root权限。并且,由于内核地址空间布局随机化(KASLR)的存在,每次启动时该值都会改变,不能硬编码。因此,我们需要编写一个小包装脚本,将通过 /proc/kallsyms 查找到的 sched_setaffinity() 例程的地址作为参数传递给模块。

以下是相关代码片段:

// ch13/3_lockfree/percpu/percpu_var.c
[ … ]
static unsigned long func_ptr;
module_param(func_ptr, ulong, 0);
unsigned long (*schedsa_ptr)(pid_t, const struct cpumask *) = NULL;
[ … ]
// set up the function pointer
schedsa_ptr = (unsigned long (*)(pid_t pid, const struct cpumask *in_mask))
func_ptr;
[ … ]
      /* pr_info("setting cpu mask to cpu #%u now...\n", cpu); */
cpumask_clear(&mask);
cpumask_set_cpu(cpu, &mask); // 1st param is the CPU number, not bitmask
/* !HACK! sched_setaffinity() is NOT exported, we can't call it
     * sched_setaffinity(0, &mask);  // 0 => on self 
 * so we invoke it via it's function pointer
 */
ret = (*schedsa_ptr)(0, &mask);  // 0 => on self
[ … ]

虽然这种方法可行,但不建议在生产环境中使用。

2. 查询和设置线程的调度策略与优先级

2.1 用户空间查询和设置

在用户空间,我们可以使用 chrt 工具查询或设置线程的调度策略和优先级。 chrt 内部调用 sched_getattr() 系统调用进行查询,使用 sched_setattr() 系统调用进行设置。此外,内核还提供了 sched_{g,s}etscheduler() 及其 pthread 库包装API pthread_{g,s}etschedparam() 。

2.2 内核线程的调度策略和优先级设置

Linux内核包含内核线程(kthreads),它们是可调度实体,其调度策略和优先级可通过编程方式查询或设置。在用户空间,现代首选的系统调用是 sched_getattr() 和 sched_setattr() ,但在内核中,情况有所不同。

从内核版本5.9开始,旧的设计存在问题,可能导致CPU调度和资源管理混乱。因此,引入了新的API:
- sched_set_fifo(p) :创建一个FIFO任务,优先级为50。
- sched_set_fifo_low(p) :创建一个优先级高于NORMAL的任务,最终为优先级1的FIFO任务。
- sched_set_normal(p, nice) :将任务设置为正常调度策略(SCHED_NORMAL),并将nice值设置为第二个参数。

这些API是GPL导出的,只能由遵循GNU GPL许可的模块使用。

2.3 实际示例 - 线程化中断处理程序

内核在处理线程化中断时会创建专用的内核线程,使用SCHED_FIFO调度策略和优先级50。以下是相关代码路径:

static int
setup_irq_thread(struct irqaction *new, unsigned int irq, bool secondary)
{
        struct task_struct *t;
        if (!secondary) {
                t = kthread_create(irq_thread, new, "irq/%d-%s", irq,
                                   new->name);
        } else {
                t = kthread_create(irq_thread, new, "irq/%d-s-%s", irq,
                                   new->name);
        }
        [ … ]

kthread_create() 宏负责创建内核线程, irq_thread() 内核API会设置调度策略和优先级:

/* Interrupt handler thread */
static int irq_thread(void *data)
{
        struct callback_head on_exit_work;
        struct irqaction *action = data;
        [ ... ]
        sched_set_fifo(current);
        [ ... ]
}

2.4 操作步骤总结

操作 步骤
查询线程调度策略和优先级 使用 chrt 工具,内部调用 sched_getattr() 系统调用
设置线程调度策略和优先级 使用 chrt 工具或 sched_setattr() 系统调用
设置内核线程调度策略和优先级 使用 sched_set_fifo() 、 sched_set_fifo_low() 和 sched_set_normal() API

2.5 流程图

graph TD;
    A[开始] --> B[查询线程调度策略和优先级];
    B --> C{选择操作};
    C -->|查询| D[使用chrt工具];
    C -->|设置用户空间线程| E[使用chrt或sched_setattr系统调用];
    C -->|设置内核线程| F[使用新API];
    D --> G[结束];
    E --> G;
    F --> G;

3. cgroups简介

3.1 背景

早期的调度算法虽承诺实现完全公平调度,但实际并非如此。例如,在多个用户登录Linux服务器的情况下,若其中一个用户编写的程序大量创建CPU密集型线程,会导致CPU带宽分配不公平。

3.2 cgroups的作用

cgroups是一种内核特性,允许系统管理员(或拥有root权限的用户)对系统的各种资源(如CPU、内存、块I/O带宽等)进行优雅的带宽分配和细粒度的资源管理。

3.3 示例

假设有十个用户登录Linux系统,若将所有进程置于同一个cgroup中并启用cgroups的CPU控制器,在CPU竞争时,每个进程将获得公平的CPU份额。系统管理员还可将系统划分为多个cgroups,为每个cgroup分配所需的资源。

3.4 启用cgroups

启用cgroups很简单,通过配置内核来实现。相关菜单为 General setup | Control Group support 。具体操作步骤如下:
1. 使用 grep 命令在内核配置文件中查找 CGROUP 。
2. 若需要,调整内核配置。
3. 重新编译内核。
4. 使用新内核重启系统并进行测试。

3.5 cgroups的发展

cgroups自2.6.24版本引入后不断发展,后来出现了cgroups v2。目前,cgroups v1和v2可共存,但许多应用和框架仍在使用cgroups v1。建议使用cgroups v2,其官方文档可参考 内核6.1的文档 。

3.6 操作步骤总结

操作 步骤
启用cgroups 配置内核,通过 make menuconfig 进入 General setup | Control Group support
查询cgroup控制器 使用 grep 命令在核配置文件中查找 CGROUP
调整cgroup配置 修改内核配置文件,重新编译和重启内核

3.7 流程图

graph TD;
    A[开始] --> B[查询cgroup控制器];
    B --> C{是否需要调整};
    C -->|否| D[结束];
    C -->|是| E[调整内核配置];
    E --> F[重新编译内核];
    F --> G[重启系统];
    G --> H[测试];
    H --> D;

综上所述,通过 taskset 设置CPU亲和性、合理配置线程的调度策略和优先级,以及使用cgroups进行资源管理,能够优化Linux系统的性能和资源分配。但在实际应用中,应避免使用非标准的方法,确保系统的稳定性和安全性。

4. cgroups v2的深入使用

4.1 cgroups v2的优势

相较于cgroups v1,cgroups v2具有诸多优势。它解决了v1中存在的一些问题,提供了更简洁、更统一的接口。例如,v2的设计更加模块化,使得资源管理更加灵活。同时,它对资源的隔离性更好,能够更有效地防止资源竞争和滥用。

4.2 cgroups v2的基本概念

在cgroups v2中,有几个重要的概念需要了解:
- 控制组(Control Group) :是一组进程的集合,这些进程共享相同的资源限制和调度策略。
- 控制器(Controller) :用于管理和控制特定类型的资源,如CPU、内存、I/O等。
- 挂载点(Mount Point) :cgroups v2通过挂载点来组织和管理控制组。通常,cgroups v2会挂载到 /sys/fs/cgroup 目录下。

4.3 操作步骤:创建和配置cgroups v2控制组

以下是创建和配置cgroups v2控制组的具体步骤:
1. 挂载cgroups v2 :

sudo mount -t cgroup2 none /sys/fs/cgroup
  1. 创建控制组 :
sudo mkdir /sys/fs/cgroup/my_group
  1. 将进程添加到控制组 :
echo <pid> | sudo tee /sys/fs/cgroup/my_group/cgroup.procs

其中, <pid> 是要添加的进程的ID。
4. 配置资源限制 :
例如,限制CPU使用率:

echo 50000 | sudo tee /sys/fs/cgroup/my_group/cpu.max

这里的 50000 表示CPU使用率限制为50%。

4.4 操作步骤总结

操作 步骤
挂载cgroups v2 使用 sudo mount -t cgroup2 none /sys/fs/cgroup 命令
创建控制组 使用 sudo mkdir /sys/fs/cgroup/<group_name> 命令
添加进程到控制组 将进程ID写入 /sys/fs/cgroup/<group_name>/cgroup.procs 文件
配置资源限制 修改相应的资源控制文件,如 cpu.max 、 memory.max 等

4.5 流程图

graph TD;
    A[开始] --> B[挂载cgroups v2];
    B --> C[创建控制组];
    C --> D[添加进程到控制组];
    D --> E{是否需要配置资源限制};
    E -->|否| F[结束];
    E -->|是| G[配置资源限制];
    G --> F;

5. 综合应用案例

5.1 场景描述

假设我们有一个Linux服务器,同时运行着多个服务,包括Web服务器、数据库服务器和计算密集型任务。为了确保各个服务能够公平地使用系统资源,我们可以使用cgroups v2进行资源管理。

5.2 配置步骤

  1. 创建控制组 :
sudo mkdir /sys/fs/cgroup/web_server
sudo mkdir /sys/fs/cgroup/db_server
sudo mkdir /sys/fs/cgroup/compute_task
  1. 将进程添加到相应的控制组 :
# 假设Web服务器进程ID为1234
echo 1234 | sudo tee /sys/fs/cgroup/web_server/cgroup.procs
# 假设数据库服务器进程ID为5678
echo 5678 | sudo tee /sys/fs/cgroup/db_server/cgroup.procs
# 假设计算密集型任务进程ID为9012
echo 9012 | sudo tee /sys/fs/cgroup/compute_task/cgroup.procs
  1. 配置资源限制 :
    - Web服务器 :
echo 30000 | sudo tee /sys/fs/cgroup/web_server/cpu.max

表示Web服务器的CPU使用率限制为30%。
- 数据库服务器 :

echo 40000 | sudo tee /sys/fs/cgroup/db_server/cpu.max

表示数据库服务器的CPU使用率限制为40%。
- 计算密集型任务 :

echo 20000 | sudo tee /sys/fs/cgroup/compute_task/cpu.max

表示计算密集型任务的CPU使用率限制为20%。

5.3 效果分析

通过上述配置,各个服务能够按照我们设定的资源限制使用CPU资源,避免了某个服务过度占用资源导致其他服务性能下降的问题。同时,使用cgroups v2进行资源管理,使得我们可以根据实际需求灵活调整资源分配,提高了系统的稳定性和可靠性。

5.4 操作步骤总结

操作 步骤
创建控制组 使用 sudo mkdir /sys/fs/cgroup/<group_name> 命令创建多个控制组
添加进程到控制组 将各个服务的进程ID分别写入相应控制组的 cgroup.procs 文件
配置资源限制 根据需要修改各个控制组的资源控制文件,如 cpu.max

5.5 流程图

graph TD;
    A[开始] --> B[创建多个控制组];
    B --> C[将进程添加到相应控制组];
    C --> D[配置资源限制];
    D --> E[结束];

6. 总结与展望

6.1 总结

本文详细介绍了Linux系统中CPU亲和性、线程调度策略和优先级的设置方法,以及cgroups的基本概念和使用。通过 taskset 工具可以方便地设置CPU亲和性,合理配置线程的调度策略和优先级能够优化系统性能。而cgroups,特别是cgroups v2,为系统资源管理提供了强大的功能,能够实现资源的公平分配和细粒度控制。

6.2 展望

随着计算机技术的不断发展,系统资源管理的需求也越来越高。未来,cgroups可能会进一步发展和完善,提供更多的功能和更好的性能。同时,结合其他技术,如容器化技术,cgroups将在云计算、大数据等领域发挥更加重要的作用。在实际应用中,我们应不断学习和掌握这些技术,以提高系统的性能和可靠性。

6.3 注意事项

在使用这些技术时,需要注意以下几点:
- 避免使用非标准的方法进行操作,如在设置CPU亲和性时,尽量避免使用未导出的符号,确保系统的稳定性和安全性。
- 在配置cgroups时,要根据系统的实际情况合理分配资源,避免过度限制或分配不均导致系统性能下降。
- 及时关注技术的发展和更新,如cgroups v2的使用将逐渐成为主流,应尽快掌握并应用。

注意事项 详情
操作规范性 避免使用非标准方法,确保系统稳定安全
资源分配合理性 根据实际情况合理分配cgroups资源
技术更新关注 关注cgroups v2等技术发展并及时应用
graph LR;
    A[操作规范性] --> D[系统稳定安全];
    B[资源分配合理性] --> D;
    C[技术更新关注] --> D;

通过合理运用这些技术,我们可以更好地管理Linux系统的资源,提高系统的性能和可靠性,为各种应用场景提供有力的支持。

相关推荐

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 11 算法篇

在百万级虚拟机、百万级租户的超大规模云环境中,核心算法挑战包括:挑战维度具体问题算法需求技术复杂度规模性​百万级对象并发管理分布式算法、分区算法极高(NP-hard问题)多租户​租户间隔离与资源共享公平性算法、隔离算法高(多目标优化)动态性​资源需求实时变化自适应算法、在线算法高(实时决策)异构性​硬件/负载/需求差异分类算法、匹配算法中高(多维度优化)经济性​资源利用率与成本平衡优化算法、博弈论算法高(多目标博弈)以下是按领域分类的详细算法列表:算法名称数学建模表达核心思想时间复杂度适用场景推理步骤首次适

weixin_49199313的博客 1398

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01

编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有

weixin_49199313的博客 265

【信息科学与工程学】【安全领域】第三十五篇 网络安全算法表02

​分级处理​:实时增量 + 离线全量 + 自动校验三线并行​最终一致优先​:强同步仅用于支付等核心场景​双向容错​:Redis侧:读CK兜底(CK侧:自动屏蔽校验失败分区​业务适配​:graph LR高实时场景 --> Redis写+双重读分析场景 --> 放宽CK同步延迟报表场景 --> T+1校准保障该方案已在京东、美团等千亿级数据平台验证,支撑双11级流量下Redis与ClickHouse的数据协同。

weixin_49199313的博客 1342

【信息科学与工程学】【数据中心】 第十九篇 MFU的优化提升方法03

等级模块类型子模块子子模块功能描述MFU影响因子优化优先级L0​算术逻辑单元(ALU)标量ALU整数ALU标量整数运算α_int = 0.1-0.3中浮点ALU标量浮点运算α_fp_scalar = 0.2-0.4中向量处理单元(VPU)SIMD单元128-bit SIMD短向量运算β_SIMD128 = 0.3-0.6高256-bit SIMD中向量运算β_SIMD256 = 0.4-0.7高512-bit SIMD长向量运算β_SIMD512 = 0.5-0.8极高矩阵处理单元(MPU)Tensor C

weixin_49199313的博客 1011

BLE天线设计避坑:NRF52832官方50欧姆阻抗匹配的3个常见误区

本文深入解析NRF52832蓝牙SoC天线设计中的常见误区,重点探讨50欧姆阻抗匹配的3个关键问题:PCB板材介电常数差异、匹配元件寄生参数及VSWR测试。通过实测数据和优化方案,帮助工程师规避设计陷阱,提升BLE通信性能。

beer8的博客 214

【UE5】映射方式:动作映射(Action Mappings) 与 轴映射(Axis Mappings)

链接:https://pan.baidu.com/s/1nQHvZXC4BDsfbFWDYZqEfA?按下键盘A键,不要抬起,屏幕左上角打印了一次。(和Unity中的轴映射机制类似)下面我们通过测试更直观的了解一下这。抬起键盘A键,屏幕左上角打印了一次。项目资源文末百度网盘自取。再添加一个按键,选择键盘。键,缩放值设置为 2.0。,框选所有测试节点,按下。的情况下,屏幕一直打印。

weixin_64072619的博客 3506

从入门到精通:dirmap 高级 Web 目录扫描实战指南

本文提供了一份从环境搭建到高级配置的dirmap Web目录扫描实战指南。详细解析了工具安装、核心配置文件dirmap.conf的深度调优,包括递归扫描、四种扫描模式(字典、爆破、爬虫、Fuzz)的实战应用,并演示了分阶段资产发现的完整工作流程,帮助安全人员高效发现隐藏目录与敏感文件。

rnn9storyteller的博客 482

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1059

Dify插件实战:实时渲染AI生成的HTML/SVG/Canvas代码

在现代Web开发与AI应用集成中,前端渲染技术是实现动态内容展示的核心。其原理在于浏览器引擎解析HTML、CSS、JavaScript等代码,并将其转换为可视化的用户界面。这项技术的价值在于极大提升了开发效率与用户体验,允许开发者快速构建和迭代交互式应用。在AI应用开发领域,尤其是大语言模型(LLM)集成场景,如何将模型生成的**结构化代码**(如描述UI的HTML或数据图表的SVG)实时转化为可视化组件,成为一个关键需求。这直接关系到**Dify**等低代码AI平台能否提供流畅的、所见即所得的交互体验。本

weixin_42545664的博客 499

告别双系统!用Ventoy把Ubuntu 22.04装进U盘,打造你的随身开发环境(附保姆级避坑指南)

本文详细介绍了如何使用Ventoy将Ubuntu 22.04安装到U盘,打造便携式开发环境。通过即插即用的特性,开发者可以在任何x86电脑上快速启动完整的Ubuntu系统,无需配置双系统或虚拟机。文章提供了从硬件准备到系统优化的全流程指南,帮助用户高效创建随身开发环境。

weixin_31569671的博客 364

硬件电路RS485通信EMC 设计

RS485通讯硬件设计与STM32实现要点 本文详细介绍了RS485通讯系统的硬件设计和STM32实现方案。硬件设计重点包括:采用总线型拓扑结构、120Ω终端电阻匹配、屏蔽双绞线布线、TVS管和自恢复保险丝保护等核心要素。EMC设计强调共模电感抑制干扰、屏蔽层单端接地、光电隔离等技术。软件实现方面,提供了基于STM32F103的完整程序框架,包括UART初始化、收发控制逻辑和中断处理机制,特别强调了收发切换时机、波特率精度等关键注意事项。文中还给出了工业传感器节点的实际应用案例,展示了一个完整的EMC防护电

qq_37999850的博客 1384

【WRFDA第三期】OBSPROC namelist 变量总结

OBSPROC namelist 变量总结

WW、forever的博客 1120

深度学习工具包 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也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: 13、输入驱动下推自动机的推动或静止移动的力量
下一篇: 14、凸语言子类中的切割操作
grass
博客等级 码龄25年 1030粉丝 954原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值