zoukankan      html  css  js  c++  java
  • Torch7学习笔记(二)nn Package

    神经网络Package

    【目前还属于草稿版,等我整个学习玩以后会重新整理】

    模块Module

    module定义了训练神经网络需要的所有基础方法,并且是可以序列化的抽象类。

    module有两种状态变量:output和gradInput

    [output] forward(input)

    利用input对象计算其对应的output。通常input和output都是Tensor类型的。有时候会有例外例如table layers(Tensor的子类)。Forward之后,output变量应该被更新为新的值了。

     不建议重写这个函数,二是应该去实现updateOutput(input)函数。

    [gradInput] backward(input, gradOutput)

    在module内进行反向传播,默认前向传播已经做过了且这个input应该和前向传播的input是一样的。否则梯度计算会出错。

    同样的gradInput也是tensor类型,也有可能是table layers。

    反向传播过程包括计算两种类型的梯度。

    这个函数会调用下面两个函数

    updateGradInput(input,gradOutput)

    accGradParameters(input,gradOutput,scale).

    同样的,最好不要重载backward函数,重载上面的这两个函数会好一些。

    updateOutput(input)

    这个函数利用当前参数和input计算output,其结果就保存在output属性。

    updateGradInput(input,gradOutput)

    计算这个模块的input对应的梯度,这个应用应该是在NLP中,例如词向量,它是input但是它同时是parameter,因此需要更新。

    accGradParameters(input,gradOutput,scale)

    计算模块的参数的梯度咯,如果一个模块没有参数,那么就不需要做这一步。这些参数对应的状态变量的名字是与模块有关的。

    scale这个参数是在参数梯度集成之前要乘上去的一个因子。

    type(type [,tensorCache])

    可用于将所有参数转化为对应的type类型。

     tensors can be provided as inputs as well as modules

    模块中包含模型参数以及参数的梯度

    这一点非常好,免得我们自己去求导。

    weight和gradWeight是它的参数名字,它们是table类型

    parameters()函数

    如果自己写模块要重载这个函数。

    [flatParameters,,flatGradParameters] getParameters()

    这个函数返回两个tensor

    不能重载这个函数。

    training()

    这个函数把train属性设置为true。它的好处在于对于一些特殊的模块例如dropout,在training和evaluation过程是不一样的。

    evaluate()

    这个函数把train设置为false。

    findModules(typename)

    Containers

    这个类可以轻松建立复杂的神经网络。

    Container是基类,

    Sequential,Parallel,Concat都是继承它,DepthCOntact继承concat类。

    有两个方法

    add(module)

    get(index)

    listModules()

    把网络中所有的模块都列出来,其中包括container模块,self,以及其他的组件。

    Transfer function

    包括Tanh(),Sigmoid()

    HardTanh()

    这些非线性转换函数都是element-wise的

    HardShrink

    module = nn.HardShrink(lambda)

    相当于是一个阈值函数,绝对值大于lambda的书就是他本身,否则为0.

    SoftShrink

    和Hard差不多只不过这次平滑化一下。

    具体公式见Torch官方文档

    SoftMax

    这个不用解释了

    SoftMin

    哈哈 居然还有这个呢

    SoftPlus

    保证输出地全是正数;

    再有就是Sigmoid和RELU了。这个就不再一一赘述了。

    网络层类型

    1.简单的类型

    (需要参数的)

    Linear:做线性变换

    SparseLinear对sparse的输入数据进行线性变换

    Add 对输入数据加上一个偏置项

    Mul 对输入数据乘上一个因子

    CMul component-wise乘法??

    CDiv 除

    Euclidean 计算输入数据到k means中心店的欧氏距离

    weightedEuclidean 不用多说,加权的欧氏距离

    (不需要参数,自适应的)

    copy 对输入进行copy 可能会进行类型转变

    Narrow 在制定维度上进行narrow操作

    replicate 类似于MATLAB的repmat

    reshape

    view

    select

    Max

    Min

    Mean

    Sum

    这四个函数是在制定维度上做相应地操作

    Exp,Abs,Power,Square,Sqrt,这是element-wise

    Normalize 对输入进行进行L_p正则化。

    MM 矩阵矩阵相乘

    其他的模块

    BatchNormalization 对一块数据标准化

    Identity 恒等函数 在paralleltable中很有用

    dropout

    SpatialDropout

    Padding 在某一维度上补充

    L1Penalty 对输入加 sparsity

    Table Layers

    使用table构建更加复杂的网络结构

    table是container模块的子模块

    concatTable

  • 相关阅读:
    Node.js系列基础学习-----回调函数,异步
    Git版本控制工具学习
    大三下学期计划
    JavaScript基础插曲---apply,call和URL编码等方法
    JavaScript基础插曲-练习
    Jira内存调整
    IntelliJ IDEA 简单设置
    介绍一个国内强大的API接口文档写作网站showdoc
    使用IntelliJ IDEA 配置Maven(入门)
    Jira内存调整
  • 原文地址:https://www.cnblogs.com/crossing/p/4826668.html
Copyright © 2011-2022 走看看