异常控制流

交叉验证选型指南:k折、留一法、时序与分层CV实战决策 交叉验证是评估机器学习模型泛化能力的基础技术,其核心在于通过系统性数据重划分,缓解有限样本对真实分布估计的偏差。原理上,它通过控制训练-验证数据的独立性与代表性,诊断过拟合风险并提升性能指标的稳定性。技术价值体现在避免单次切分导致的结果偶然性、数据利用低效及验证集污染等问题。典型应用场景涵盖分类任务中的类别不平衡处理、时间序列预测的因果约束、用户行为建模中的数据泄露防控等。本文聚焦k折交叉验证、留一法、时间序列交叉验证与分层抽样等主流方法的适用边界与工程落地要点,结合过拟合诊断和泛化能力评估两大热词,提供可 阅读详情

异常控制流

系统需要能够对系统状态的改变做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定和程序的执行相关。如:一个硬件定时器定期产生信号,这个事件必须得到处理。包到达网络适配器,必须放在内存中。程序向磁盘请求数据,然后休眠,直到被通知数据已经就绪。子进程终止时,创造这些子检查点父进程必须得到通知

现代系统通过使控制流突变来对这些情况做出反应,把这些突变称为异常控制流(ECF).异常控制流发生在计算机系统的各个层次:

  • 硬件层
    硬件检测到事件会触发控制突然转移到异常处理程序

  • 操作系统层
    内核通过上下文切换将控制从一个用户进程转移到另一个用户进程

  • 应用层
    一个进程可以发送信号到另一个进程,接受者会将控制突然转移到它的一个信号处理程序

异常

异常是异常控制流的一种形式,由两部分实现:

  • 硬件实现

  • 操作系统实现

异常的基本思想:

图1.png

异常就是控制流中的突变,用来相应处理器状态的某些变化

处理器中,状态被编码成不同的位和信号,状态变化叫做事件

任何情况下,处理器检测到事件发生时,就会通过一个叫异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序

异常处理程序完成处理后,根据引起异常的事件类型,会发生下列三种情况中一种:

  • 处理程序将控制返回给当前指令Icurr,即当事件发生时正在执行的指令

  • 处理程序将控制返回给Inext,如果没有发生异常将会执行的下一条指令

  • 处理程序终止被中断的程序

异常处理

系统中为可能出现的每种类型的异常都分配了一个唯一的非负整数的异常号,其中一些号码由处理器的设计者分配,其他号码由操作系统内核设计者分配

系统启动时,操作系统分配和初始化一张叫做异常表的跳转表,使得条目k包含异常k的处理程序的地址

异常表格式:

图2.png

运行时,处理器检测到发生了一个事件,并且确定了相应的异常号k,随后处理器触发异常,方法是执行间接过程调用,通过异常表的表目k,转到相应的处理程序

图示(处理器如何使用异常表来形成适当的异常处理程序的地址):

图3.png

异常与过程调用的不同之处:

  • 过程调用时,在跳转到处理程序之前,处理器将返回地址压入栈中,但根据异常的类型,返回地址要么是当前指令,要么是下一条指令

  • 处理器也把一些额外的处理器状态压到栈中,在处理程序返回时,重新开始执行被中断的程序也会需要这些状态

  • 如果控制从用户程序转移到内核,所有这些项目都被压到内核栈里面,而不是压到用户栈中

  • 异常处理程序运行在内核模式下,意味着它们对所有的系统资源都有完全的访问权限

异常的类别

类型原因异步/同步返回行为
中断来自IO设备的信号异步总是返回到下一条指令
陷阱有意的异常同步总是返回到下一条指令
故障潜在可以恢复的错误同步可能返回到当前指令
终止不可恢复的错误同步不会返回
中断

异步发生,来自处理器外部的IO设备的信号的结果,硬件中断不是由任何一条专门的指令造成的,从这意义来说是异步,硬件中断的异常处理程序常常叫做中断处理程序

图示(中断的处理):

图4.png

陷阱 & 系统调用

陷阱:有意的异常,是执行一条指令的结果

陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用

用户程序经常需要访问内核请求服务。如读文件,创建新的进程等。为了允许对这些内核服务的受控制的访问,处理器提供了一条特殊的“syscall n”指令,当用户程序想要请求服务n时,可以执行这条指令,执行syscall指令会导致一个到异常处理程序的陷阱,这个处理程序解析参数,并调用适当的内核程序

图示(系统调用的处理):

图5.png

故障

故障由错误引起,可能能够被故障处理程序修正,当故障发生时,处理器将控制转移给故障处理程序,如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它,否则处理程序返回到内核中的abort例程,abort例程会终止引起故障的应用程序

图示(故障的处理):

图6.png

终止

终止时不可恢复的致命错误造成的结果,通常是一些硬件错误

Linux/x86-64中的异常

Linux/x86-64故障和终止

除法错误

应用试图除以0时,或者一个除法指令的结果对于目标操作数来说太大了的时候。就会发生除法错误。

一般保护故障

许多原因会引起一些不为人知的一般故障保护,如一个程序引用了一个未定义的虚拟内存区域等

缺页

一个会重新执行产生故障的指令的一个异常示例

机器检查

机器检查是在导致故障的指令执行中检测到致命的硬件错误时发生的

Linux/x86-64系统调用

图示(Linux下常见的系统调用):

图7.png

c程序用syscall函数可以直接调用任何系统调用,但有更好的做法,对于大多数系统调用,标准C库提供了一组方便的包装函数,这些包装函数将参数打包到一起,以适当的系统调用指令陷入内核,然后将系统调用的返回状态传递回调用程序

x86-64系统上,系统调用是通过一条syscall的陷阱指令提供的,所有到Linux系统调用的参数都是通过通用寄存器而不是栈传递的

例子:

hello程序,用系统级函数write,而不是printf


int main()
{

    write(1,"hello,world\n",13);
    _exit(0);
}

上述代码的汇编版本:


000000000000068a <main>:
 68a:	55                   	push   %rbp
 68b:	48 89 e5             	mov    %rsp,%rbp
 68e:	ba 0d 00 00 00       	mov    $0xd,%edx
 693:	48 8d 35 aa 00 00 00 	lea    0xaa(%rip),%rsi        # 744 <_IO_stdin_used+0x4>
 69a:	bf 01 00 00 00       	mov    $0x1,%edi
 69f:	b8 00 00 00 00       	mov    $0x0,%eax
 6a4:	e8 b7 fe ff ff       	callq  560 <write@plt>
 6a9:	bf 00 00 00 00       	mov    $0x0,%edi
 6ae:	e8 9d fe ff ff       	callq  550 <_exit@plt>
 6b3:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
 6ba:	00 00 00 
 6bd:	0f 1f 00             	nopl   (%rax)


进程

异常时允许操作系统内核提供进程概念的基本构造块

进程的经典定义就是一个执行中程序的实例,系统中的每个程序都运行在某个进程的上下文中,上下文是由程序正确运行所需的状态组成的,这个状态包括存放在内存中的程序的代码和数据,栈,通用目的寄存器的内存,程序计数器等

逻辑控制流

即时系统有许多程序在运行,进程也可以向每个程序提供一种假象,好像它在独占的使用处理器,假设想要调试单步执行程序,可以看到一系列的程序计数器的值,这些值唯一对应于包含在可执行目标文件中的指令,或是包含在运行时动态链接到程序的共享对象中的指令,这个PC值的序列叫做逻辑控制流,或简称逻辑流

下面图示中:

运行着三个进程,处理器的物理控制流被分成三个逻辑流,每个进程一个,每个竖直的条表示一个进程的逻辑流的一部分,三个逻辑流执行是交错的,A运行一会,B开始运行到完成,C运行一会

图8.png

上图的关键点在于进程是轮流使用处理器的

每个进程执行它的流的一部分,然后被抢占,轮到其它进程

并发流

一个逻辑流的执行时间上与另一个流重叠,叫做并发流

多个流并发执行叫做并发,一个进程和其它进程轮流运行叫做多任务。一个进程执行它的控制流的一部分的每一时间段叫做时间片

私有地址空间

进程也为程序提供了另一种假象:

程序好像是在独占的使用系统地址空间

考虑一台n位地址的机器,地址空间是 2^n个可能的地址集合,进程为每个cx提供它自己的私有地址空间

尽管每个私有地址空间相关联的内存的内容是不同的,但是每个这样的空间都有一样的通用结构

x86-64Linux进程的地址空间的组织结构:

图9.png

用户模式 & 内核模式

处理器需要提供一种机制:限制一个应用可以执行的指令以及它可以访问的地址空间范围

处理器通常是某个控制寄存器中的一个模式位来提供这种功能,该寄存器描述了进程当前享有的特权

  • 设置了模式位,进程就运行在内核模式,此时进程可以执行指令中任何指令,可以访问系统中的任何内存位置

  • 没有设置模式位,运行在用户模式,此时进程不允许执行特权指令,如停止处理器,改变模式位,发起IO操作等

运行应用程序代码的进程初始时在用户模式,进程从用户模式切换为内核模式的唯一方法就是通过中断,故障或者陷入系统调用这样的异常

上下文切换

操作系统内核使用一种叫做上下文切换的较高层形式的异常控制流来实现多任务

内核为每个进程维护一个上下文。

上下文就是重新启动一个被抢占的进程所需的状态。包括:

由一些对象的值组成:
  • 通用目的寄存器

  • 浮点寄存器

  • 程序计数器(PC)

  • 用户栈

  • 状态寄存器

  • 内核栈

各种内核数据结构
  • 描绘地址空间的页表

  • 包含当前进城信息的进程表

  • 进程已打开文件信息的文件表

在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。这种决定叫做调度(shedule),由内核中称为调度器(scheduler)的代码处理的。

  • 当内核选择一个新的进程运行时,我们就说内核调度了这个进程。

当调度进程时,使用一种上下文切换的机制来控制转移到新的进程

  • 保存当前进程的上下文

  • 恢复某个先前被抢占的进程被保存的上下文

  • 将控制传递给这个新恢复的进程

什么时候会发生上下文切换

内核代表用户执行系统调用:

  • 如果系统调用因为某个事件阻塞,那么内核可以让当前进程休眠,切换另一个进程。

  • 或者可以用sleep系统调用,显式请求让调用进程休眠。

  • 即使系统调用没有阻塞,内核可以决定执行上下文切换

中断也可能引发上下文切换:

  • 所有系统都有某种产生周期性定时器中断的机制,典型为1ms,或10ms。

  • 每次定时器中断,内核就能判断当前进程运行了足够长的时间,切换新的进程。

图10.png

上图中,进程A和B,A初始运行在用户模式,直到通过系统调用read陷入内核,内核中的陷阱处理程序请求来自磁盘控制器的DMA传输,并且安排在磁盘控制器从磁盘到内存的数据传输后,磁盘中断处理器

磁盘读取数据费时比较长,所以内核执行从A到B的上下文切换,切换之前,内核代表A在用户模式下执行命令,在切换的第一部分中,内核代表A在内核模式下执行指令,然后在某一时刻,它开始代表B(仍旧是内核模式)执行指令,切换后,内核代表B在用户模式下执行指令

B在用户模式下运行一段时间之后,直到磁盘发出一个中断信号,表示数据已经从磁盘传送到内存了,内核判定B已经运行了足够长时间,就执行一个从B到A的上下文切换

进程控制

Unix提供了大量从C程序中操作进程的系统调用

获取进程ID

每个进程都有一个唯一的正数进程ID(PID)

#include<sys/types.h>
#include<unistd.h>

pid_t getpid(void);
pid_t getppid(void);
  • PID是每个进程唯一的正数。

  • getpid()返回调用进程的PID,getppid()返回它的父进程的PID。

  • 返回一个类型pid_t的值,在Linux系统下在type.h被定义为int

创建和终止进程

进程总是处于下面三种状态

运行。进程要么在CPU中执行,要么等待执行,最终被内核调度。
停止。进程的执行被挂起,且不会被调度。
  • 收到SIGSTOP,SIGTSTP,SIDTTIN或者SIGTTOU信号,进程就会停止。
  • 直到收到一个SIGCONT信号,在这个时刻,进程再次开始运行。
  • 信号是一种软件中断的形式。
终止。进程永远停止。
  • 收到一个信号。信号默认行为是终止进程。
  • 从主程序返回
  • 调用exit函数

父进程通过调用fork函数创建一个新的运行子进程

#include<sys/types.h>
#include<unistd.h>

pid_t fork(void);
返回:子进程返回0,父进程返回子进程的PID,如果出错,返回-1;

新创建的子进程几乎但不完全与父进程相同。

子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝。
  • 包括文本,数据和bss段,堆以及用户栈。子进程还获得与父进程任何打开文件描述符相同的拷贝。

  • 意味着当父进程调用fork时,子进程可以读写父进程中打开的任何文件。

  • 父进程和新创建的子进程之间最大的区别在于有不同的PID 。

fork()函数会第一次调用,返回两次,一次在父进程,一次在子进程。
  • 返回值用来明确是在父进程还是在子进程中执行。

fork函数一个比较令人疑惑的点:

它只被调用一次,却会返回两次

  • 一次是在调用进程(父进程)中

  • 一次是在新创建的子进程中

父进程中,fork返回子进程的PID,子进程中,fork返回0

因为子进程的PID总是为非0,返回值就提供一个明确的方法来分辨程序是在父进程还是在子进程中执行

使用fork来创建子进程的父进程例子:


#include "sys/types.h"
#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
int main()
{
        pid_t pid;
        int x = 1;

        pid = fork();
        if(pid==0)
        {
                printf("child: x=%d\n",++x);
                exit(0);
        }

        printf("parent : x=%d\n",--x);
        exit(0);
}


编译执行:


parent : x=0
child: x=2

上述例子说明:

  • 调用一次,返回两次

  • 并发执行

  • 一样但是独立的地址空间

  • 共享文件

回收子进程

当一个进程由于某种原因终止时,内核并不是立即把它从系统中清除。相反,进程被保持在一种已终结的状态,知道被它的父进程 回收(reap)。

当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程。

一个终止了但还未被回收的进程叫做僵死进程

如果父进程没有回收,而终止了,那么内核安排init进程来回收它们。

  • init进程的的PID位1,在系统初始化时由内核创建的。

  • 长时间运行的程序,如shell,服务器,总是应该回收他们的僵死子进程

一个进程可以通过调用waitpid函数来等待它的子进程终止或停止

#include<sys/types.h>
#include<sys/wait.h>

pid_t waitpid(pid_t pid ,int *status, int options);
返回:如果成功,则为子进程的PID,如果WNOHANG,则为0,如果其他错误,则为-1.

进程休眠

sleep函数将一个进程挂起一段指定时间

#include <unistd.h>

unsigned int sleep (unsigned int secs);
返回:还要休眠的描述

如果请求的时间量到了,sleep返回0否则返回还剩下的要休眠的秒数

pause函数,让调用进程休眠,知道该进程收到一个信号

#include<unistd.h>

int pause(void);

加载并运行程序

execve函数在当前进程的上下文中加载并运行了一个新程序。

#include <unistd.h>

int execve(const char *filename,const char *argv[],const char *envp[]);

execve函数加载并运行可执行目标文件filename,且带参数argv和环境变量列表envp。

只有当出现错误时,execve才会返回到调用程序

k8s中如何使用gpu、gpu资源讲解、nvidia gpu驱动安装 gpu资源也是服务器中常见的一种资源,gpu即显卡,一般用在人工智能、图文识别、大模型等领域,其中nvidia gpu是nvidia公司生产的nvidia类型的显卡,amd gpu则是adm公司生产的amd类型gpu。企业中服务器最常见的就是英伟达gpu服务器了。本篇也主要讲解英伟达驱动相关的知识。 阅读详情

相关推荐

利用ArcGIS创建渔网计算渔网内土地利用占比划分中国北方农牧交错带

依据土地利用数据,根据参考文献划分要求,利用ArcGIS创建渔网对地物进行重分类,划分农业带、牧业带以及农牧交错带。

m0_60672527的博客 3058

深入理解计算机系统(六) —— 异常控制流

参考书籍《深入理解计算机系统》 文章目录1 异常1.1 基本概念 1 异常:异常处理、异常类别、创建子进程、回收子进程 2 进程:调度、上下文切换、 3 信号:发送信号、接收信号、信号处理

qq_39916709的博客 666

[uboot] (第四章)uboot流程——uboot编译流程

uboot编译流程简单介绍

ooonebook的博客 1万+

《深入理解计算机系统》第八章——异常控制流

异常控制流一、异常1.1 异常处理1.2 异常的类别1.3 Linux/x86-64 系统中的异常二、进程2.1 逻辑控制流2.2 并发流2.3 私有地址空间2.4 用户模式和内核模式2.5 上下文切换三、系统调用错误处理四、进程控制4.1 获取进程 ID4.2 创建和终止进程4.3 回收子进程4.4 让进程休眠4.5 加载并运行程序4.6 利用 fork 和 execve 运行程序五、信号5.1 信号术语5.2 发送信号5.3 接受信号5.4 阻塞和解除则塞信号5.5 编写信号处理程序5.6 同步流以避免

yelvens的博客 3122

【小白指南】如何将deepseek引入WPS\Word\Excel中去?

如何将deepseek引入WPS\Word\Excel中去?纯小白都能看的懂,一步步操作就能行

2503_90498422的博客 1万+

解密TMS320F28377D双核工程中的内存分配艺术:从CMD文件到实战优化

本文深入解析TMS320F28377D双核DSP的内存管理艺术,从CMD文件配置到实战优化技巧。详细介绍了SARAM、GSRAM等内存类型的特性与配置方法,提供双核协同、性能优化及高级调试的实用方案,帮助开发者提升系统实时性和稳定性。

weixin_29190651的博客 662

异常控制流(Exception Control Flow)

异常就是控制流中的突变,用来响应处理器状态中的某些变化。它一部分由硬件实现,一部分由操作系统实现。 在任何情况下,处理器检测到有事件发生时,通过异常表(exception table)的跳转表,进行一间接过程调用(异常),到异常处理程序(exception handler, 专门设计用来处理相关事件的操作系统子程序)。

To the beyond and infinity! 2273

数据标注的下一代SOP,可能不是Word,而是一段Prompt

再给几个反例:“这个只是正常纹理,不算。真正用于数据生产的Prompt,可能至少包含:任务定义、正例、反例、边界案例、优先级、输出格式、验收逻辑。一个项目100个人,如果100个人对这句话有100种理解,最后返工的就不是一个框,而可能是几十万帧数据。一个项目启动以后,项目经理先研究SOP,培训组长,组长再培训标注员,最后几百个人按照同一套规则干活。实际上一个成熟的项目经理,最重要的能力之一,就是:把客户的业务语言翻译成生产规则。真正让项目难交付的,从来不是80%的普通数据,而是那20%的长尾数据。

AI数据标注猿 294

CSAPP 异常控制流

每次从一条指令过渡到另外一条指令的过程称为控制转移,这样的一个控制转移序列叫做控制流,如果每条指令都是相邻的,这样的过渡就是平滑序列。如果一条指令与另外一条指令不相邻,这样突发性的过渡称为异常。从进程切换、用户态与内核态的转换到系统实时响应各种事件,都离不开异常这个概念。 异常控制流 从开机到关机,处理器做的工作其实很简单,就是不断读取并执行指令,每次执行一条,整个指令执行的序列,称为处理器的控制流。到目前为止,我们已经学过了两种改变控制流的方式: 跳转和分支 调用和返回 这两个操作对应于程序的改变。但

qq_42136820的博客 604

VINS技术路线与代码详解

VINS技术路线 写在前面:本文整和自己的思路,希望对学习VINS或者VIO的同学有所帮助,如果你觉得文章写的对你的理解有一点帮助,可以推荐给周围的小伙伴们,当然,如果你有任何问题想要交流,欢迎随时探讨。话不多说,下面上正文。 VINS代码地址:https://github.com/HKUST-Aerial-Robotics/VINS-Mono 参考文档:1.VINS-Mono A R...

wangshuailpp的博客 7万+

SAP-MM-采购过账接口(与WMS集成)-代码

1、判断传入值非空检验; 2、判断过账日期是否允许在当前期间; 3、判断是否为集采订单业务,是否审批完成; 4、判断是否发布标准成本发布(此业务场景与价格控制3+S有关) 5、保存日志表; 6、判断业务公司订单审批状态; 7、创建STO交货单、集采公司订单过账、STO公司间创建交货单、交货单过账(两步法)、过账失败回滚(冲销交货、删除交货单、冲销集采入库)

qq_32198063的博客 420

linux硬件控制流,异常控制流

异常控制流系统需要能够对系统状态的改变做出反应,这些系统状态不是被内部程序变量捕获的,而且也不一定和程序的执行相关。如:一个硬件定时器定期产生信号,这个事件必须得到处理。包到达网络适配器,必须放在内存中。程序向磁盘请求数据,然后休眠,直到被通知数据已经就绪。子进程终止时,创造这些子检查点父进程必须得到通知现代系统通过使控制流突变来对这些情况做出反应,把这些突变称为异常控制流(ECF).异常控制流发...

weixin_32466167的博客 274

使用modelscope加载报错:ImportError: cannot import name ‘AutoTokenizer’ from ‘modelscope’...如何解决?| 提供多种解决方案

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1241

谈异常控制流

引子 Cpu/内核是怎么处理各种异常的? 用户态程序怎样调用系统函数,与操作系统交互的? 并发是怎样实现的? Try catch 使怎样跳转的? .............   异常控制流是这些问题的根基,想更多的理解计算机系统,必须对这个问题有一定的了解。 首先,必须清楚什么是控制流? cpu有一个处理序列a1,a2…ak,ak+1.. 这就是一个控制流,从ak到ak+1就是

jr19911118730的专栏 1151

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

异常控制流ECF

CPU每次取指前都会查看一下中断引脚如果有有效值,并且IF=1(不可屏蔽中断),CPU就会向发送中断信号的外设发送一个低电平有效的电信号,表示已经收到了你的中断信号。其实举个例子来说:就是你写着作业呢,你舍友在蹲坑给你打个电话让你拿个卫生纸(发生事件),你保存下当前写的作业的状态(保存现场),然后给舍友去送纸(处理中断),送完回来继续接着写作业(恢复现场)。)是需要CPU立即处理该事务,不可屏蔽中断发生时,将当前的指令和状态(各个寄存器的值)存储在栈中,方便CPU处理完中断后继续恢复中断前的工作。

Roger_Spencer的博客 1326

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

异常控制流概述与异常

异常控制流一、异常控制流的概述1、控制流是什么2、异常控制流(ECF)的诞生3、ECF的重要性4、从硬件到软件,从底层到顶层的学习逻辑二、异常1、异常的定义2、异常的剖析:3、异常的处理4、异常与过程调用的区别5、异常的类别1)中断(异步发生)2)陷阱和系统调用(同步发生)3)故障4)终止三、收获、问题与思考(有些问题待解决)收获问题思考 一、异常控制流的概述 1、控制流是什么 从给处理器加电开始,直到你断电为止,PC假设一个值的序列a0,a1,……,an-1。其中,每个ak是某个相应的指令Ik的地址。每次

qq_45579563的博客 923

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

【C++】异常控制流详解

文章目录1、概念2、异常3、异常处理4、异常的类别4.1 中断4.2 陷阱4.3 故障4.4 终止4.5 C语言及C++异常处理方式5、LInux / x86-64系统中的异常5.1 Linux / x86-64 故障和终止5.2 Linux / x86-64 系统调用 1、概念 程序计数器假设一个值的序列 a0, a1, a2, … ,an-1 ,其中ak到ak+1的过度称为控制转移。这样的控制转移序列叫做处理器的控制流。 最简单的控制流是一个“平滑的”序列,“平滑流”的突变通常是由跳转、调用和返回造成的

金金金金金的博客 640

【CSAPP】异常控制流 | 异常表 | 异常类别 | 同步异常 | 异步异常

本文将学习《深入理解计算机系统》的第六章 - 关于异常控制流和系统级 I/O。CSAPP 是计算机科学经典教材《Computer Systems: A Programmer's Perspective》的缩写,该教材由Randal E. Bryant和David R. O'Hallaron 合著。

有道无术, 术尚可求。有术无道, 止于术。 1648

进程—异常控制流之中断篇

从给处理器加电开始,直到断电为止,PC(程序计数器)都在不间断的读取并执行指令。 ​ 最简单的一种控制流是一个”平滑的”序列,其中每个instkinst_k和instk+1inst_{k+1} 在存储器中都是相邻的。典 型地,这种平滑流的突变,也就是instk​inst_k​和instk+1​inst_{k+1}​ 不相邻,是由诸如跳转(jump)、调用

unclerunning的博客 3064
上一篇: Netty-TCP拆包/粘包
下一篇: Netty之Http
Coder_py
博客等级 码龄10年 106粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值