事件选择模型

事件研究法笔记 - Stata连享会 作者:连玉君 (知乎 | 简书 | 码云) Stata 现场培训报名中…… 事件研究法 (Event Study) 由 Ball& Brown (1968) 以及 Fama et al. (1969) 开创。 其原理是根据研究目的选择某一特定事件,研究事件发生前后样本股票收益率的变化,进而解释特定事件对样本股票价格变化与收益率的影响,主要被用于检验事件发生前后价格变化... 阅读详情

     转自:http://www.cnblogs.com/venow/archive/2012/06/12/2543065.html

     事件选择(WSAEventSelect)模型是另一个有用的异步 I/O 模型。和 WSAAsyncSelect 模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知,最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递到一个窗口例程。

    事件通知模型要求我们的应用程序针对使用的每一个套接字,首先创建一个事件对象。创建方法是调用 WSACreateEvent 函数,它的定义如下:

 WSAEVENT WSACreateEvent(void);

    WSACreateEvent 函数的返回值很简单,就是一个创建好的事件对象句柄,接下来必须将其与某个套接字关联在一起,同时注册自己感兴趣的网络事件类型(FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT、FD_CLOSE等),方法是调用 WSAEventSelect 函数,其定义如下:

复制代码
   int WSAEventSelect( 

        __in SOCKET s,                       //代表感兴趣的套接字

        __in WSAEVENT hEventObject,         //指定要与套接字关联在一起的事件对象,即用 WSACreateEvent 创建的那一个

        __in long lNetworkEvents            //对应一个“位掩码”,用于指定应用程序感兴趣的各种网络事件类型的一个组合。

    );
复制代码

    其中参数 lNetworkEvents可以用以下数值进行OR操作

       FD_READ 应用程序想要接收有关是否可读的通知,以便读入数据

       FD_WRITE 应用程序想要接收有关是否可写的通知,以便写入数据

       FD_ACCEPT 应用程序想接收与进入连接有关的通知

       FD_CONNECT 应用程序想接收与一次连接完成的通知

       FD_CLOSE 应用程序想接收与套接字关闭的通知

    WSACreateEvent 创建的事件有两种工作状态,以及两种工作模式。工作状态分别是“已传信”(signaled)和“未传信”(nonsignaled)。工作模式则包括“人工重设”(manual reset)和“自动重设”(auto reset)。WSACreateEvent 开始是在一种未传信的工作状态,并用一种人工重设模式,来创建事件句柄。随着网络事件触发了与一个套接字关联在一起的事件对象,工作状态便会从“未传信”转变成“已传信”。由于事件对象是在一种人工重设模式中创建的,所以在完成了一个 I/O 请求的处理之后,我们的应用程序需要负责将工作状态从已传信更改为未传信。要做到这一点,可调用 WSAResetEvent 函数,对它的定义如下:

   BOOL WSAResetEvent(

        __in WSAEVENT hEvent   //事件句柄;

    );

    该函数调用是成功还是失败,会分别返回TRUE或FALSE。

    应用程序完成了对一个事件对象的处理后,便应调用WSACloseEvent函数,释放由事件句柄使用的系统资源。对 WSACloseEvent 函数的定义如下:

   BOOL WSACloseEvent(

        __in WSAEVENT hEvent  //事件句柄;

    );

    该函数调用是成功还是失败,会分别返回TRUE或FALSE。

    一个套接字同一个事件对象句柄关联在一起后,应用程序便可开始I/O处理;方法是等待网络事件触发事件对象句柄的工作状态。WSAWaitForMultipleEvents 函数的设计宗旨便是用来等待一个或多个事件对象句柄,并在事先指定的一个或所有句柄进入“已传信”状态后,或在超过了一个规定的时间周期后,立即返回。下面是WSAWaitForMultipleEvents 函数的定义:

复制代码
 DWORD WSAWaitForMultipleEvents(

        __in DWORD cEvents,

        __in const WSAEVENT* lphEvents,

        __in BOOL fWaitAll,

        __in DWORD dwTimeout,

        __in BOOL fAlertable

 );
复制代码

    cEvents 和 lphEvents 参数定义了由 WSAEVENT 对象构成的一个数组。在这个数组中,cEvents指定的是事件对象的数量,而lphEvents对应的是一个指针,用于直接引用该数组。要注意的是,WSAWaitForMultipleEvents 只能支持由 WSA_MAXIMUM_WAIT_EVENTS 对象规定的一个最大值,在此定义成64个。因此,针对发出 WSAWaitForMultipleEvents 调用的每个线程,该 I/O 模型一次最多都只能支持64个套接字。假如想让这个模型同时管理不止64个套接字,必须创建额外的工作

者线程,以便等待更多的事件对象。

     fWaitAll 参数指定了 WSAWaitForMultipleEvents 如何等待在事件数组中的对象。若设为TRUE,那么只有等 lphEvents 数组内包含的所有事件对象都已进入“已传信”状态,函数才会返回;但若设为FALSE,任何一个事件对象进入“已传信”状态,函数就会返回。就后一种情况来说,返回值指出了到底是哪个事件对象造成了函数的返回。通常,应用程序应将该参数设为 FALSE,一次只为一个套接字事件提供服务。

    dwTimeout参数规定了 WSAWaitForMultipleEvents 最多可等待一个网络事件发生有多长时间,以毫秒为单位,这是一项“超时”设定。超过规定的时间,函数就会立即返回,即使由 fWaitAll 参数规定的条件尚未满足也如此。考虑到它对性能造成的影响,应尽量避免将超时值设为0。假如没有等待处理的事件,WSAWaitForMultipleEvents 便会返回 WSA_WAIT_TIMEOUT。如 dwTimeout 设为 WSAINFINITE(永远等待),那么只有在一个网络事件传信了一个事件对象后,函数才会返回。

    fAlertable 参数,在我们使用 WSAEventSelect 模型的时候,它是可以忽略的,且应设为 FALSE。该参数主要用于在重叠式 I/O 模型中,在完成例程的处理过程中

使用。

    若 WSAWaitForMultipleEvents 收到一个事件对象的网络事件通知,便会返回一个值,指出造成函数返回的事件对象。这样一来,我们的应用程序便可引用事件数组

中已传信的事件,并检索与那个事件对应的套接字,判断到底是在哪个套接字上,发生了什么网络事件类型。对事件数组中的事件进行引用时,应该用WSAWaitForMultipleEvents 的返回值,减去预定义的值 WSA_WAIT_EVENT_0,得到具体的引用值(即索引位置)。如下例所示:

    Index = WSAWaitForMultipleEvents(...);

    MyEvent = EventArray[Index - WSA_WAIT_EVENT_0];

    知道了造成网络事件的套接字后,接下来可调用 WSAEnumNetworkEvents 函数,调查发生了什么类型的网络事件。该函数定义如下:

复制代码
 int WSAEnumNetworkEvents(

        __in SOCKET s,

        __in WSAEVENT hEventObject,

        __out LPWSANETWORKEVENTS lpNetworkEvents

    );
复制代码

    s 参数对应于造成了网络事件的套接字。

    hEventObject 参数则是可选的;它指定了一个事件句柄,对应于打算重设的那个事件对象。由于我们的事件对象处在一个“已传信”状态,所以可将它传入,令其自动成为“未传信”状态。如果不想用 hEventObject 参数来重设事件,那么可使用 WSAResetEvent 函数,该函数之前已经讨论过了。

    lpNetworkEvents参数,代表一个指针,指向 WSANETWORKEVENTS 结构,用于接收套接字上发生的网络事件类型以及可能出现的任何错误代码。

WSANETWORKEVENTS 结构的定义如下:

复制代码
   typedef struct _WSANETWORKEVENTS {

        long lNetworkEvents;

        int iErrorCode[FD_MAX_EVENTS];

    } WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
复制代码

    lNetworkEvents 参数指定了一个值,对应于套接字上发生的所有网络事件类型(FD_READ、FD_WRITE 等)。注意:一个事件进入传信状态时,可能会同时发生多个网络事件类型。例如,一个繁忙的服务器应用可能同时收到 FD_READ 和 FD_WRITE 通知。

    iErrorCode 参数指定的是一个错误代码数组,同 lNetworkEvents 中的事件关联在一起。针对每个网络事件类型,都存在着一个特殊的事件索引,名字与事件类型的名字类似,只是要在事件名字后面添加一个“_BIT”后缀字串即可。例如,对 FD_READ 事件类型来说,iErrorCode 数组的索引标识符便是 FD_READ_BIT。下述代码片断对此进行了阐释(针对FD_READ事件):

复制代码
if (NetwordEvents.lNetworkEvents & FD_READ)
{
    if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
   {
        printf("FD_READ failed with error %d\n", NetworkEvents.iErrorCode[FD_READ_BIT]);
   }
}
复制代码

    理论知识讲完了,让我们来看看演示和代码的实现

    服务器端界面

    

   客户端界面:

    

    服务器和客户端交互的界面截图:

    

    下面我们来看看代码的实现:

    1、初始化socket,固定套路

复制代码
BOOL CWSAEventSelectDlg::InitSocket()
{
    WSAData data;
    int error;
    error = WSAStartup(MAKEWORD(2, 2), &data);
    if (0 != error)
    {
        return FALSE;
    }
    if(HIBYTE(data.wVersion) != 2 && LOBYTE(data.wVersion)) 
    { 
        WSACleanup(); 
        return FALSE; 
    } 
    return TRUE; 
}
复制代码

    2、这里为了简便,定义一个全局socket数组和event数组,一个socket操作关联一个event对象

SOCKET socketArray[WSA_MAXIMUM_WAIT_EVENTS];
WSAEVENT eventArray[WSA_MAXIMUM_WAIT_EVENTS];
DWORD dwTotal = 0;  //记录接入socket的数量

    3、启动一个工作线程,核心代码就在这里,该线程一直循环等待客户端的连接或者发过来的数据显示,主线程闲的蛋疼。。。

复制代码
UINT ThreadProc(LPVOID lpParameter)
{
    CWSAEventSelectDlg *pDlg = (CWSAEventSelectDlg*)lpParameter;
    ASSERT(pDlg != NULL);

    SOCKET acceptSocket = INVALID_SOCKET;
    SOCKET listenSocket = INVALID_SOCKET;
    
    WSAEVENT newEvent;
    WSANETWORKEVENTS NetworkEvents;
    DWORD Index;
    TCHAR buf[1024] = {0};
    CString cstrMsg;

    listenSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (INVALID_SOCKET == listenSocket)
    {
        return FALSE;
    }
    char ipbuf[1024] = {0};
    wcstombs(ipbuf, pDlg->GetIpAddress(), pDlg->GetIpAddress().GetLength());
    const char *p = ipbuf;
    sockaddr_in serverAddress;
    serverAddress.sin_addr.S_un.S_addr = inet_addr(p);
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(pDlg->m_iPort);

    if (SOCKET_ERROR == bind(listenSocket, (sockaddr*)&serverAddress, sizeof(sockaddr_in)))
    {
        return FALSE;
    }
    newEvent = WSACreateEvent();
    WSAEventSelect(listenSocket, newEvent, FD_ACCEPT | FD_CLOSE);
    socketArray[dwTotal] = listenSocket;
    eventArray[dwTotal] = newEvent;
    dwTotal++;
    listen(listenSocket, SOMAXCONN);

    pDlg->ShowText(_T("系统消息:服务器开始监听。。。"));

    while (TRUE)
    {
        Index = WSAWaitForMultipleEvents(dwTotal, eventArray, FALSE, 100, FALSE);
        if (WSA_WAIT_TIMEOUT == Index)
        {
            continue;
        }
        WSAEnumNetworkEvents(socketArray[Index - WSA_WAIT_EVENT_0], eventArray[Index - WSA_WAIT_EVENT_0], &NetworkEvents);
        WSAResetEvent(eventArray[Index - WSA_WAIT_EVENT_0]);
        if (NetworkEvents.lNetworkEvents & FD_ACCEPT)
        {
            if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] != 0)
            {
                continue;
            }
            if (dwTotal > WSA_MAXIMUM_WAIT_EVENTS)
            {
                pDlg->ShowText(_T("系统消息: 客户端超过最大连接数。。。"));
                continue;
            }
            acceptSocket = accept(socketArray[Index - WSA_WAIT_EVENT_0], NULL, 0);
            WSAResetEvent(eventArray[Index - WSA_WAIT_EVENT_0]);
            newEvent = WSACreateEvent();
            WSAEventSelect(acceptSocket, newEvent, FD_READ | FD_WRITE | FD_CLOSE);
            socketArray[dwTotal] = acceptSocket;
            eventArray[dwTotal] = newEvent;
            dwTotal++;
            pDlg->ShowText(_T("系统消息: 客户端已经连接成功"));
        }
        if (NetworkEvents.lNetworkEvents & FD_READ)
        {
            if (NetworkEvents.iErrorCode[FD_READ_BIT] != 0)
            {
                pDlg->ShowText(_T("接受客户端数据失败。。。"));
                continue;
            }
            recv(socketArray[Index - WSA_WAIT_EVENT_0], (char *)buf, 1024, 0);
            WSAResetEvent(eventArray[Index - WSA_WAIT_EVENT_0]);
            cstrMsg = buf;
            pDlg->ShowText(_T("Client: >") + cstrMsg);
        }
        if (NetworkEvents.lNetworkEvents & FD_WRITE)
        {
            if (NetworkEvents.iErrorCode[FD_WRITE_BIT] != 0)
            {
                continue;
            }
        }
        if (NetworkEvents.lNetworkEvents & FD_CLOSE)
        {
            if (NetworkEvents.iErrorCode[FD_CLOSE_BIT] != 0)
            {
                continue;
            }
            pDlg->ShowText(_T("系统消息: 客户端退出。。。"));
            closesocket(socketArray[Index - WSA_WAIT_EVENT_0]);
            WSACloseEvent(eventArray[Index - WSA_WAIT_EVENT_0]);
            for (int i = Index - WSA_WAIT_EVENT_0; i < dwTotal; i++)
            {
                socketArray[i] = socketArray[i + 1];
                eventArray[i] = eventArray[i + 1];
            }
            dwTotal--;
        }
    }
    return TRUE;
}
复制代码

    流程大致是这样:

        1、定义一个socket数组和event数组

        2、每一个socket操作关联一个event对象

        3、调用WSAWaitForMultipleEvents函数等待事件的触发

        4、调用WSAEnumNetworkEvents函数查看是哪个一个事件,根据事件找到相应的socket,然后进行相应的处理:比如数据显示等,同时,记得要将那个event

重置为无信号状态。

       5、循环步骤3和4,直到服务器退出。

网络服务器编程——事件选择模型 4.3.3事件选择模型 事件选择模型将每个套接字和每个WSAEVENT对象对应起来,并且在注册的时候指定需要关注的哪些网络事件。 缺陷:不能同时处理多个套接字,只能同时处理一个事件对应的套接字;一个线程中处理的套接字有限,一般为64;应用程序中要处理大于64个套接字,必须额外创建线程。 //事件选择TCP服务器端 #include &lt;iostream&gt; #include &l... 阅读详情

相关推荐

select网络模型

详细讲解了select网络模型,包括select模型执行的原理,富含有整个select模型的流程图,关于select模型的优点缺点,内在的运行原理。欢迎各位挑错,共同进步

【网络】IO多路复用模型之事件选择模型(第八篇)

事件选择模型(Event Select Model)是Windows网络编程中一种重要的异步IO模型,它允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知。与select模型相比,事件选择模型在处理大量连接时具有更高的效率和更好的性能。

abclui的专栏 978

异步IO之事件选择模型使用说明_高并发_vcsocket异步IO_

处理套接字网络编程的异步问题,本文详细描述了如何使用完成端口加线程池技术处理作为服务器端的高并发问题。

三种事件模型是什么?

第一种事件模型是最早的 DOM0 级模型,这种模型不会传播,所以没有事件流的概念,但是现在有的浏览器支持以冒泡的方式实 现,它可以在网页中直接定义监听函数,也可以通过 js 属性来指定监听函数。这种方式是所有浏览器都兼容的。 ...

weixin_47450807的博客 2560

逆向实战:360加固DEX解密全流程解析(附Frida脚本与SoFixer修复技巧)

本文深入解析360加固DEX解密的全流程,涵盖动态Hook技术、Frida脚本应用及SoFixer修复技巧。通过实战案例详细展示如何识别加固特征、定位关键函数、实现ELF文件修复,并解析RC4和zlib解密算法,为逆向工程师提供全面的技术指导。

weixin_29323551的博客 612

STDP实战:用PyTorch从零搭建脉冲神经网络(附完整代码)

本文提供了基于PyTorch从零搭建脉冲神经网络的实战教程,重点讲解了STDP学习规则的原理与工程实现。通过构建LIF神经元模型和向量化STDP层,并结合泊松编码,详细演示了如何构建一个能够进行无监督特征学习的混合网络架构,为探索神经形态计算和低功耗实时学习方案提供了完整代码与实践指南。

weixin_29056145的博客 267

Java核心要点提炼之IO

一、同步和异步、阻塞和非阻塞 1.概念 1)同步。在发出一个功能调用时,在没有得到结果之前,该调用就不返回。 2)异步。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。 同步存在等待,异步执行不存在等待。A叫B去吃饭吧,A等着和B一起去,就是同步;A说完我们去吃饭吧,自己先走了,这就是异步;...

chen 307

ChatGPT设置密钥后Codex免手机验证:配置顺序与身份凭证复用机制

API Key 是一种用于身份识别的凭证,其核心原理是通过预配置的密钥替代交互式登录流程。在开发工具中,密钥认证优先级通常高于会话认证,当本地存在有效密钥时,工具会直接复用该凭证,从而减少重复验证环节。这种机制的技术价值在于提升开发效率与配置一致性,尤其适用于多设备切换、CI/CD 流水线及编程辅助工具等场景。以 Codex 为例,在 ChatGPT 界面提前配置 API 密钥后,Codex 启动时可读取持久化存储的密钥,避免触发手机号验证,实现身份凭证的跨入口复用。

weixin_33940469的博客 486

TCP.03.事件选择模型

文章目录基础知识消息机制事件机制事件选择模型步骤事件选择模型相关函数创建、销毁、重置事件对象绑定,投递事件对象(重点)等待事件 https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket 基于TCP/IP的网络编程还有5种模型: SELECT模型 事件选择模型 异步选择模型 重叠IO模型 完成端口模型 这次先讲第二种。 基础知识 windows处理用户行为有两种方式: 消息机制 其核心是消息队列,就是将要处理的

老毛的博客 2108

arduino uno spi驱动12864

arduino uno spi驱动12864

yvee的博客 2060

新能源知识库(37)三代储能电芯介绍

2025年储能电芯三代技术演进概述 截至2025年6月,储能电芯已明确划分为三代: 第一代(280Ah):2019-2023年主流,能量密度180Wh/kg,循环寿命8000次,成本降至0.6元/Wh; 第二代(314Ah):2023年起主导,容量超1kWh,能量密度提升20%,循环寿命达15000次,系统成本降低15%; 第三代(500Ah+):2024年量产,能量密度突破440Wh/L(如宁德时代587Ah、阳光电源684Ah),20尺集装箱容量达6-9MWh,零部件成本降30%。 技术路线分化:卷绕派

竹君子之家 7915

5种Windows网络模型之事件选择模型

  上一篇博客5种Windows网络模型之select模型介绍了select模型克服了CS模型的几种缺点,但是select模型也存在缺陷,比如当select函数将所有socket投递给操作系统后,系统系统帮我们把有信号的socket装进fd_set结构体,直至返回有事件的socket集合这一过程程序是阻塞等待的,为了克服这个缺点人们提出了事件选择模型。

nthzduang_的博客 886

Python爬虫实战:Boss直聘职位数据采集实战 - Playwright + 结构化解析完整方案(附CSV导出 + SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 2188

网络编程 事件选择模型

网络编程的事件选择模型函数及代码解析

weixin_62859191的博客 1270

流体动力学仿真软件:Star-CCM+_(1).Star-CCM+基础及入门

Star-CCM+的用户界面(UI)分为多个部分,包括菜单栏、工具栏、工作区、视图窗口和控制台。菜单栏包含文件、编辑、视图、工具等常用菜单。例如,“File”菜单可以用于打开、保存和退出项目。工具栏提供常用的工具按钮,如新建项目、打开项目、保存项目等。也可以自定义工具栏,添加常用的功能按钮。工作区显示当前项目的结构和各个对象。可以通过拖拽方式组织和管理项目中的各个部分。视图窗口显示几何模型、网格、结果等。可以通过不同的视图模式查看和分析数据。控制台显示软件的运行日志和输出信息。

kkchenjj的博客 1202

机器人环境仿真软件:Gazebo_(6).传感器仿真

通过 Gazebo 和 ROS,我们可以方便地配置和使用多种传感器,进行机器人环境的仿真和调试。传感器仿真不仅帮助我们验证和测试机器人的感知能力,还可以在真实部署前发现和解决潜在的问题。本节详细介绍了如何在 Gazebo 中配置激光雷达、摄像头、IMU、声纳和 GPS 传感器,并展示了如何在 ROS 中接收和处理这些传感器数据。此外,还介绍了多传感器融合的基本方法和调试工具,希望这些内容能对你的机器人仿真工作有所帮助。

kkchenjj的博客 1389

Select模型和事件选择模型

Select通信模型Select模型是Windows下几种网络通信模型中最基础的一种。它的“中心思想”就是使用Select函数,做到避免一个客户端连接一个线程的方式。作为最基础的网络通信模型,了解Select模型可以很好的对其它通信模型进行理解和优化。Select模型服务端界面:事件选择模型事件选择模型是Windows通信模型中的一种,它和异步选择模型的最大区别在于网络事件会投递至一个事件对象句柄...

weixin_33910434的博客 470

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【网络编程】事件选择模型

事件选择(WSAEventSelect) 模型是另一个有用的异步 I/O 模型。和 WSAAsyncSelect 模 型类似的是,它也允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知,最 主要的差别在于网络事件会投递至一个事件对象句柄,而非投递到一个窗口例程。

Antonio915的博客 1032

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

STM32 GPIO寄存器深度解析:从点灯到精通底层操作

GPIO是嵌入式开发中最基础的外设,理解其寄存器操作是掌握STM32底层原理的关键。通过直接配置MODER、OTYPER、OSPEEDR、PUPDR等寄存器,开发者可以精确控制引脚模式、输出类型、速度及上下拉,实现推挽、开漏、复用功能等配置。寄存器操作不仅提升代码效率,还能在调试中快速定位问题,尤其适用于底层驱动、中断处理及性能优化场景。本文以GPIO为例,深入讲解寄存器配置逻辑与实操技巧,帮助读者跨越从库函数到寄存器操作的门槛,为学习定时器、中断等复杂外设奠定基础。

weixin_33894640的博客 321

廖雪峰Python教程[完整版]

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

UDP.3.事件选择模型

文章目录基础知识消息机制事件机制事件选择模型步骤事件选择模型逻辑 https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-socket 基于UDP的网络编程还有5种模型: SELECT模型 事件选择模型 异步选择模型 重叠IO模型 完成端口模型 这节讲基于UDP的事件选择模型。 关于基础知识,前面有写过,这里贴过来: 基础知识 windows处理用户行为有两种方式: 消息机制 其核心是消息队列,就是将要处理的操作放到队列

老毛的博客 591

Windows socket I/O模型之事件选择(WSAEventSelect )模型

1.事件选择模型:和异步选择模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。对于异步选择模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型。事件选择模型和异步选择模型最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。 2.创建事件对象:事件选择模型要求应用程序针对打算使用事件选择模型的每一个套接字,首先创建一个事件对象。创建方法...

潮湿的桥 343

TCP/IP 事件选择模型

服务端: 1.打开网络库 int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 2.校验版本号 2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion) // (检验版本号是 2.2) 3.创建socket 套接字 SOCKET socket(int af, int type, int protocol); 4.绑定地址与端口号 int bind(.

m0_60178310的博客 402

三.Windows I/O模型之事件选择(WSAEventSelect )模型

1.事件选择模型:和异步选择模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。对于异步选择模型采用的网络事件来说,它们均可原封不动地移植到事件选择模型。事件选择模型和异步选择模型最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。2.创建事件对象:事件选择模型要求应用程序针对打算使用事件选择模型的每一个套接字,首先创建一个事件对象。...

dixiao3078的博客 353

UDP/IP 事件选择模型

事件选择模型核心: 为每一个socket创建一个事件对象,将socket和对应的事件对象绑定到一起,并投递给操作系统,由操作系统帮我们进行监视,当对应的socket有响应,该对应的事件会被置成有信号,我们获取该信号,进行分类处理。 UDP/IP 事件选择模型: UDP/IP 是面向非连接的,不可靠的,基于数据报的传输层协议; 对于服务端只有一个socket(服务端socket),直接创建一个事件对象,将该socket和对应的事件对象进行绑定,并投递给系统,之后等待信号,获取信号,之后进行分类处理。

m0_60178310的博客 453
上一篇: 完成端口(Completion Port)详解
下一篇: ORA-00600: 内部错误代码, 参数: [19004], [], [], [], [], []
Maybe______
博客等级 码龄10年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值