pytorch中神经网络层的分类

在pytorch的实际应用中会接触到非常多的网络层的搭建,本文专门用来整理pytorch框架中神经网络层的资料

线性网络层 Linear

线性网络接受输入数据,在forward运算中对输入数据的最后一个维度的数据做线型运算。在定义线性网络时需要定义输入数据的尺寸和输出数据的尺寸。这里需要明确的一点,在实际应用中这里定义的尺寸指的是输入数据中最后一个维度的尺寸。Linear网络层并没有限制输入数据的维度。例如,我们定义一个线性网络L = Linear(3, 4)可以接受[1,2,3]为输入数据,也可以接受[[1,2,3], [4,5,6]]或者[[[1,2,3]],[[4,5,6]]]

>>> a = torch.tensor([1,2,3], dtype = torch.float)
>>> l(a)
tensor([ 0.3342,  0.3121, -0.4418,  0.2728], grad_fn=<AddBackward0>)
>>> a = torch.tensor([[1,2,3]], dtype = torch.float)
>>> l(a)
tensor([[ 0.3342,  0.3121, -0.4418,  0.2728]], grad_fn=<AddmmBackward>)

平铺网络层 Flatten

平铺网络层能够压缩数据维度,调整数据的形态为后面的网络层或者优化参数做准备。需要注意的是Flatten可以指定平铺的维度的范围,而不是像torch.flatten或者numpy.flatten那样直接把所有的维度的数据都压缩到一个维度。

>> a = torch.tensor([[[1,2,3], [4,5,6], [7,8,9]]])
>>> m = torch.nn.Flatten(0, -1) //指定平铺0维到最后1维
>>> m(a)
tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> m = torch.nn.Flatten(0, 1) //指定平铺0,到1维
>>> m(a)
tensor([[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]])

2维卷积层 Conv2d

卷积层对处理和分析图像是十分有用的。使用卷积处理图片可以很大的提升图片处理的效率。

pytorch中的卷积层构建时关键的参数是输入Channels和输出Channels。黑白图片的输入Channels是1,彩色图片的输入Channels是3。要记住,Conv2d接受到的输入矩阵维度排序是(N, C, H, W),而通过opencv等图片处理库导入图片之后图片数据的维度排序是(H, W, C) 。 这里N是代表图片数的维度,C代表每个像素点的维度,H代表图片的高度,W代表图片宽度。

对(N, C, H, W)维度的输入经过卷积处理后得到的结果为(N, Cout, Hout, Wout),其中Cout的数据为构建卷积时输入的参数,然后Hout和Wout分别为:

Hout = (H + 2*padding[0] - dilation[0] * (kernel_size[0] - 1) - 1)/stride[0]

Wout = (W + 2*padding[1] - dilation[1] * (kernel_size[1] - 1) - 1)/stride[1]

我作了一个图专门来描述padding, dilation, stride, kernel_size等参数的定义

ReLU层

ReLU层最基本的可以给当前的数据做一个洗牌,把小与0的数据去除掉。

AvgPool2d层

所有的Pool层做的工作都是downsample的工作,把原先的数据在某些指定的轴上减少维度。AvgPool2d层就是减少图片数据的高和宽轴上的维度,并且对被减少的部分用它们的平均值来代替。

AvgPool2d的原型如下:

CLASStorch.nn.AvgPool2d(kernel_sizestride=Nonepadding=0ceil_mode=Falsecount_include_pad=Truedivisor_override=None)

经过AvgPool2d网络层的处理后,输入数据的形态和输出数据形态的关系如下:

假设输入数据为: (N, C, H_{in}, W_{in})(N,C,Hin​,Win​) 或者 (C, H_{in}, W_{in})(C,Hin​,Win​).

输出数据为: (N, C, H_{out}, W_{out})(N,C,Hout​,Wout​) 或 (C, H_{out}, W_{out})(C,Hout​,Wout​)。那么:

Hout = (Hin + 2 * padding[0] - kernel_size[0])/stride[0] + 1
Wout = (Win + 2 * padding[1] - kernel_size[1])/stride[1] + 1

需要注意的是,这里stride的默认值是与kernel_size的至相等,而不是像Conv2d层,stride的默认值为1。

AdaptiveAvgPool2d层

其作用的原理基本与上面的AvgPool2d相同,不同的是这里接受的参数是output数据的参数。AvgPool2d接受的kernel_size,然后根据kernel_size, padding, stride等参数来导出output数据。而AdaptiveAvgPool2d是指定output数据的H,W的大小,然后系统自动判断生成padding, kernel_size等。

发表评论

邮箱地址不会被公开。 必填项已用*标注