RunLoop

【iOS】RunLoop Mode到底包含哪些类型的元素?前面提到过:存储所有commonMode的itemsourcetimerobserver上面的SourceTimerObserver被统称为mode item所有的mode item都可以被添加到Mode中,Mode中可以包含多个mode item,一个item也可以被加入多个mode。但一个item被重复加入同一个mode时是不会有效果的。如果一个mode中一个item都没有,则RunLoop会退出,不进入循环。 阅读详情

01基本认识

什么是RunLoop
顾名思义
运行循环
在程序运行过程中循环做一些事情
当我一启动IOS程序的时候,他内部就会创建一个RunLoop对象,循环做一些事情

  • 应用范畴
    定时器(Timer)、PerformSelector
    GCD Async Main Queue
    事件响应、手势识别、界面刷新
    网络请求
    AutoreleasePool

如果没有RunLoop程序执行完main函数就会退出,
为了保证程序一直在运行之后,他就引入了RunLoop,当我们执行main函数调用UIApplicationMain的时候,就会创建RunLoop对象。
他内部大概是这个样的

int retVal = 0;
    do {
        //睡眠中等待消息
        int message = sleep_and_wait();
        //处理消息
        retVal = process_message(message)
    } while (retVal == 0);

当执行完main之后,程序不会马上退出,而是保持运行状态
RunLoop的基本作用
保持程序的持续运行
处理App中的各种事件(比如触摸事件、定时器事件等)
节省CPU资源,提高程序性能:该做事时做事,该休息时休息

02获取RunLoop对象

IOS没有RunLoop会马上退出,执行main返回0,程序立即退出。
RunLoop有两个,一个是OC的一个是C语言的

NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    CFRunLoopRef runloopR = CFRunLoopGetCurrent();

iOS中有2套API来访问和使用RunLoop
Foundation:NSRunLoop
Core Foundation:CFRunLoopRef
NSRunLoop和CFRunLoopRef都代表着RunLoop对象
NSRunLoop是基于CFRunLoopRef的一层OC包装
CFRunLoopRef是开源的https://opensource.apple.com/tarballs/CF/

Runloop与线程的关系
1.每条线程都有唯一的一个与之对应的RunLoop对象
2. RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop作为value
3. 线程刚创建时并没有RunLoop对象,RunLoop会在第一次获取它时创建
4.RunLoop会在线程结束时销毁
5. 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop

NSLog(@"%p--%p", CFRunLoopGetCurrent(), CFRunLoopGetMain());
    0x600001e6cc00--0x600001e6cc00
    NSLog(@"%p--%p", [NSRunLoop currentRunLoop], [NSRunLoop mainRunLoop]);
 0x600000660000--0x600000660000

打印结果不一样是因为NSRunLoop是对CFRunLoop的包装,他里面存放着CFRunLoop,一个线程对应唯一一个runloop
通过查看源码,我们可以看出当我们执行CFRunLoopGetCurrent-> CFRunLoopGet0->里面有个CFGetDictionaryValue取RunLoop,根据一个thread的key,如果一开始runloop对象不存在,他就创建一个runloop,然后把它添加到字典之中

03CFRunLoopModeRef

如果要寻做一些事,仅仅有这个RunLoop对象是不行,他还要以来其他的对象

Core Foundation中关于RunLoop的5个类
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef

CFRunLoop的结构

CFRunLoop

可以看出,他和线程是一一对应的关系,他有一个集合存放着他的mode,这里面只有一个mode是currentMode,
mode的结构

mode

source0和source1里面装的CFRunLoopSourceRef这种对象
observers里面装的是CFRunLoopObserverRef这种对象

内存结构
  • CFRunLoopModeRef代表RunLoop的运行模式
  • 一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
  • RunLoop启动时只能选择其中一个Mode,作为currentMode
  • 如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
  • 不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
  • 如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
  • 常见的2种Mode
    kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
    UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响

04CFRunLoopModeRef的成员

通过控制台bt可以打印函数调用栈

Source0
    触摸事件处理
    performSelector:onThread:
    
    Source1
    基于Port的线程间通信
    系统事件捕捉,比如点击屏幕产生的事件就是他捕捉到的,然后再交给source0处理
    
    Timers
    NSTimer
    performSelector:withObject:afterDelay:
    
    Observers
    用于监听RunLoop的状态
    UI刷新(BeforeWaiting),当前听器间听到runloop要睡觉了,他就会进行一次UI页面刷新
比如设置颜色,当你值完代码,他先保留住,一旦监听到睡觉,就是刷新
    Autorelease pool(BeforeWaiting)//他在什么时候释放对象,一旦监听到要睡觉了,就清理一下自动释放的对象

05CFRunLoopObserverRef

Observer

CFRunLoopObserverRef

监听runloop的状态Observer,没有OC的API我们只能通过CF的函数形式添加Observer
手动创建一个Observer监听runloop的状态

void observerCall(CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info)
{
    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry = (1UL << 0),
        kCFRunLoopBeforeTimers = (1UL << 1),
        kCFRunLoopBeforeSources = (1UL << 2),
        kCFRunLoopBeforeWaiting = (1UL << 5),
        kCFRunLoopAfterWaiting = (1UL << 6),
        kCFRunLoopExit = (1UL << 7),
        kCFRunLoopAllActivities = 0x0FFFFFFFU
    };
    //监听状态
    switch (activity) {
        case kCFRunLoopEntry:
            NSLog(@"kCFRunLoopEntry");
            break;
            
        case kCFRunLoopBeforeTimers:
            NSLog(@"kCFRunLoopBeforeTimers");
                
            break;

        case kCFRunLoopBeforeSources:
            NSLog(@"kCFRunLoopBeforeSources");
            break;

        case kCFRunLoopBeforeWaiting:
            NSLog(@"kCFRunLoopBeforeWaiting");
            break;

        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit");
            break;
        default:
            break;
    }
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //创建一个observer
    CFRunLoopObserverRef observer = CFRunLoopObserverCreate(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, observerCall, NULL);
    //添加一个observer
    //kCFRunLoopCommonModes
    CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopCommonModes);
    CFRelease(observer);
    
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"------");
}

监听模式的改变,可以拖一个scrollView拖动一下改变的runloop的mode

//监听状态
    switch (activity) {
        case kCFRunLoopEntry:
            NSLog(@"kCFRunLoopEntry---%@",CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()));
            break;
        case kCFRunLoopExit:
            NSLog(@"kCFRunLoopExit---%@", CFRunLoopCopyCurrentMode(CFRunLoopGetCurrent()));
            break;
        default:
            break;
    }
//log
 kCFRunLoopExit---kCFRunLoopDefaultMode
2020-10-26 21:56:57.104392+0800 RuntimeIsa[1573:89315] kCFRunLoopEntry---UITrackingRunLoopMode
2020-10-26 21:56:57.315033+0800 RuntimeIsa[1573:89315] kCFRunLoopExit---UITrackingRunLoopMode
2020-10-26 21:56:57.315199+0800 RuntimeIsa[1573:89315] kCFRunLoopEntry---kCFRunLoopDefaultMode

06答疑

循环做把mode里面source拿出来处理,
source里面的东西是不固定的

07执行流程图

在IOS我们表面上能看到的Runloop就是applicationMain
要想看到他具体做了什么事情,就要分析源码,但是源码太过于抽象,纯c。可以先看下总结图片。他大概就是不断的切换mode,然后处理不同模式喜爱的source0 ,source1,timer等
handleport就是source1 可能是别的线程发过来的信息

Runloop工作流程
运行逻辑

08-源码分析

通过打断点,在控制台输入bt指令,来打印省略的步骤可以查看到他调用了一个CFRunLoopSpecific的函数->CFRunloopRun这个函数里面就是他在做的处理,就是一个do-while循环

__CFRunLoopRef  rl,  CFRunLoopModeRef rum
int32_t retVal = 0;

do
{
    //通知Obervers,即将处理Timers
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeTimers);
    //通知Obervers,即将处理Sources
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeSources);  
//处理Blocks
__CFRunLoppDoBlocks(rl,rlm)

//处理source0
if (__CFRunloopDoSource0(rl,rlm,stopAfterHandle))
{
//处理block;
}

}while(0 == retVal);

//判断有无source1,如果有就跳到,handle_msg

//通知observer即将进入休眠
__CFRunLoopDoObservers(rl,rlm,kCFRunLoopBeforeSleeping);
__CFRunLoopSetSleeping(rl);

//等待别的消息来唤醒当前线程
__CFRunLoopServiceMachPort

handle_msg:
if(被time唤醒)
{
//处理timers
}else if(被GCD唤醒)
{
//处理GCD
}else
{//被source1唤醒,
//处理source1
}
//处理block

//设置返回值

如果返回值retVal还是 == 0;
那么就会回到开头从新循环

09调用细节

我们平时所做的UI界面刷新,timer定时器的监听,自动释放池都是疣runloop来做控制的,它主要做这几件事件,1 doObservers, 2 doBlocks 3. doSource03. doSource01 4doTimers5,处理gcd 6 休眠,这些函数里面还会调用一个__CFRUNLOOP_IS_CALLING_TO开头的函数

  • GCD有自己的逻辑,他很多东西不依赖RunLoop,他有一种情况会交给runloop处理
dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //处理子线程的逻辑
        
        dispatch_async(dispatch_get_main_queue(), ^{
           //回到住线程刷新界面
        });
        
    });

01、通知Observers:进入Loop
02、通知Observers:即将处理Timers
03、通知Observers:即将处理Sources
04、处理Blocks
05、处理Source0(可能会再次处理Blocks)
06、如果存在Source1,就跳转到第8步
07、通知Observers:开始休眠(等待消息唤醒)
08、通知Observers:结束休眠(被某个消息唤醒)
01> 处理Timer
02> 处理GCD Async To Main Queue
03> 处理Source1
09、处理Blocks
10、根据前面的执行结果,决定如何操作
01> 回到第02步
02> 退出Loop
11、通知Observers:退出Loop

10-休眠的细节

开始睡觉意味着当前线程不做事情了,相当于阻塞了,这个阻塞和我们所写的while(1)(并没有休眠,线程还是在做事情)这种不一样,他是线程休息了什么代码也不执行了
通过调用mach_msg来调用内核层面的API实现线程的休眠的目的
当我们在用户态执行了mach_msg函数之后,他会进入内核态,调用内核态的mach_msg的实现,来达到休眠的目的。没消息就让线程休眠,有消息就唤醒线程。回到用户态处理消息,通过状态切换真正达到了让线程休息

状态切换

runloop是怎么响应用户的操作的?
首先它是由source1来把用户事件捕捉,点击。source1会把这个事件,包装成事件队列,放到事件队列里面去。事件队列又是在source0里面处理的

说说runloopd的几种状态
kCFRunLoopEntry = (1UL << 0),
kCFRunLoopBeforeTimers = (1UL << 1),
kCFRunLoopBeforeSources = (1UL << 2),
kCFRunLoopBeforeWaiting = (1UL << 5),
kCFRunLoopAfterWaiting = (1UL << 6),
kCFRunLoopExit = (1UL << 7),
kCFRunLoopAllActivities =
runloop的mode作用是什么?
常见的2种Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
mode可以将不同的source0/source1/t/o隔离开来。他们之间相互隔离不受影响

11NSTimer失效

runloop实际开发中的应用,
控制线程生命周期(线程保活),有时候我们不希望子线程运行完就销毁,
解决NSTimer在滑动时停止工作的问题
监控应用卡顿
性能优化

默认下的NSTimer我们一拖拽UI控件,他就会停止运行,因为我们在拖拽的时候,runloop切换了mode,定时器是在默认模式下工作的

//用这个方法创建的定时器是加到默认模式下的
    [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer)
    {
        NSLog(@"%i", ++count);
    }];
iOS RunLoop的总结 RunLoop是iOS开发核心的事件循环机制,它负责管理线程的生命周期、处理各类事件。主线程的RunLoop默认开启,子线程需要手动获取并维护RunLoop。以上就是对RunLoop的一些总结。 阅读详情

相关推荐

iOS进阶教程2-RUNLOOP优化大图加载

1 为什么要优化大图加载 大图片在渲染的时候,比较耗费时间 我们利用RUNLOOP 来优化: 思路:1.每一次RUNLOOP,都只加载一个小任物,把图片任务放到数组,从数组循环来加载.这样可以是项目达到流畅. 2.只加载当前视图内的图片任务 3.为了不让runloop休眠.我们要用一个timer区持有这个runloop 或者 通知注册runloop事件,让快要睡眠...

Coder Bruce 1619

深入理解Runloop,看我一篇就够了

前言 RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,为了让大家更加快速融入,请先一段代码: + (NSThread *)networkRequestThread { static NSThread *_networkRequestThread = nil; static dispatch_once_t oncePredicate; dispatc

iiiiiiiiiihero的专栏 1万+

Vivado ILA调试全攻略:从HDL实例化到Block Design的5个实战技巧

本文全面解析了Vivado集成逻辑分析仪(ILA)的五种核心调试方法,涵盖从HDL代码实例化到Block Design集成的实战技巧。详细对比了不同方法的优缺点与适用场景,并重点介绍了如何利用Debug Hub高效管理多时钟域复杂调试,旨在帮助FPGA开发者精准定位问题,显著提升板级调试效率。

weixin_29214199的博客 376

RunLoop的一些理解

1.Runloop与dispatch的关系 1.在__CFRunLoopRun函数中,用dispatch_source_create创建一个定时器。处理此次runLoop mode的运行时间,唤醒Runloop 2.使用dispatch的任务,例如 dispatch_async 提交的任务 dispatch_after 提交的延时任务 dispatch_source_create dispatch_source_set_timer dispatch_source_set_event_handler 设置的

勿在浮沙筑高楼 1209

SAP-PM设备模块-PM主数据之功能位置

SAP-PM模块学习

TRUIXIANG的博客 5137

【关于四足机器人那些事】足端轨迹规划-八次多项式轨迹

系列文章目录 文章目录系列文章目录前言一、多项式曲线二、八次多项式曲线总结 前言 在四足机器人的研究中,有一个很关键的问题,就是如何减少足端在触地瞬间的冲击,避免把机器人把自己给蹬倒了?这时候就需要一个合理的足端轨迹规划。本篇将会介绍几种足端轨迹。 本文将对四足机器人的足端轨迹进行规划。将数学中的复合摆线和多项式曲线引入到足端轨迹的规划中,根据零冲击原则[2],规划出 3 条满足要求的足端轨迹,包括: 复合摆线轨迹 八次多项式轨迹 分段五次多项式轨迹 本篇先介绍 - 八次多项式轨迹 一、多项式曲

LiuZ的博客 2955

【iOS】—— RunLoop详解

一般来说,一个线程一次只能执行一个任务,执行完成后线程就会退出。就比如之前学OC时使用的命令行程序,执行完程序就结束了。而runloop目的就是使线程在执行完一次代码之后不会结束程序,而是使该线程处于一种休眠的状态,等待有事件需要处理的时候,再醒来处理。简单的来说,runloop可以让线程在需要做事的时候忙起来,不需要的时候让线程休眠,使程序不会结束。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode item。......

m0_55124878的博客 3521

斑马打印机状态监控进阶:不用SDK也能获取打印状态的3种野路子

本文介绍了三种不依赖官方SDK的斑马打印机状态监控方法,包括SGD命令、TCP端口嗅探和共享打印机日志分析。这些方案适用于老旧系统或网络受限环境,帮助运维人员实时掌握打印状态,提升设备管理效率。特别适合工业自动化和物流仓储场景中的应急处理。

weixin_42628688的博客 427

【iOS】——RunLoop学习

一个线程一次只能执行一个任务,执行完毕后就会退出。do {//获取消息//处理消息} while (消息!= 退出)这种模型通常被称为Event Loop,Event loop 在很多系统和框架都有实现。例如:Node.js 的事件处理,Windows 程序的消息循环,而在macOS、iOS中就是Run Loop。简单的说RunLoop其实就是一种循环,通过这种循环得以让应用程序持续运行,让线程能随时处理事件,并在线程需要进行事件处理时忙起来,在不需要进行事件处理时闲下来。

m0_73974920的博客 2762

QT+Halcon实现螺纹检测

工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来: 1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹...

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 7050

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 312

iOS Runloop探索(快速了解Runloop)

Runloop是一个事件处理循环,用于调度工作并协调接收传入事件。Runloop 的目的是在有工作要做的时候让线程保持忙碌,在没有工作的时候让线程休眠。本篇文章就对Runloop进行一个简单的阐述,希望能帮到需要了解的同仁。

郭永明的技术专栏 4073

以宠辱之戒写 SAP Fiori Elements,把标准能力当成身体,把扩展冲动当成大患

SAP Fiori Elements开发中常面临业务方追求"独特页面"的压力,但过度自定义会破坏框架价值。老子"宠辱若惊"的智慧提醒开发者:不应因用户称赞或批评而动摇架构原则。标准模板的价值在于确保业务语义、交互规范和后端服务的一致性。扩展应遵循官方API,将业务逻辑放在ABAP/CDS层而非前端控制器。成熟项目会平衡标准与定制,使用annotation表达UI行为,仅在必要时通过受支持的extension points进行增强,保持系统的长期可维护性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 999

iOS——runLoop

RunLoop实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行相应的处理逻辑。线程执行了这个函数后,就会处于这个函数内部的循环中,直到循环结束,函数返回。RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。RunLoop和线程是绑定在一起的,每条线程都有唯一一个与之对应的RunLoop对象。不能自己创建RunLoop对象,但是可以获取系统提供的RunLoop对象。

m0_73348697的博客 2737

利用 SAP Joule 提升 ABAP 开发效率的前提条件与限制全解析

综上,想要在 ABAP Development Tools 中顺利使用 SAP Joule,既要准备好 BTP、IAS、ABAP 系统与 ADT 的版本与信任链,也要理解许可证、配额、语法范围等限制。只有在这些前提全部满足后,Joule 才能真正发挥生成式 AI 的价值,帮助 ABAP 开发者从繁琐模板中解放出来,把注意力投入在业务创新与 Clean Core 改造之上。未来 SAP 还将扩展中文语境、自动修复建议以及跨系统智能代理等功能,值得持续关注。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 663

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【iOS】Runloop

先前学习了Runtime的内容,现在来学习一下Runloop本文介绍玩Runloop,应该懂得:Runloop事件上就是一个事件循环,也可以当作一个对象,这个对象实际上就是用来处理消息与事件的,其提供了一个入口函数去执行EventLoop同时Runloop中又包含五种Mode,其中最常用的是,Mode中又有ModeItems的集合,如果一个Mode中没有items,那么runloop就会退出,items是指。

weixin_72437555的博客 1246

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

Runloop解析

​ RunLoop——运行循环(死循环),它提供了一个事件循环机制在程序运行过程中处理各种事件,例如用户交互、网络请求、定时器等等。RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息,充分节省CPU资源,提高程序性能。

yueliangmua的博客 1435

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RunLoop源码详解

文章目录RunLoop是什么NSRunLoop和CFRunLoopRunLoop内部结构RunLoop源码__CFRunLoop结构体__CFRunLoopMode结构体__CFRunLoopSource结构体CFRunLoopSourceContextCFRunLoopSourceContext1__CFRunLoopTimer结构体__CFRunLoopObserver结构体 RunLoop是什么 如果没有RunLoop,那么该线程在执行完自己的任务时就会退出;而我们在使用APP时,通常不会只执行完一个

吃橘子 980

【iOS】RunLoop学习

这篇博客起源于一个问题,为什么自动轮播图在滑动tableView时就停止滚动了。以上就是我学习RunLoop的总结,后续我讲继续补充完善我的博客。

2401_87841908的博客 400

RunLoop源码剖析---图解RunLoop

文章目录RunLoop源码剖析---图解RunLoop前言什么是RunLoop?RunLoop的作用RunLoop在何处开启?RunLoop对象RunLoop对象的获取CFRunLoopRef对象源码剖析RunLoop和线程RunLoop的相关类RunLoop的相关类之间关系各个类的作用RunLoop中的ModeCFRunLoopModeRef__CFRunLoopMode源码剖析__CFRunL...

qq_42376419的博客 1533

第9章:RunLoop面试问题

一、概念      1、什么是RunLoop? RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象。      2、什么是事件循环? 没有消息需要处理时,休眠以避免资源占用,此时当前线程的控制权由用户态切换到内核态;有消息需要处理时,立即被唤醒,此时状态由内核态切换到用户态。      3、应用程序的main函数为什么能一直运行不退出? 因为main函数中调用了UI...

BlackWolfSky的博客 589

[iOS]-RunLoop

iOS-RunLoop浅谈

m0_52192682的博客 614

深入浅出 RunLoop(四):RunLoop 与线程

RunLoop 系列文章 深入浅出 RunLoop(一):初识 深入浅出 RunLoop(二):数据结构 深入浅出 RunLoop(三):事件循环机制 深入浅出 RunLoop(四):RunLoop 与线程 深入浅出 RunLoop(五):RunLoop 与 NSTimer 深入浅出 RunLoop(六):相关面试题 RunLoop 与线程的关系 苹果官方文档中,RunLoop的相关介绍写在线程编...

weixin_42350379的博客 1449

【iOS】—— RunLoop初学

简单的说 RunLoop是一种高级的循环机制,让程序持续运行,并处理程序中的各种事件,让线程在需要做事的时候忙起来,不需要的话就让线程休眠。在App运行的过程中,主线程的Runloop保证了主线程不被销毁从而保证应用的存活,从而能实时接收到用户的响应事件,能够触发定时事件。如果没有Runloop的话,程序执行完代码就会立马return。RunLoop需要处理的消息,包括time以及source消息,他们都属于Mode itemRunLoop也可以被监听,被监听的对象是observer对象,也属于。

m0_62386635的博客 1044
上一篇: Block循环引用
下一篇: 多线程-GCD
I微微一笑I
博客等级 码龄11年 0粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值