「Deep Learning」理解Pytorch中的「torch.nn」

来源:互联网 发布:mac快捷键的图形符号 编辑:程序博客网 时间:2024/06/14 05:36
Sina Weibo:小锋子Shawn
Tencent E-mail:403568338@qq.com
http://blog.csdn.net/dgyuanshaofeng/article/details/78768107

   Module,所有神经网络模块的基础类。
   Sequential,序贯容器,类似Keras里面的序贯模型,另外这些是比较传统的卷积网络了。
   Conv2d,卷积层。
   ConvTranspose2d,转置卷积层。
   ReflectionPad2d,属于Padding Layers,镜像填充。Padding的方式可以是统一方式,也就是指定一个数值,也可以是不规则方式,也就是给出一个4元组。Shape的计算公式可以查看文档。如下:Ho = Hi + paddingTop + paddingBottom, Wo = Wi + paddingLeft + paddingRight。
#is intm = nn.ReflectionPad2d(3)# ReflectionPad2d(3, 3, 3, 3)input = autograd.Variable(torch.randn(16, 3, 320, 480)) # size 16 3 320 480output = m(input) # size 16 3 326 486#is 4-tuplem = nn.ReflectionPad2d((3, 3, 6, 6)) # Left, Right, Top, Bottomoutput = m(input) # size 16 3 332 486
   ReplicationPad2d,同上,复制填充。
   ReplicationPad3d,类似上面。
   ZeroPad2d,同上,常数为零。
   ConstantPad2d,同上,常数自己指定。
   Non-linear Activations,非线性激活函数
   LeakyReLU,泄漏ReLU。
    Tanh,双曲正切函数。输出值范围在[-1, 1]。
    BatchNorm2d,根据公式进行空间批归一化(Spatial BatchNorm),也即(input-mean[input]) / (sqrt(var[input]+eps))*gamma+beta。这里的input一般为4d张量的每一通道,也就是每一通道有自己的mean、var、gamma和beta。
    InstanceNorm2d,根据公式进行归一化,也即(input-mean[input]) / (sqrt(var[input])+ eps)*gamma+beta,这个公式跟BatchNorm2d有点差别,开方计算仅对方差进行。不明白batchnorm和instancenorm的差别,需要看看论文。
   Linear,我怀疑是全连接层。由例子可见,m=nn.Linear(20,30)为创建一个30*20的矩阵weight,另外bias为30。输入x为(128, 20),输出y(128, 30)。
   Loss functions,损失函数
    L1Loss,计算输入x和目标y的差异(差)的平均绝对值,也就是两个矩阵点对点作差并取绝对值,求和然后除以元素的总数。如果参数size_average=False,那么不进行“除以元素的总数”。两个矩阵可推广到4维张量等,这是元素的总数就是算上多batchsize多channel了。另外,在0.3.0版本中,可以设置reduce=False来避免多batchsize计算,也就是可以计算每一批量中的L1Loss,不进行average。
   MSELoss,也就是L2Loss。
   BSELoss,二项交叉熵。
   init,负责权重和偏置的初始化。
    xavier_normal,为Glorot initialisation,在论文[1]中提出。权重的值从N(0, std)中采样获取,其中std=gain*sqrt(2/(fan_in+fan_out)),gain为放缩因子(默认为1),fan_in和fan_out分别为权重张量中的输入神经元个数和输出神经元个数。
    xavier_uniform,同上。权重的值从U(-a, a)中采样获取,其中a=gain*sqrt(2/(fan_in+fan_out))*sqrt(3),gain为放缩因子(默认为1),fan_in和fan_out同上。可以使用normal和uniform的方法验证,也就是利用xavier_uniform和uniform分别初始化一个矩阵,其中uniform的参数由自己手动计算,经过初始化后的两个矩阵作差再求期望,如果足够小,那么就理解了,但是fan_in和fan_out要求和,所以我们并不清楚,哪个是输入和输出。
    kaiming_uniform,为He initilisation,在论文[2]中被提出。权重的值从U(-bound, bound)中采样获取,其中bound=sqrt(2/((1+a^2)*fan_in))*sqrt(3),a为这种之后被使用的rectifier的负斜率,针对ReLU默认为0,mode可选“fan_in”或“fan_out”。选择fan_in,将在正向传播中保持权重的方差大小,而fan_out,将在反向传播中保持大小。
    kaiming_normal,同上。权重的值从N(0, std)中采样获取,其中std=sqrt(2/((1+a^2)*fan_in)),其他同上。
    orthogonal,API中并没有详细介绍,在论文中[3]中被提出。从名字上,权重的值被(半)正交矩阵填充。
    DataParallel layers (multi-GPU, distributed),数据并行层,支持分布式多GPU

参考文献
    [1]  Understanding the difficulty of training deep feedforward neural networks, Glorot X., Bengio Y.
    [2]  Delving deep into rectifier: Surpassing human-level performance on ImageNet classification. He K. et la..
原创粉丝点击