应用程序框架设计(3):RuntimeClass与序列化

探察RUNTIME_CLASS之类的秘密 探察RUNTIME_CLASS之类的秘密学mfc学到文档,视图和框架的时候,知道必须在这三个类的派生类的类声明 里加上DECLARE_DYNCREATE,然后在类声明外合适的地方加上IMPLEMENT_DYNCREA TE,然后文档,视图和框架,还有文档模板就可以协调工作了。查看msdn,发现 类似的宏有这几对: DECLARE_DYNAMIC 和 IMPLEMENT_DY 阅读详情

by xushiwei 

SW系统的根是SObject,顾名思义是对普遍意义上的对象的抽象。其主要的支持有:

  • 运行时刻类信息(RuntimeClass)

    运行时刻类信息是经典程序结构中一个极其重要的部分。MFC、VCL、OWL、TurboVision都支持运行时刻类信息。它可能也是经典Object类中唯一比较实用的东西。而同时它也是Object类最容易让人感到迷惑的地方。简单地说,运行时刻类信息主要有两个用途:

    a)创建对象
    b)确定对象的类型

    其实RuntimeClass的实现机制一点也不神秘。它无非是通过类注册方式将类名与其父类、实例创建函数联系起来。

    SW系统的运行时刻类信息定义为:
    typedef SObject  *  ( * FNBUILDER)();
    struct  SRuntimeClass
    {
    LPCTSTR m_lpszClassName;
    //  类名
    SRuntimeClass  *  m_lpBaseClass; //  父类
    FNBUILDER m_fnCreator; //  实例创建
    SRuntimeClass  * m_lpPrevClass;
    };

    每一个SW系统的类都对应有一个SRuntimeClass实例来描述该类。可以用__typeid(Class)来找到定位该类RuntimeClass信息。此宏与MFC的RUNTIME_CLASS(Class)宏完全相同。

    注意到SRuntimeClass有一个成员m_lpPrevClass,它只是用于在系统维护RuntimeClass链表。从而可以让用户通过类的名字来查询一个类的运行时刻类信息,并且创建该类的对象。例如下面的序列化技术就需要这样做。

    SW系统的运行时刻类信息相关函数和宏主要有:

    __typeid(Class) //  定位一个类的运行时刻类信息
    DECLARE_CLASS(Class) //  声明一个类
    IMPLEMENT_CLASS(Class, BaseClass) //  注册一个类

    SObject 
    * gCreateObject(LPCTSTR szClassName);
        
    //  根据一个类的类名,创建该类的一个实例
    const  SRuntimeClass * SObject::GetRuntimeClass()  const ;
        
    //  确定一个对象的RuntimeClass信息
    BOOL SObject::IsKindOf( const  SRuntimeClass  * pRC)  const ;
        
    //  判断一个对象是否是pRC描述的类或者其派生类的实例

    它们的实现代码相当简单,不详细解释:

    #define  __typeid(Class)    (&Class::x_theRuntimeClass)

    #define  DECLARE_CLASS(Class) 
        
    const  SRuntimeClass  * Class::GetRuntimeClass()  const ; 
        
    static   const  SRuntimeClass x_theRuntimeClass; 
        
    static  SObject  * x_CreateObject();

    #define  IMPLEMENT_CLASS(Class, BaseClass) 
    const  SRuntimeClass  * Class::GetRuntimeClass()  const  
    { 
        
    return  __typeid(Class); 
    } 
    const  SRuntimeClass Class::x_theRuntimeClass( 
        _T(#Class),
        __typeid(BaseClass),
        Class::x_CreateObject
        );
    SObject 
    * Class::x_CreateObject()
    {
        return   new  Class;
    }

    const  SRuntimeClass  * x_lpRuntimeClassListHead  =  NULL;

    SRuntimeClass::SRuntimeClass(
        LPCTSTR szClassName, 
        
    const  SRuntimeClass  * lpBaseClass,
        FNBUILDER fnCreator)
    {
        m_szClassName 
    =  szClassName;
        m_lpBaseClass 
    =  lpBaseClass;
        m_fnCreator 
    =  fnCreator;
        m_lpPrevClass 
    =  x_lpRuntimeClassListHead;
        x_lpRuntimeClassListHead 
    =   this ;
    }

    SObject 
    * gCreateObject(LPCTSTR szClassName)
    {
        
    const  SRuntimeClass  * pRC  =  x_lpRuntimeClassListHead;
        
    for  ( ; pRC; pRC  =  pRC -> m_lpPrevClass)
            
    if  ( ! _tcscmp(szClassName, pRC -> m_szClassName))
                
    return  pRC -> fnCreateObject();
        
    return  NULL;
    }

    BOOL SObject::IsKindOf(
    const  SRuntimeClass  * pBaseClass)  const
    {
        SRuntimeClass 
    * pRC  =   this -> GetRuntimeClass();
        
    for  ( ; pRC; pRC  =  pRC -> m_lpBaseClass)
        
    if  (pRC  ==  pBaseClass)
            
    return  TRUE;
        
    return  FALSE;
    }
  • 序列化(Serialization)

    序列化是建立在运行时刻类信息(RuntimeClass)之上的一个应用。所谓序列化是指通过一个自动化机制将对象保存到磁盘,或者将对象从磁盘读出来。尽管序列化有种种的缺点,但不得不承认它是对面相对象思想的一个经典运用。如果你的程序支持序列化,那么存盘的过程你唯一要做的就是,你对应用程序说,“存盘!”而后应用程序就可以将自己保存到磁盘上。你对应用程序说,“读盘!”而后应用程序就会从磁盘中读入数据重建对象。一切就这么简单!

    但是序列化是有严重缺陷的。它没有在兼容性、容错性上的保证。所以它比较适合于保存不被推广的文件格式,例如程序配置,它们可能不必考虑兼容性问题。但在对用户数据的保存上,它应该只是一个理论上的成果。所以尽管Microsoft提供了序列化,但是他自己从来都不会使用序列化去保存数据文件。

    SW系统的序列化实现上与MFC完全一致。但它是在当我还在还没有接触MFC时就已经实现的一个技术。这种一致性应该说是对面向对象思想把握的必然结果。但前提是你掌握了RuntimeClass(在实现RuntimeClass上,我主要借鉴了TurboVision中的实现方式。但是对其进行了大量的简化)。

    面向对象的基础思想是,当你要一个对象做一件事时,你只要向它发送相应的消息,而不必关心对象如何完成此任务。同样地,在接收到用户的存盘消息后,你只是简单地向应用程序发送存盘消息。而应用程序在保存完私有数据后继续向其所有子对象发送存盘消息,这个过程一直延续到简单对象。从而完成存盘动作。当然,为了支持序列化,SObject类要加虚函数:
        virtual Serialize(SArchive &ar);
    其中SArchive类是流操作类。与C++的流操作类基本类似,但它是二进制流。

    在实现序列化中,实现写盘是简单的:
        HRESULT SArchive::WriteObject(SObject *pOb);

    主要需要解决的问题时读盘时对象的重建上。一般地,读盘时会有这样两种需求:

    a)需要读取的对象已经被分配内存(即对象已经存在)。对应的读盘函数为:
        HRESULT SArchive::ReadObject(SObject *pOb);

    b)对象的类型未知,从而对象不可能预先创建。对应读盘函数为:
        HRESULT SArchive::ReadObject(
            const SRuntimeClass *pClassRequest,
            SObject **ppOb);

    情形a)是比较简单的,它不需要RuntimeClass的支持。MFC中没有提供此函数。现考虑情形b)。为了能够从磁盘重建对象,显然应该将一个描述对象的id值与对象的创建函数关联。这已经由RuntimeClass技术完成了。在对象id的选取上,SW系统与MFC都使用了对象的类名。但是这不是唯一的选择。这一点在后面的COM技术部分还会提到。不管怎样,我们可以说,为了能够从磁盘中重建对象,需要在保存对象具体数据之前先保存对象的类信息(RuntimeClass)。读盘时先读出类信息,由此重建对象实例。代码如下:
    void  SArchive::WriteObject(SObject  * pOb)
    {
        WriteString(pOb
    -> GetRuntimeClass() -> m_szClassName);
        pOb
    -> Write( * this );
    }

    对于情形a)的ReadObject:
    HRESULT SArchive::ReadObject(SObject  * pOb)
    {
        LPCTSTR lpsz 
    =  ReadString();
        
    if  ( ! _tcscmp(pOb -> GetRuntimeClass() -> m_szClassName, lpsz))
        {
            delete[] lpsz;
            pOb
    -> Read( * this );
            
    return  S_OK;
        }
        delete[] lpsz;
        
    return  E_FAIL;
    }

    对于情形b)的ReadObject:
    HRESULT SArchive::ReadObject(
        
    const  SRuntimeClass  * pClassReq,
        SObject 
    ** ppOb)
    {
        LPCTSTR szReadedClass 
    =  ReadString();
        
    * ppOb  =  NULL;
        
    if  (pClassReq)
        {
            
    if ( ! _tcscmp(szReadedClass, pClassReq -> m_szClassName))
            
    * ppOb  =  pClassReq -> m_fnCreator();
        }
        
    else
        {
            
    * ppOb  =  ::gCreateObject(szReadedClass);
        }
        delete[] szReadedClass;
        
    if  ( * ppOb)
        {
            (
    * ppOb) -> Read( * this );
            
    return  S_OK;
        }
        
    return  E_FAIL;
    }

    在此基础上,序列化中的另一个问题是,对象间的循环引用问题。在一个复杂的数据结构中,往往有A对象引用B对象,同时B对象又引用A对象。此时用上面的序列化机制,就会出现死循环。MFC以一种巧妙的方式解决了此问题。其核心思想是引入一个Hash表,将已经保存(或即将要保存)的对象指针与对象id(由系列化机制分配)联系起来。在第二次保存此对象时只是保存对象id,这样也就中断了循环。从这一个角度讲,序列化是相当优秀的。它可以轻易地保存任何一种复杂的数据结构。

    考虑了循环引用问题后的对象读写函数如下:
    void  SArchive::WriteObject(SObject  * pOb)
    {
        WriteString(pOb
    -> GetRuntimeClass() -> m_szClassName);
        UINT nObIndex 
    =   - 1 ;
        
    if  (x_pMap -> Lookup(pOb,  & nObIndex))
        {
            
    //  如果对象已经保存!
             * this   <<  nObIndex;
        }
        
    else
        {
            
    * this   <<  (UINT) - 1 ;
            
    //  规定-1表示对象是正常存盘
            x_pMap -> SetAt(pOb, ::gGetObIndex(pOb));
            
    //  这里gGetObIndex是系统为pOb对象分配id号的函数
            
    //  MFC中只是简单地用一个递增编号而已。
            pOb -> Write( * this );
        }
    }

    HRESULT SArchive::ReadObject(
        
    const  SRuntimeClass  * pClassReq,
        SObject 
    ** ppOb)
    {
        
    * ppOb  =  NULL;
        LPCTSTR szReadedClass 
    =  ReadString();
        UINT nObIndex 
    =   - 1 ;
        
    * this   >>  nObIndex;
        
    if  (nObIndex  !=  (UINT) - 1 )
        {
            
    //  已经被保存过的情形!!!
             if  (pClassReq  &&  
                _tcscmp(szReadedClass, pClassReq
    -> m_szClassName))
            {
                delete[] szReadedClass;
                
    return  E_FAIL;
            }
            delete[] szReadedClass;
            
    * ppOb  =  ::gGetObByIndex(nObIndex);
            
    return  S_OK;
        }
        
    //  否则,正常情形,同以前一样!!!
         if  (pClassReq)
        {
            
    if  ( ! _tcscmp(szReadedClass, pClassReq -> m_szClassName))
                
    * ppOb  =  pClassReq -> m_fnCreator();
        }
        
    else
            
    * ppOb  =  ::gCreateObject(szReadedClass);
        delete[] szReadedClass;
        
    if  ( * ppOb)
        {
            (
    * ppOb) -> Read( * this );
            
    return  S_OK;
        }
        
    return  E_FAIL;
    }

 

kubernetes入门之容器运行时类 RuntimeClass是一个用于选择容器运行时配置的特性,容器运行时配置用于运行Pod中的容器。 阅读详情

相关推荐

Xilinx UltraScale+系列FPGA实现USB3.0 DEV 设备 部分原理图+代码分享

Zynq UltraScale+ MPSoC 系列是 Xilinx 新一代 Zynq 平台。在 FPGA 里有完整的 ARM 处理(PS),包含了四核或双核 Cortex-A53 处理器 ,处理器子系统中有DDR内存控制器等大量的外设,在FPGA中完全独立于可编程逻辑单元(PL)如果暂时没有用到PL部分,PS也能单独工作,相当于可以当成一个ARM来用了(以前的不行)。 ARM也包含USB3.0控制器,这是实现USB3.0DEV的关键,根据官方手册(ug1085)描述,USB主(Host)从(Device)

Pierre 1万+

5.1运行时类信息CRuntimeClass类

CRuntimeClass类 在程序运行的过程中辨别对象是否属于特定类的技术叫动态类型识别(Runtime Type Infomation,RTTI)。当函数需要识别其参数类型的时候,或者是必须针对对象所属的类编写特殊目的的代码时,运行期识别就变得非常有用了。 框架程序使用这一技术管理应用程序是非常方便的,因为用户可以任意设计自己的类,框架程序可以在程序执行的时候知道这个类的类名、大小等信息,并能创建这个类的对象。 动态类型识别和动态创建 如何识别对象是否属于某个类呢?区别进程可以使用进程ID,区别窗口可以

qq_36314864的博客 847

mysql 学习笔记(1):mysql 基本概念和 mysql workbench 的基本使用方法

…

qq_52740163的博客 1356

Runtime.class有什么用

Every Java application has a single instance of class Runtime that allows the application to interface with the environment in which the application is running.

Mr_Susy的博客 575

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 471

vscode中运行gcc -v命令失败了,提示:gcc不是内部或外部命令...如何解决?

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

**My Coding Family** 976

许式伟应用程序框架设计:RuntimeClass与序列化

 http://blog.youkuaiyun.com/xushiweizh/archive/2006/11/09/1376290.aspx   SW系统的根是SObject,顾名思义是对普遍意义上的对象的抽象。其主要的支持有:运行时刻类信息(RuntimeClass)运行时刻类信息是经典程序结构中一个极其重要的部分。MFC、VCL、OWL、TurboVision都支持运行时刻类信息。它可能也

杨德龙的专栏 1382

使用 MATLAB/Simulink 对一个开关磁阻电机进行建模

*开关磁阻电机(Switched Reluctance Motor, SRM)**是一种新型的无刷电机,以其简单的机械结构、宽广的调速范围和较高的效率在工业应用中得到了广泛关注。SRM的独特之处在于其定子和转子均为凸极结构,并且通过改变绕组电流的方向来实现转矩的产生和控制。本教程将详细介绍如何使用对一个开关磁阻电机进行建模,并探讨其基本控制策略,特别是针对双凸极结构的SRM。本文介绍了如何使用构建一个开关磁阻电机的双凸极结构模型,并探讨了其基本控制策略。

amy_mhd的博客 203

应用程序框架设计(1):SW系统简介

《应用程序框架设计》是我大学毕业时(2000年)写的毕业论文。在我给公司内部作“应用程序架构”方面的讲座时,曾经作为入门级的参考资料附上。后来不知如何就流传到Internet上,不过是不完整的版本(可尝试在Google中搜索“应用程序框架设计:SW系统”)。回头看这篇文字,最大的感受觉得自己的文字功底是越来越退步了:-) 由于与界面库有关,大家不妨看看。应用程序框架设计许式伟2000年6月一、摘要

QBox/Golang/CERL/StdExt/TPL/WinxGui - 许式伟的专栏 6184

YOLO-World:从入门到实战的多模态目标检测全指南

想象一下,你给模型一张“公园”的图片,再输入文字“红色的郁金香”,它能直接在图中框出所有红色郁金香的位置——这就是多模态目标检测:结合图像视觉信息和文本语义信息,同时完成“是什么”(分类)和“在哪里”(定位)的任务。传统目标检测(如YOLOv5、YOLOv8)只能识别预定义的类别(比如训练时学过“猫”“狗”),但多模态目标检测摆脱了“类别预定义”的限制,只要文本能描述,它就能检测,这就是“开放词汇检测(Open-Vocabulary Detection)”的魅力。

know_F0727的博客 206

使用自己的数据跑通mmsegmentation

使用自己的数据跑通mmsegmentation,解决以下报错:1)type object 'FileClient' has no attribute 'infer_client' 2)It is expected output_size equals to 2, but got size 3 3)训练测试结果报NAN 4)KeyError: 'MyDataset is not in the dataset registry' 5)预训练模型和加载的网络结构层名有差异,unexpected key .....

猫猫与橙子的博客 1657

应用程序框架设计(一) (转)

应用程序框架设计(一) (转)[@more@]应用程序框架设计XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" /> 许式伟 ...

ciya3282的博客 203

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【60.MFC基础——单文档界面应用程序】

MFC的单文档应用程序的数据保存在文档对象中,数据的可视表示保存在视图中。框架窗口类是从CFrameWnd派生来的,文档类是从CDocument派生的,而视图类是从CView或相关类如CScrollView派生来的。

zzxsdu12345的博客 3427

Statistics and Machine Learning Toolbox

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Windows精解:窗口类释疑
下一篇: 应用程序框架设计(2):SW系统的窗口类
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值