精华内容
下载资源
问答
  • 这不是一件轻松的事情,因为你首先要对符号模型有一定的了解。所以本文的主要目的就是介绍DbgHelp中的符号模型。   符号模型 这里所说的“符号模型”指的是各种符号之间的逻辑关系,虽然微软定义了各种不同格式...

    在接下来的文章中会讲解如何在调试器中显示局部变量和全局变量的类型和值。实现这个功能一定要有调试符号的支持,因为调试符号记录了每个变量的名称,类型,地址,长度等信息。这不是一件轻松的事情,因为你首先要对符号模型有一定的了解。所以本文的主要目的就是介绍DbgHelp中的符号模型。

     

    符号模型

    这里所说的“符号模型”指的是各种符号之间的逻辑关系,虽然微软定义了各种不同格式的符号文件,但是它们使用的符号模型都是相同的。正因为如此,使用DbgHelp可以读取各种格式的符号文件,而且DIA文档中关于符号模型的那部分内容也适用于DbgHelp,正好弥补了DbgHelp文档中缺少的内容。遗憾的是,这部分内容非常少,点到即止,不足以让人完整地学习符号模型,而且相关文档非常缺乏,或者可以说几乎没有,给使用调试符号的人带来了极大的不便。

     

    在开发MiniDebugger的过程中,我自己也遇到了上述的窘境,在完全不了解符号模型的情况下,靠着那一点点可怜的文档,用代码来探索这个模型的原理。过程虽然艰辛,但最终还是对该模型有了一些浅显的了解。不敢说我对该模型的了解完全正确,但我仍然希望和大家分享一下这些知识,希望会对大家有所帮助。

     

    微软的符号模型是语言无关的,它支持使用C/C++COM.Net等编写的程序,所以它是一个通用的模型。对于C/C++程序来说,该符号模型有很多额外的特征是用不到的,调试C/C++程序的调试器只会使用它的一个子集。

     

    符号文件中的大部分信息都是通过符号(Symbol)来表示的,函数,变量,类型,复合类型的字段,函数参数等等都是符号。符号有两个最基本的属性:符号类型(SymTag)和符号IDSymIndexId)。符号ID是每个符号的唯一标识符,它由符号处理器来管理,同一个符号的ID每次运行都有可能不同,甚至在同一次运行中,同一个符号通过不同方法获取到的ID都有可能不同,所以我们编写调试器的时候不应该依赖符号ID的值,它只是符号的标识符。符号类型指明了符号属于上述的哪种类型,它的取值可以是SymTagEnum枚举中的任意一个。SymTagEnum定义在cvconst.h头文件中,这个头文件属于DIA,在Visual Studio默认的包含文件夹中不存在该文件。如果嫌麻烦,可以自己定义该枚举。它的定义如下:


    enum SymTagEnum {
        SymTagNull,
        SymTagExe,
        SymTagCompiland,
        SymTagCompilandDetails,
        SymTagCompilandEnv,
        SymTagFunction,         //函数
        SymTagBlock,
        SymTagData,             //变量,函数实参,复合结构字段,枚举值
        SymTagAnnotation,
        SymTagLabel,
        SymTagPublicSymbol,
        SymTagUDT,              //用户定义类型,例如struct,class和union
        SymTagEnum,             //枚举类型
        SymTagFunctionType,    //函数类型
        SymTagPointerType,      //指针类型
        SymTagArrayType,        //数组类型
        SymTagBaseType,         //基本类型
        SymTagTypedef,          //typedef类型
        SymTagBaseClass,        //基类类型
        SymTagFriend,           //友元类型
        SymTagFunctionArgType,  //函数形参类型
        SymTagFuncDebugStart, 
        SymTagFuncDebugEnd,
        SymTagUsingNamespace, 
        SymTagVTableShape,
        SymTagVTable,
        SymTagCustom,
        SymTagThunk,
        SymTagCustomType,
        SymTagManagedType,
        SymTagDimension
    };

    C/C++中可以用代码写出来的,“看得见”的类型都作了注释,下文会提及这些类型。而那些编译器定义的,“看不见”的类型,或者与C/C++无关的类型,则几乎不会用到,因此本文不会提及这些类型。

     

    代码和数据符号

    代码和数据是程序的基本组成部分, SymTagFunctionSymTagData分别表示这两种类型的符号。代码一定在函数中,所以 SymTagFunction表示函数符号;而数据有可能是变量,常量,实参,复合类型的字段,枚举类型的值等, SymTagData统一表示这些符号。代码和数据符号的信息都可以通过 SYMBOL_INFO结构体来表示,其定义如下:

    typedef struct _SYMBOL_INFO {
        ULONG SizeOfStruct;
        ULONG TypeIndex;
        ULONG64 Reserved[2];
        ULONG Index;
        ULONG Size;
        ULONG64 ModBase;
        ULONG Flags;
        ULONG64 Value;
        ULONG64 Address;
        ULONG Register;
        ULONG Scope;
        ULONG Tag;
        ULONG NameLen;
        ULONG MaxNameLen;
        TCHAR Name[1];
    } SYMBOL_INFO,  *PSYMBOL_INFO;

    下面解释每一个字段的含义:

    SizeOfStructSYMBOL_INFO结构体的长度,在使用该结构体调用函数之前必须将这个字段设置为sizeof(SYMBOL_INFO)

    TypeIndex:符号所属类型的ID,指明了符号的类型。

    Reserved:保留字段。

    Index:符号的ID

    Size:符号的大小。对于函数来说,Size字段是函数所有指令的字节大小;而对于SymTagData类型的符号来说,这个字段的值通常都是0,不能通过它获取变量的大小,而应该通过变量的类型符号来获取。下文会提及这部分内容。

    ModBase:符号所在模块的基地址。

    Flags:这个字段的值是几个位标志的组合,描述了符号的一些性质。最常用的一个位标志是SYMFLAG_REGREL,表示符号的地址是寄存器相关的,此时Address字段保存的不是符号的虚拟地址,而是一个偏移量,需要将这个偏移量和某个寄存器的值相加才得到虚拟地址。局部变量和实参符号的Flags字段都有这个标志,它们使用EBP寄存器的值作为基址。其它位标识的含义请参考MSDN文档。

    Value:符号的值。只有当符号是常量时,这个字段才有效。C/C++程序中含有const修饰符的变量并不视为常量,所以这些符号的Value字段是无效的。枚举类型的值是常量,通过Value字段可以获取每个枚举值的整型值。

    Address:符号的地址。对于函数和全局变量来说,这个字段的值就是它们的虚拟地址;对于局部变量和参数来说,这个字段的值是一个偏移量,需要将其和EBP寄存器的值相加才得到虚拟地址。

    Register:如果Flags字段包含SYMFLAG_REGREL,那么Register字段保存的是寄存器的标识符。通常不需要关注这个字段,因为兼容IA32CPU总是使用EBP寄存器来访问局部变量和实参。

    Scope:这个字段由DIA使用,不必关注这个字段。

    Tag:符号的类型。它的值是SymTagEnum枚举中的一个。

    NameLen:符号名称的长度,即Name字段中的字符个数,不包括字符串尾部的0

    MaxNameLen:指定Name字段的长度。Name字段定义为TCHAR[1],为了获取符号的名称,需要分配足够大的缓冲区,其头部是SYMBOL_INFO结构,剩下的部分用来保存符号名称,MaxNameLen就是用来指定缓冲区剩下部分的长度的。例如:

     BYTE buffer[sizeof(SYMBOL_INFO) + sizeof(TCHAR) * 128];
     
     PSYMBOL_INFO pSymInfo = (PSYMBOL_INFO)buffer;
     
     pSymInfo->MaxNameLen = 128;

    Name:符号的名称。

     

    可以通过SymFromNameSymFromAddr函数来获取某个符号信息,它们都通过SYMBOL_INFO结构体来返回信息。这两个函数的使用方法在前面的文章中已经提到过了。

     

    类型符号

    类型符号就像是代码和数据符号的元数据,描述了它们的各种属性。在 SymTagEnum枚举中, SymTagUDTSymTagEnumSymTagFunctionTypeSymTagPointerTypeSymTagArrayTypeSymTagBaseTypeSymTagTypedefSymTagBaseClassSymTagFriendSymTagFunctionArgType都属于类型符号。代码和数据符号通过类型符号的 ID来引用它们所属的类型, SYMBOL_INFO中的 TypeIndex就是类型符号的 ID。各种类型符号有各自的属性,在 DbgHelp中,可以通过 SymGetTypeInfo函数来获取类型符号的各种属性。该函数的声明如下:

    BOOL WINAPI SymGetTypeInfo(
        HANDLE hProcess,
        DWORD64 ModBase,
        ULONG TypeId,
        IMAGEHLP_SYMBOL_TYPE_INFO GetType,
        PVOID pInfo
    );

    第一个参数是符号处理器的标识符。第二个参数 ModBase是类型符号所在模块的基地址,只有该模块具有该类型时才可以获取到它的属性。第三个参数 TypeId是类型符号的 ID。至于参数 GetType是一个 IMAGEHLP_SYMBOL_TYPE_INFO枚举,表示要获取哪种属性,同一个枚举值对于不同的类型可能有不同的意义,在下文讲解每种类型符号时会对此进行说明。这里先给出 IMAGEHLP_SYMBOL_TYPE_INFO枚举的定义:

    typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO {
        TI_GET_SYMTAG,
        TI_GET_SYMNAME,
        TI_GET_LENGTH,
        TI_GET_TYPE,
        TI_GET_TYPEID,
        TI_GET_BASETYPE,
        TI_GET_ARRAYINDEXTYPEID,
        TI_FINDCHILDREN,
        TI_GET_DATAKIND,
        TI_GET_ADDRESSOFFSET,
        TI_GET_OFFSET,
        TI_GET_VALUE,
        TI_GET_COUNT,
        TI_GET_CHILDRENCOUNT,
        TI_GET_BITPOSITION,
        TI_GET_VIRTUALBASECLASS,
        TI_GET_VIRTUALTABLESHAPEID,
        TI_GET_VIRTUALBASEPOINTEROFFSET,
        TI_GET_CLASSPARENTID,
        TI_GET_NESTED,
        TI_GET_SYMINDEX,
        TI_GET_LEXICALPARENT,
        TI_GET_ADDRESS,
        TI_GET_THISADJUST,
        TI_GET_UDTKIND,
        TI_IS_EQUIV_TO,
        TI_GET_CALLING_CONVENTION,
        TI_IS_CLOSE_EQUIV_TO,
        TI_GTIEX_REQS_VALID,
        TI_GET_VIRTUALBASEOFFSET,
        TI_GET_VIRTUALBASEDISPINDEX,
        TI_GET_IS_REFERENCE,
        TI_GET_INDIRECTVIRTUALBASECLASS,
    } IMAGEHLP_SYMBOL_TYPE_INFO;

     

    最后一个参数pInfo是一个输出参数,函数的结果通过该参数来返回。GetType参数的值不同,pInfo的实际类型也不同,下文会对此进行说明。

    虽然文档中没有说明,但是SymGetTypeInfo也可以用来获取代码和数据符号的属性,这反映了所有符号都使用相同或相似的格式来保存。

    下面针对每个类型符号进行详细说明。(我不会罗列每个类型符号的所有属性,只会对最基本且重要的属性进行说明)

    SymTagBaseType

    表示基本类型。基本类型有两个重要的属性,分别是长度和基本类型 ID。长度即该类型在内存中占用多少个字节,而基本类型 ID则指明是哪种基本类型,例如 charintdouble等。 DbgHelp通过 BaseTypeEnum枚举来表示基本类型 ID,它的定义如下:

    enum BaseTypeEnum {
       btNoType = 0,
       btVoid = 1,
       btChar = 2,
       btWChar = 3,
       btInt = 6,
       btUInt = 7,
       btFloat = 8,
       btBCD = 9,
       btBool = 10,
       btLong = 13,
       btULong = 14,
       btCurrency = 25,
       btDate = 26,
       btVariant = 27,
       btComplex = 28,
       btBit = 29,
       btBSTR = 30,
       btHresult = 31
    };

    上文说过,微软的符号模型是通用的,不针对某种语言,所以 BaseTypeEnum中的值与 C/C++中的基本类型有些出入,不能将它们直接等同起来。为了辨别一个 C/C++的基本类型,需要同时根据长度和基本类型 ID的值来进行判断,如下表所示:

    BaseTypeEnum

    Length

    C/C++ base type

    btBool

    1

    bool

    btChar

    1

    char

    btUInt

    1

    unsigned char

    btWChar

    2

    wchar_t

    btInt

    2

    short

    btUInt

    2

    unsigned short

    btInt

    4

    int

    btUInt

    4

    unsigned int

    btLong

    4

    long

    btULong

    4

    unsigned long

    btInt

    8

    long long

    btUInt

    8

    unsigned long long

    btFloat

    4

    float

    btFloat

    8

    double

    长度可以使用TI_GET_LENGTH来获取,而基本类型ID可以通过TI_GET_BASETYPE来获取,此时pInfo的类型都是DWORD*。最后要注意的一点是,基本类型没有名称,不能通过TI_GET_SYMNAME获取名称。

    SymTagPointerType

    表示指针类型。指针类型有两个重要属性:是否引用,以及类型ID。在C++中,引用本质上是通过指针来实现的,所以指针类型和引用类型都由SymTagPointerType来表示,并通过“是否引用”这个属性来区别。而指针指向的类型的ID,则可以通过“类型ID”这个属性来获取。是否引用可以通过TI_GET_IS_REFERENCE来获取,pInfo的类型是BOOL*;类型ID可以通过TI_GET_TYPEID来获取,pInfo的类型是DWORD*。另外,指针类型也有一个长度属性,通过TI_GET_LENGTH来获取,pInfo的类型是DWORD*。在32位和64位操作系统中,指针的长度总是4个字节和8个字节,因此这个属性不怎么重要。指针类型同样没有名称。

    SymTagArrayType

    表示数组类型。数组类型有以下的属性:元素类型ID,元素个数以及数组长度。元素类型ID指明了数组的元素是哪种类型;元素个数的含义不言而喻了;数组长度即整个数组所占用的字节数。以上三个属性分别通过TI_GET_TYPEIDTI_GET_COUNTTI_GET_LENGTH来获取,前两者使用的pInfo类型都是DWORD*,最后一个使用的pInfo类型是ULONG64*。数组类型也没有名称。

    SymTagEnum

    表示枚举类型。枚举类型有以下的属性:名称,是否嵌套,基本类型 ID,长度,枚举值个数,以及枚举值集合。名称即定义枚举时使用的名称,如果使用的是匿名类型,例如:

    enum {
        aeOne,
        aeTwo,
        aeThree,
    } anonymousEnum;

    那么使用的是由编译器产生的名称。如果枚举定义在一个 UDT里面,那么“是否嵌套”属性的值就为真,此时它的名称前面会加上 UDT的名称,例如 Class::NestedEnum。在定义枚举类型的时候可以指定枚举值使用何种基本类型,基本类型 ID属性和长度属性就是用来确定这个基本类型的,它们的获取方法以及表示的含义与 SymTagBaseType类型符号相同。枚举值个数的意义不言而喻,例如上面的匿名枚举就有三个枚举值。枚举类型里的每个枚举值同样都是符号,这些符号的类型是 SymTagData,属于数据符号,不是类型符号,为了叙述方便,下文将这些符号称为“枚举值符号”。枚举值符号都是常量,都拥有名称以及值这两个属性。由于枚举类型的变量实际上保存的是枚举值的整型值,通过枚举值符号的值属性,就可以确定变量保存的是哪个枚举值。枚举类型的名称属性可以通过 TI_GET_SYMNAME获取,此时 pInfo的类型是 WCHAR**,我们不需要分配缓冲区来接收名称,因为 SymGetTypeInfo会完成这个任务,并把缓冲区的指针赋值给 *pInfo,我们要做的就是在使用完名称之后用 LocalFree释放这个缓冲区,例如:

    WCHAR* pBuffer;
    
    SymGetTypeInfo(
       GetDebuggeeHandle(),
       modBase,
       typeID,
       TI_GET_SYMNAME,
       &pBuffer);
    
    std::wstring typeName(pBuffer);
    
    LocalFree(pBuffer);

    是否嵌套可以通过 TI_GET_NESTED获取, pInfo的类型是 DWORD*,如果为真, *pInfo的值为,否则为 0。枚举个数可以通过 TI_GET_CHILDRENCOUNT获取, pInfo的类型为 DWORD*。至于枚举值符号的获取则比较麻烦,首先需要分配一块足够大的缓冲区,然后通过 TI_FINDCHILDREN来获取, pInfo的类型是 TI_FINDCHILDREN_PARAMS*。下面是示例:
    TI_FINDCHILDREN_PARAMS* pFindParams =
       (TI_FINDCHILDREN_PARAMS*)malloc(sizeof(TI_FINDCHILDREN_PARAMS) + childrenCount * sizeof(ULONG));
    
    pFindParams->Start = 0;
    pFindParams->Count = childrenCount;
    
    SymGetTypeInfo(
       GetDebuggeeHandle(),
       modBase,
       typeID,
       TI_FINDCHILDREN,
       pFindParams);

    childrenCount表示枚举值的个数。 TI_FINDCHILDREN_PARAMS的定义如下:

     typedef struct _TI_FINDCHILDREN_PARAMS {
        ULONG Count;
        ULONG Start;
        ULONG ChildId[1];
    } TI_FINDCHILDREN_PARAMS;

    StartCount字段分别指示从第几个枚举值开始获取(以0为基数),和获取多少个枚举值,在调用SymGetTypeInfo之前需要初始化这两个字段。而ChildID是保存枚举值符号的ID的数组,它只定义为1个元素的长度,所以我们要自己分配缓冲区来容纳所有的ID。对于枚举值符号来说,虽然它不是类型符号,但也可以通过SymGetTypeInfo来获取属性。枚举值符号的名称同样通过TI_GET_SYMNAME来获取,方法跟上文所说的一致。枚举值的整型值通过TI_GET_VALUE来获取,pInfo的类型是VARIANT*VARIANT可以表示多种不同类型的值,可以通过不同的字段来获取这些值。下表列举了VARIANT的一些字段与C/C++基本类型之间的关系:

    Field

    C/C++ Base Type

    boolVal

    bool

    cVal

    char

    bVal

    unsigned char

    uiVal

    wchar_t

    iVal

    short

    uiVal

    unsigned short

    intVal

    int

    uintVal

    unsigned int

    lVal

    long

    ulVal

    unsigned long

    llVal

    long long

    ullVal

    unsigned long long

    fltVal

    float

    dblVal

    double

     

    SymTagUDT

    表示用户定义类型,例如 structclassunionUDT具有以下的属性:名称,长度,是否嵌套,种类,成员个数,成员集合。 UDT名称的注意事项和获取方法与枚举类型名称一模一样,这里就不再赘述了。长度属性表示UDT在内存中实际占用的字节数,这是对齐后的大小,通过TI_GET_LENGTH获取。是否嵌套指明该UDT是否定义在另一个UDT里面,通过TI_GET_NESTED获取。种类属性则指明了UDT是struct,class还是union,通过TI_GET_UDTKIND获取,此时pInfo的值是DWORD*。它的值使用下面的枚举:

    enum UdtKind { 
         UdtStruct,
         UdtClass,
         UdtUnion
    };

    这个枚举同样定义在cvconst.h中。UDT实际上是一个新的作用域,在UDT里面可以定义变量,函数和类型等,这些称为UDT的成员,成员的获取方法与枚举值的获取方法的完全一致,TI_FINDCHILDREN_PARAMS结构的ChildId数组保存的是每个成员符号的ID。每个UDT成员都是符号,例如成员方法属于代码符号,成员变量属于数据符号,而内部类型属于类型符号,实际上UDT及其成员是一个递归的定义。对于成员变量,有一个特殊的偏移量属性,指明了成员变量的地址相对于UDT地址的偏移,可以通过TI_GET_OFFSET来获取,pInfo的类型是DWORD*

    SymTagBaseClass

    如果一个类继承了另一个类,那么子类会有一个特殊的成员符号,类型为SymTagBaseClass,是一个类型符号。它的属性有:名称,类型ID以及偏移,分别通过TI_GET_SYMNAMETI_GET_TYPEIDTI_GET_OFFSET获取。名称属性是父类的名称,类型ID属性是父类的类型ID,而偏移属性是父类部分在子类对象中的偏移。子类继承了多少个父类,就有多少个SymTagBaseClass成员。

    SymTagFunctionType

    表示函数类型。要注意SymTagFunctionSymTagFunctionType的区别,SymTagFunction表示函数的本体,包括声明和定义;而SymTagFunctionType仅表示函数的部分声明,包括返回值和形参列表,不包括函数的名称。在函数符号的SYMBOL_INFO结构体中,TypeIndex字段就是SymTagFunctionType类型符号的ID。函数类型有以下的属性:返回值类型ID,形参个数,以及形参集合。返回值类型ID指明了返回值的类型,可以通过TI_GET_TYPEID获取。如果返回值是void,那么类型ID是SymTagBaseType类型符号的ID,因为BaseTypeEnum有一个btVoid的枚举值。形参个数通过TI_GET_CHILDRENCOUNT获取,每个形参通过TI_FINDCHILDREN获取,具体方法请参考枚举类型。

    SymTagFunctionArgType

    表示函数形参。SymTagFunctionType通过TI_FINDCHILDREN获取到的都是SymTagFunctionArgType类型的符号,这种符号只有一个类型ID属性,指明了形参的类型,可以通过TI_GET_TYPEID获取。由于函数形参的名称无关紧要,所以这种符号没有名称属性。

    SymTagTypedef

    表示使用typedef关键字定义的类型。这种符号有一个类型ID属性,指明真正的类型,可以通过TI_GET_TYPEID获取。

    SymTagFriend

    表示友元。我尝试了所有可能的方法,都无法获取到SymTagFriend类型的符号,所以对这种符号没有了解。

     

    总结

    通过上文的描述,相信大家对微软的符号模型已经有一定的了解,这里对此作一个总结。

    在调试符号中,大部分事物都由符号来表示,符号主要有三种类型:代码,数据和类型。代码符号表示函数;数据符号表示变量,实参,枚举值以及UDT的数据成员;类型符号表示代码符号和数据符号的类型,描述了这些符号的各种属性。类型符号包括基本类型,指针类型,数组类型,枚举类型,UDT类型,函数类型,函数形参类型,基类类型,typedef类型以及友元类型。

     


    作者:Zplutor
    出处:http://www.cnblogs.com/zplutor/
    本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    类型符号的信息可以通过SymGetTypeInfo函数来获取,对GetType参数传入不同的值,就可以获取到类型的各种信息。函数通过pInfo来返回信息,pInfo的类型根据GetType的值而变化。不同的类型符号有不同的属性,有些GetType的值只对特定的类型符号有效。代码符号和数据符号的信息可以通过SymFromNameSymFromAddr获取,这两个函数通过SYMBOL_INFO结构体来返回。也可以对代码符号和数据符号使用SymGetTypeInfo来获取符号的属性。

     

    微软的符号模型非常适合使用面向对象的思想去理解,下图是相关的类图:(图中没有友元类型符号)


    展开全文
  • 来源:深度学习这小事按照之前的常识,结合了算法和符号推理技术的神经符号模型(Neurosymbolic Models),会比神经网络更适合于预测和解释任务,此外,神经符号模型在反事实方面...

    来源:深度学习这小事

    按照之前的常识,结合了算法和符号推理技术的神经符号模型(Neurosymbolic Models),会比神经网络更适合于预测和解释任务,此外,神经符号模型在反事实方面表现更好。

     

    而Neural-Symbolic,本质上其实是将现代数学中的分析学和代数学结合的产物。

     

    分析学擅长处理数值、函数、逼近等问题, 代数学擅长处理推演、抽象、结构等问题,如果能适当将两者结合,会有很可观的效果。

    然而,近日,DeepMind的研究人员声称,在正确的测试条件下,神经网络的性能会优于神经符号模型。

     

    与之前的研究结论相反,研究人员认为,对于可以衡量高级认知功能并基于视觉的任务来说,基于分布式表示的神经网络模型确实表现良好,并已经明显胜过了现有的神经符号模型。


    在论文中,作者描述了一种关于视频的时空推理的体系结构,此结构可以学习到视频中的所有成分,并且所有中间的表示都贯穿分布在整个神经网络层中。

     

    论文地址:https://arxiv.org/pdf/2012.08508.pdf

     

    该团队表示,该体系结构在一个流行的数据集上的所有任务的表现,都超过了神经符号模型,并在反事实问题上优势最明显。


    这一研究成果,可能会非常有助于设计和开发具有推断作用的机器。

     

    该文章提出的神经网络架构,主要利用注意力机制,来实现对集成信息的高效提取。


    有人可能要问了,什么是注意力机制呢?

     

    注意力(attention)其实是一个非常常见,但是又会被忽略的事实。比如天空一只鸟飞过去的时候,往往你的注意力会追随着鸟儿,天空在你的视觉系统中,自然成为了一个背景(background)信息。

     

    计算机视觉中的注意力机制(attention)的基本思想,就是想让系统学会注意力——能够忽略无关信息而关注重点信息。

     

    总的来说,注意力机制就是一种一次只专注于一个元素或几个元素的算法机制。

     

    对于DeepMind这一研究来说,整个训练过程都是自我监督的,这意味着该模型必须使用底层的动态机制,来推断视频中被掩盖的对象,以便提取更多信息。 

     

    而且该架构可以确保视频中的视觉元素与物理对象相对应,论文作者认为,这一步骤对于更高层次的推理至关重要。

     

    在实验部分,研究人员将他们的神经网络与视频表示和推理的CoLlision事件(也就是CLEVRER数据集)进行了基准比较。

     

    其中,CLEVRER数据集包含由机器生成的20,000多个5秒钟的物体碰撞视频(这几种物体是三种形状,拥有八种颜色的两种材料),以及300,000多个问题和答案。


    这些问答都聚焦于逻辑推理的四个要素:描述性(例如,“什么颜色” ),说明性(“造成的原因”),预测性(“接下来会发生什么”)和反事实(“如果某种情况出现,会发生什么”)。

    在这里小编附上CLEVRER资源链接:

     

    论文链接:https://arxiv.org/abs/1910.01442

    项目链接:http://clevrer.csail.mit.edu/

     

    实验结果表明,在没有预先训练,没有标记数据,且训练数据少40%的情况下,他们的神经网络和最佳神经符号模型性能相当,这无疑挑战了神经网络比神经符号模型更需要数据这一观点。


    此外,它在最困难的反事实问题上的得分为59.8%(这一得分比机会模型和所有其他模型都好)。

     

    同时,此模型还可以可以推广到其他任务,包括CATER(旨在预测目标对象在视频最后一帧中的位置的对象跟踪视频数据集)。


    研究人员在论文中写道:“我们的研究结果证明了在得益于分布式表示的灵活性和表现力的同时,深层网络可以复制人类认知和推理的许多特性。” 

     

    “神经模型在数学上也取得了一些成功,从直觉上讲,该领域需要执行严格的规则,需要操纵各种各样的复杂符号。但是,令人惊讶的是,大型神经语言模型其实并不需要需进行目标任务的明确训练,也可获得算术推理和类推的能力。

     

    这表明,在扩展到更多数据,并使用更大,更高效的体系结构时,当前的神经网络局限性得到了改善。”

    未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网(城市)云脑研究计划,构建互联网(城市)云脑技术和企业图谱,为提升企业,行业与城市的智能水平服务。

      如果您对实验室的研究感兴趣,欢迎加入未来智能实验室线上平台。扫描以下二维码或点击本文左下角“阅读原文”

    展开全文
  • 什么是案例管理模型符号(CMMN)

    千次阅读 2019-06-25 14:04:43
    CMMN是一种图形符号,用于捕获基于处理需要各种活动的案例的工作方法,这些活动可能以不可预测的顺序执行以响应不断变化的情况。使用以事件为中心的方法和案例文件的概念,CMMN扩展了可以用BPMN建模的界限,包括...

    组织一直在努力改进工作方式,以提高效率并减少错误。这需要分析和不断改进其工作方法,其中可能包括在可预测情况下的非常结构化的工作流程,以及响应动态情况的协议,在这种情况下无法规定固定的流程

    CMMN是一种图形符号,用于捕获基于处理需要各种活动的案例的工作方法,这些活动可能以不可预测的顺序执行以响应不断变化的情况。使用以事件为中心的方法和案例文件的概念,CMMN扩展了可以用BPMN建模的界限,包括结构化工作量减少和知识工作者推动的工作量。使用BPMN和CMMN的组合允许用户覆盖更广泛的工作方法。

    以下是我们在BPMN之外需要CMMN的一些原因:

    • 传统上,商业信息系统的研究和实践侧重于结构良好的业务流程。但是,许多业务流程很难建模。
    • 对于事故管理,咨询或销售等知识密集型任务尤其如此。实际上,许多活动是以临时方式开始和进行的,而不是事先计划好的。
    • 对于知识密集型或基于项目的活动尤其如此,这些活动通常代表组织的核心能力。

    特设流程

    临时流程是一组业务活动和相应的工件(例如,信息,决策和产品),只能在高级别的聚合中进行标准化。实际的活动种类及其排序因个案而异。

    以下是Ad-hoc流程的特征:

    • 虽然可以预测某些活动,但是一开始就无法完全指定大部分过程,因为它需要的信息只能以某种方式进入项目。
    • 如果我们假设在ad-hoc流程的上下文中永远不会确定下一步,则它们的执行不能由传统的基于流程的信息系统控制,在大多数情况下,知识工作者可以控制流程。
    • 似乎不可能在设计时考虑临时过程的所有可能性,这样的过程模型将变得复杂且难以管理

    BPMN与CMMN

    近几十年来,人们一直关注建模和自动化结构良好的日常流程。BPMN最适用于知识型员工主要执行任务的结构良好且高度可预测的工作,而CMMN涵盖知识工作者在运行时制定决策和计划的积极参与下可预测性较差的部分

    案例管理(CM)是van der Aalst于2005年作为知识工作者的工具引入的。2014年5月,OMG发布了案例管理标准,称为案例管理模型和符号(CMMN)。其重点是支持不可预测,知识密集和结构薄弱的流程。案例管理是一种业务流程技术,不使用控制流来描述流程。

    案例管理是通过向知识工作者提供有关案件的所有信息的访问权限并赋予他们对案件如何发展的自由裁量权和控制权来赋予他们权力。案件管理不是关于流程,而是关于工人。与经典流程相比,某个目标和提供可供选择的可能性比实现目标本身的方式更重要。

    这里列出了BPMN和CMMN之间的差异:

    大多数BPMN符号CMMN表示法
    势在必行陈述
    以流程为中心以数据为中心
    弧描述序列无预定序列
    引导工作(低头工人)使工人(知识工作者)
    一切都是模仿的并非一切都是建模的

    声明性表示法不会尝试模拟问题的流程; 他们建立了预期的结果,即指明他们想要发生什么,但不指明它应该如何发生。SQL是声明性编程的一个例子,因为它不会试图控制程序的流程; 它只是陈述了它想要出现的内容,而不是它是如何完成的。

    另一方面,命令式表示法试图模拟问题的流程; 例如,命令式编程语言,如Java或C ++,它们建立的命令将告诉编译器他们希望代码如何运行,但不能明确告诉他们想要发生什么。

    结构化流程与案例与Ad-Hoc流程

    结构化过程案件特别程序
    • 结构化的流程活动事先已知
    • 许多重复的元素
    • 在流程方面,人们没有自由度
    • 流程可以部分结构化
    • 活动部分已知
    • 一些重复的元素
    • 人们在流程方面有一定程度的自由
    • 无法构建流程 - 即时执行新任务
    • 活动部分已知
    • 几个重复的元素
    • 关于流程,人们的自由度非常高
    可以建模可以建模无法建模

    设计时间与运行时间

    CMMN中没有序列流模型。任务的执行取决于被称为哨兵的事件和条件。哨兵捕获在案件中发生的特定事件的发生或满足的条件。哨兵用作进入和退出标准。请注意,黑色和白色钻石代表标准。

    案例有两个不同的阶段,即设计时和运行时,如下所述:

    设计时间

    在设计阶段,业务分析师参与建模,其中包括定义始终属于案例模型中预定义段的一部分的任务(计划项),以及案例工作者可用的“自行决定”任务。任选地根据他/她的判断应用。

    运行

    在运行时阶段,Case工作人员通过按计划执行任务来执行计划,并可选择在运行时向案例计划实例添加任意任务。

    设计时间运行时间

    CMMN图表概览

    此示例说明了使用CMMN建模的纸张写入过程。假设论文写作是一项密集的知识工作,可以用不同的方式处理。让我们进一步研究这个例子如下:

    1. 流程有两个必须达到的里程碑:
      • 草稿已完成
      • 文件已完成
    2. 几个任务(例如创建TOC)由作者自行决定。
    3. 使用“ 写入文本”和“ 集成图形”任务准备草稿阶段是必需的。
    4. 这个阶段定义了重复规则,它由重复装饰符(即哈希)表示。
    5. 虽然研究主题是一项强制性任务,但任务组织引用将在运行时决定。它类似于创建图形生成数字列表
    6. 创建文档达到截止日期后,将完成流程。

    CMMN示例

    *摘自OMG案例管理模型和表示法规范

    注意

    • 使用“文件夹”形状描述案例计划模型
    • Case的名称可以包含在左上角的矩形中。
    • 案例计划模型的各种元素描述在案例计划模型形状的边界内。
    • 该图显示了案例计划模型的示例。

    CMMN的基本概念

    案例计划模型中捕获案例的完整行为模型。对于特定案例模型,案例计划模型包含表示案例初始计划的所有元素,以及通过案例工作者通过运行时计划支持计划进一步发展的所有元素。计划项目有四种类型:

    CMMN计划项目

    任务

    任务是一个工作单元。有三种类型的任务:

    任务(计划项目)图形符号

    人工任务 - 由案例工作人员执行的任务,他们可以是:

    • 阻止:任务正在等待,直到与任务相关联的工作完成
    • 非阻塞:在实例化时,任务不等待工作完成并立即完成
    人类任务
    非阻塞人工任务

    流程任务 - 可以在案例中用于调用业务流程

    流程任务

    案例任务 - 可用于调用另一个案例

    案例任务

    任务(任意任务)

    任务始终是Case模型中预定义段的一部分。除了任务之外,Case工作人员还可以使用Discretionary Tasks,可以根据他/她的判断任意应用。自由裁量任务由带有虚线和圆角的矩形形状描绘/请注意,任何任务类型都可以自行决定:

    酌情任务图形表示法(右侧的任意任务)

    自由裁量的人类任务

    自由裁量的人类任务

    酌情人类任务(非阻塞)

    酌情人类任务(非阻塞)

    酌情处理任务

    酌情处理任务

    酌情案件任务

    酌情案件任务

    事件听众

    事件是在案例过程中发生的事情。例如,阶段和任务的启用,激活和终止,或里程碑的实现。

    事件监听器符号

    一个定时器事件监听器用于捕获预定义的时间流逝。

    CMMN定时器事件监听器

    一个用户事件监听器是用来捕捉由用户引发的事件。通过这种方式,用户可以实现与案例进行的直接交互,而不是通过执行任务来影响案例文件中的信息。

    用户事件监听器

    里程碑

    里程碑表示可实现的目标,其定义为能够评估案例的进展。没有工作与里程碑直接相关,但完成一组任务或关键可交付成果的可用性(案例文件中的信息)通常会导致实现里程碑。里程碑可以具有零个或多个进入标准,其定义达到里程碑时的条件。

    CMMN里程碑

    例如,我们在兼容流程中有一个服务水平协议(SLA),可以使用计时器事件监听器和里程碑建模,如下所示。

    里程碑

    阶段和自由裁量阶段

    • 阶段可以被认为是案例中的“阶段”,并且通常将许多任务分组。
    • 它是一个元素的容器,从中构建了案例的计划并且可以进一步发展。
    • 阶段可能被视为案例的“剧集”。它们可以被视为子案例(类似于BPMN中的子流程),它们也可以并行运行。
    • 舞台由具有角形角的矩形形状和在其底部中心的小盒子中的“ - ”符号形式的标记描绘(“ - ”表示扩展阶段)。
    • 自行决定阶段可以由用户自行决定“任选”,“临时”添加到计划中。

    下图显示了一个展开的舞台,其中包含一个子舞台和三个任务。

    具有子阶段和子任务的阶段

    标准

    标准允许我们描述任务,阶段或里程碑何时应该可用于执行(进入标准),或何时案例(案例计划),阶段或任务应该异常终止(退出标准)。Criteria有以下两个可选部分:

    • 一个或多个触发事件(称为onParts)。这些事件将满足入门标准或退出标准的评估

    我们可以考虑形成句子的标准如下,

    ([ on < Event 1 >[, on < Event 2 >[, . . .]] ]) AND ([ if < Boolean condition > ])

    注意:

    • 方括号([])表示句子的可选部分,而有角度的括号(<>)是要替换的占位符。
    • onPart和ifPart在句子中都是可选的,但是要理解它至少必须存在其中一个。

    入学标准

    条目标准描述了可供执行的阶段,任务或里程碑必须满足的条件。没有条目标准的阶段,任务或里程碑将在创建后立即执行。输入条件可以放在舞台,任务或里程碑边界的任何位置。

    在下面的示例中,产品投诉和服务投诉这两个阶段都需要一个入门标准,因为它们只能在投诉类型的情况下执行。在大多数情况下,两个阶段中只有一个会执行,但在某些情况下,投诉可能涉及两个阶段。

    CMMN准入标准

    退出标准

    退出标准类似于条目标准,但它用于在满足时停止处理阶段,任务或案例(案例计划)。在投诉过程中,我们将为案例添加退出标准。在这种情况下,客户致电并取消投诉,因此我们需要停止处理案件。我们通过提供取消案例文件项来模拟这种情况,该项目可以是客户电话的录音或来自客户的信件。

    CMMN退出标准

    案例档案

    在CMMN中,每个案例实例包含一个案例文件(也称为案例文件夹,或只是案例),案例工作者可以访问该案例文件中的所有数据。只要具有足够的权限,案例工作者就可以添加,删除和修改案例文件中的数据,即使他们没有在案例中执行任何任务。案例文件中的数据称为案例文件项。

    所有数据和数据结构都称为案例文件项。所有案例文件项都存储在案例文件中。案例文件项用于表示各种数据,包括数据库中的数据值,数据库中的行,文档,电子表格,图片,视频,录音等。除基本数据外,案例文件项也可以表示容器,包括目录,文件夹,集合,堆栈,列表等。

    CMMN案例文件项

    规划表

    阶段或人工任务可以具有计划表,指示是否可视化( - )或(+)可自由选择的项目。当用户“扩展”计划表时,其包含的可自由支配的项目在阶段内或人工任务外部可见。对于与人工任务关联的自由选项,计划仅在任务的活动状态下可用。

    CMMN计划表

    相关链接

     

    1. 最好的CMMN建模工具
    2. 免费试用Visual Paradigm

    Visual Paradigm Online

     

    展开全文
  • 符号回归: ,我们的新型开源Eureqa替代产品 对于模拟: (简单的N体模拟) (暗物质数据;可选) tqdm matplotlib 训练 要从本文中训练一个示例模型,请尝试。 完整的模型定义在models.py中给出。数据是从...
  • 功夫辛勤工作-3D模型符号创建经验北京书会李小青在城市规划局的综合管道管理信息系统的预售项目中,需要对城市特定区域的地面建筑物进行3D建模,但是在施工过程中发现ArcScene提供的房屋模型符号全都是外国风格的...

    1-466-png_6_0_0_135_230_612_413_892.979_1262.879-690-0-0-690.jpg

    功夫辛勤工作

    -3D模型符号创建经验

    北京书会李小青

    1-361-png_6_0_0_0_0_0_0_893.25_1263.375-893-0-0-893.jpg

    在城市规划局的综合管道管理信息系统的预售项目中,需要对城市特定区域的地面建筑物进行3D建模,但是在施工过程中发现ArcScene提供的房屋模型符号全都是外国风格的模型,而且很少有适合中国建筑形状的模型. 于是开始了“寻找”中国房屋建筑模型的过程.

    首先,我在互联网上进行了搜索. 我希望可以在Internet上找到一个中国风格的ArcScene模型符号库. 它始终是使用他人事物的最简单,最无故障的方法,但最终以失败告终. 然后找到一些建筑模型,但是不幸的是,“ 3D”模型并不是那么容易找到. 通常,可以找到一些三维模型平面图片. 很难找到几个三维“ 3D”模型,但是它们太复杂了,模型也太复杂了. 没有材料,您需要自己粘贴. 此外,如果使用这些复杂模型,则它们必须与其他ArcScene中的原始模型符号不一致. 该做什么,最后决定自己制作模型arcscene中的三维符号,然后粘贴建筑物的实际照片. 没有中国式建筑的3D模型吗?首先,我在网上搜索并找到了解决方法,但没有找到,还是自己去浏览.

    我以前从未使用过3Dmax,在查看许多工具栏时我一头雾水. 我该怎么办?找个高手!最终,在长期从事3D设计的人士的指导下,我学会了建造实体,并在很短的时间内分解了实体供应商,并很快建造了一座小房子. 但是问题还来了,如何将构建的模型放入ArcScene符号库并使用这些模型符号来构建地面房屋?经过仔细考虑并与ESRI工作人员进行磋商,终于清楚了. 开始,建模,映射,将模型导出到Arcscene符号库,不,我发现导入Arcscene的房屋贴面材料丢失了,所以请3D人士咨询. 3D人员认为,如果要在其他软件中使用3DMax文件,则必须将它们导出为* 3ds文件,这等效于我们的GIS软件中的点,线和面文件,但不包括渲染和材质. 模型. 渲染和材质必须是* max文件,与我们的GIS软件的* mxd项目文件等效,但是在ArcScene中只能识别* 3ds文件. 我该怎么办?

    2da17bc4d481e845126a3a9757e4a10c.png

    这时,项目团队几乎没有时间给我. 我不可能只采用ArcScene随附的西式建筑. 这将完成任务. 但是我始终不相信中国没有软件可以做到这一点. 再次请ESRI的工作人员解释我遇到的问题. 人们认为导出* 3ds文件时粘贴的文件和模型文件不在同一路径中. 的. 3D人员是否可信?非3D顾问是否可信?相信3D人士的话意味着该方法不可行,您必须放弃;相信ESRI顾问的话绝对可以做到. 试试看. 在3Dmax下制作了新房子模型. 贴面文件和房屋模型在同一路径下导出,并且在ArcScene中未尝试过. 我看不到单板,a,似乎已经放弃了.

    当我晚上回到家时,尽管我手头有其他东西,但我仍会考虑建模. 为什么不可能呢?真的没有软件可以做到吗?我是早上来上班的,我没有穿外套arcscene中的三维符号,而是开始尝试. 尽管如此,它还是没有用. 我在互联网上搜索了有关3D的文章. 在一篇文章中,我提到如果文件名为中文,则Maya文件将丢失. 我的模特是一样的吗?因此,更改文件名哇终于成功了. 典型的中国房子真的是很勤奋的人.

    以下是在ArcScene中创建自己的3D模型符号的步骤,供您的同事参考.

    file0001.jpeg

    (1)在3Dmax或Maya和其他3D软件中创建模型,并将其导出为* 3DS文件. 请记住,导出时文件名必须为英文,导出文件时应使用导出的文件存储路径和覆盖. 文件和模型文件位于相同的路径中;

    (2)打开符号管理器ArcScene->工具->样式->样式管理器,将弹出以下对话框:

    (3)单​​击对话框右侧的“样式”按钮,然后选择“创建新”项以创建您自己的符号库并将其保存在特定路径中. 创建的符号库将显示在图1对话框左侧的列表中.

    cea71cbf765d054ae8de3846d4a3a933.png

    (4)在图1对话框左侧的列表上单击刚刚创建的符号库的名称,并将其展开以包含多个文件夹. 单击“标记符号”文件夹,对话框的右侧将为空白.

    (5)右键单击图1对话框右侧的空白以显示“新”功能. 单击它会弹出下面的图2对话框:

    (6)单击对话框“属性”列中的“类型”下拉菜单,然后选择“ 3D标记符号”项. 将弹出一个对话框. 此时,打开您创建的* 3ds模型,然后单击“确定”,创建完成. 如果有多个模型,则将它们一个接一个地添加以完成自己的符号库.

    实际上,当您创建自己的模型时,表面图像可以是照片. 为简单起见,您还可以在ArcScene中放大模型符号,切割每个表面,然后将其粘贴到模型上. 使用此方法,您可以轻松创建各种满足您需求的模型符号.

    本文来自电脑杂谈,转载请注明本文网址:

    http://www.pc-fly.com/a/tongxinshuyu/article-152578-1.html

    展开全文
  • matlab特殊符号代码 Julia 中的无细胞模型生成器 (CFMG) 安装和要求 CFMG.jl被组织成一个包,可以在 Julia 的package mode安装。 开始并使用]键进入package mode (要返回,请按backspace或^C键)。 然后,在提示符...
  • Emoticon Smoothed Language Models for Twitter Sentiment Analysis 微博情感分析的表情符号平滑语言模型(A11, AAAI2012)通常,对于完全监督模型,由于耗人力和耗时间只能得到有限的训练数据,对于带噪声标签的...
  • 简单的符号表达式能够有效地建模世界。符号模型紧凑,具备可解释性和良好的泛化能力,但很难处理高维机器学习问题;深度模型擅长在高维空间中学习,但泛化性和可...符号模型是自然科学的语言。与深度模型不同,符号.
  • matlab特殊符号代码介绍 Kwatee 基于生理学的药代动力学 (PBPK) 插件生成增强的 PBPK 模型。 要求 Julia :PBPK 模型方程是用编程语言生成的。 Sundials package :Kwatee PBPK 插件生成模型方程,使用 . 未来,PBPK...
  • 什么是模型,什么是模式

    万次阅读 多人点赞 2016-01-16 11:05:30
    模型(model)与模式(Pattern),英文显然是两个词,但是,在实际使用过程中,却是比较混乱。 虽然,我还不清楚厘清这两个词的关系,对基层的数学工作者有怎样的价值,但是至少对理解什么是数学是有益处的,能够...
  • matlab特殊符号代码Julia 中的动态化学计量模型生成器 (JuDSM-Generator) 介绍 JuDSM-Generator 是用编程语言编写的动态化学计量模型 (DSM) 的代码生成系统。 JuDSM-Generator 将一个简单的逗号/空格分隔的平面文件...
  • matlab特殊符号代码Julia 中的动力学无细胞模型生成器(JuKCF-Generator) 介绍 JuKCF-Generator 是一种用编程语言编写的无细胞代谢模型(CFMM)代码生成系统。 JuKCF-Generator 将一个简单的逗号/空格分隔的平面...
  • 模型是产品数字化的描述,定义了产品的功能,物模型将不同品牌不同品类的产品功能抽象归纳,形成“标准物模型”,便于各方用统一的语言描述、控制、理解产品功能。 物模型由若干条“参数”组成,参数按描述的功能...
  • 什么是敏捷模型

    千次阅读 2012-01-11 12:17:00
    模型是一个抽象,它描述问题的一个或多个方面,或者一个可能的解决问题的方法。模型在传统上被认为是几张图加上对应的文档,其实CRC卡、一个或多个业务规则的文字描述、业务过程的结构化英语描述等非图形制品也是...
  • SENSE希望将NCS内部工厂的现有有限抽象(也称为符号模型)作为输入。 它还期望有关NCS中的延迟范围和规范的信息将在NCS的工厂上实施。 它使用植物的抽象来构造NCS的抽象。 可以使用SENSE附带的工具轻松构建植物的...
  • OSI七层模型详解

    万次阅读 多人点赞 2011-12-28 19:43:16
    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。 完成中继功能的节点通常称为中继系统。在OSI七层模型中,处于不同层的...
  • 编译时报出以下错误: error LNK2001: 无法解析的外部符号 "class tensorflow::GraphDefDefaultTypeInternal tensorflow::_GraphDef_default_instance_" (?_GraphDef_default_instance_@tens...
  • 相关问题在markdown中,设置二级标题所用的符号是markdown 中 标题 符号以下说法正确的是___________原始陶器上的绘画和神秘符号具有哪些特点?( ): 原始陶器 上 绘画 符号 特点 形象性 装饰性 抽象性 意象性在社会...
  • OSI 七层模型和TCP/IP模型及对应协议(详解)

    万次阅读 多人点赞 2019-01-04 22:46:04
    OSI 七层模型通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯,因此其最主要的功能就是帮助不同类型的主机实现数据传输 。 完成中继功能的节点通常称为中继系统。在OSI七层模型中,处于不同层的...
  • CSS盒子模型总结

    万次阅读 多人点赞 2018-09-27 20:34:58
    在使用CSS进行网页布局时,我们一定离不开的一个东西————盒子模型。盒子模型,顾名思义,盒子就是用来装东西的,它装的东西就是HTML元素的内容。或者说,每一个可见的 HTML 元素都是一个盒子,下面所说的盒子都...
  • 高斯混合模型(GMM)及其EM算法的理解

    万次阅读 多人点赞 2017-03-02 18:43:36
    一个例子高斯混合模型(Gaussian Mixed Model)指的是多个高斯分布函数的线性组合,理论上GMM可以拟合出任意类型的分布,通常用于解决同一集合下的数据包含多个不同的分布的情况(或者是同一类分布但参数不一样,...
  • C4模型

    千次阅读 2019-02-14 10:53:00
    用于软件架构的 C4 模型关键要点 关键要点 由于向敏捷转型,软件架构图的使用规模已经大幅缩减。即使有在使用软件架构图,它们往往也混淆不清。 C4 模型由一系列分层的软件架构图组成,这些架构图用于描述上...
  • 斯塔克尔伯格竞争模型(主从博弈模型

    万次阅读 多人点赞 2018-05-25 16:10:24
    斯塔克尔伯格竞争模型(主从博弈模型) 基本概念 古诺模型实际上是假定两个寡头厂商同时作出各自的产量决策的。 现在假设厂商1先决定它的...斯塔克尔伯格竞争模型是一个价格领导模型,厂商之间存在着行动次序...
  • JVM内存模型

    万次阅读 2020-07-06 15:54:20
    JVM内存模型 JVM的内存模型也就是JVM中的内存布局,不要与java的内存模型(与多线程相关)混淆。 下图是jdk8 jvm内存模型图: 程序计数器 程序计数器是当前线程所执行的字节码的行号指示器。 JVM支持多个线程同时...
  • 线性模型分析

    千次阅读 2018-01-31 16:07:59
        线性模型是线性统计模型的一种简称,是数理统计学中研究变量之间关系的一种模型,在线性模型中,未知参数以线性形式出现。本文主要分析和介绍机器学习中两种经典的线性模型:线性回归模型的逻辑回归模型,并...
  • 全面理解Java内存模型(JMM)及volatile关键字

    万次阅读 多人点赞 2017-06-12 11:25:05
    本篇的写作思路是先阐明Java内存区域划分、硬件内存架构、Java多线程的实现原理与Java内存模型的具体关系,在弄明白它们间的关系后,进一步分析Java内存模型作用以及一些必要的实现手段,以下是本篇主要内容(如有...
  • 随机模型

    千次阅读 2018-09-23 21:49:35
    而随机模型主要分为以下三类 概率模型 马氏链模型 回归模型(单独总结) 概率模型 主要用到概率的运算,概率分布期望方差等基本知识。以轧刀中的浪费为例。 轧钢中的浪费 问题为:已知成品材的规定长度为 lll 以及粗...
  • 离散选择模型

    千次阅读 2019-12-12 16:22:42
    离散选择模型random utility modelrepresentative agent modelsemi-parametric choice model其他模型模型之间得关系 random utility model representative agent model semi-parametric choice model 其他模型 各...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 120,713
精华内容 48,285
关键字:

以下是符号模型的是