https://mp.weixin.qq.com/s/Y5hxFXEa27hlAR3PS0E2ng

系列:https://blog.csdn.net/m0_51004308/category_10746158.html
Pytorch学习笔记(一):torch.cat()模块的详解
Pytorch学习笔记(二):nn.Conv2d()函数详解
Pytorch学习笔记(三):nn.BatchNorm2d()函数详解
Pytorch学习笔记(四):nn.MaxPool2d()函数详解
Pytorch学习笔记(五):nn.AdaptiveAvgPool2d()函数详解
Pytorch学习笔记(六):view()和nn.Linear()函数详解
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
————————————————
版权声明:本文为CSDN博主「ZZY_dl」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_51004308/article/details/118000391

nn.Module类和forward前向传播函数

总结:当执行model(x)的时候,底层自动调用forward方法计算结果

https://www.cnblogs.com/luckyplj/p/13378293.html

我们在定义自已的网络的时候,需要继承nn.Module类,并重新实现构造函数init和forward这两个方法。但有一些注意技巧:(1)一般把网络中具有可学习参数的层(如全连接层、卷积层等)放在构造函数init()中,当然我也可以吧不具有参数的层也放在里面;(2)一般把不具有可学习参数的层(如ReLU、dropout、BatchNormanation层)可放在构造函数中,也可不放在构造函数中,如果不放在构造函数init里面,则在forward方法里面可以使用nn.functional来代替

在pytorch在nn.Module中,实现了call方法,而在call方法中调用了forward函数:
mmexportd4b66fb7332da5349f986d2d6cb16b18_1629814751155.jpeg

init ()

forward()

常用

torch.manual_seed(SEED)随机种子

  1. SEED = 13
  2. torch.manual_seed(SEED)
  3. print(torch.rand(1)) # 每次运行结果一样

https://blog.csdn.net/qq_42951560/article/details/112174334

卷积

普通卷积顺序

for(卷积→池化→relu(激活函数))→view→全连接fc
Drop-out和BN层可以同时使用,常用的组合形式如下:
CONV/FC -> BN -> ReLu -> Dropout -> CONV/FC

  • bn层也是一个数据处理的方式,一般位于非线性激活层之前 ```python

    普通卷积顺序

    for(卷积→池化→relu(激活函数))→view→全连接fc

    def forward(self, x):

    1. # flatten data from (n,1,28,28) to (n, 784)
    2. batch_size = x.size(0) # 0代表样本数量
    3. x = F.relu(self.pooling(self.conv1(x)))
    4. x = F.relu(self.pooling(self.conv2(x)))
    5. x = x.view(batch_size, -1) # -1 此处自动算出的是320
    6. x = self.fc(x)
    7. return x

<a name="un4mO"></a>
## nn.Conv1d一维卷积
[https://blog.csdn.net/u011688191/article/details/100559813](https://blog.csdn.net/u011688191/article/details/100559813)

<a name="Jd9cq"></a>
### 定义
class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)<br />注意:一维卷积是在最后维度上扫的
<a name="C7JIm"></a>
### 参数说明

- **in_channels:特征数量在文本应用中,即为词向量的维度**
- **out_channels:卷积产生的通道数,有多少个out_channels,就需要多少个一维卷积(也就是卷积核的数量)**
- **kernel_size:卷积核的尺寸;卷积核的第二个维度由in_channels决定,所以实际上卷积核的大小为**kernel_size * in_channels
- padding:对输入的每一条边,补充0的层数

conv1(batch_size,channel@3(xyz三个特征), 样本@1000)
```python
x=(3, 3, 10000)# 3 特征数,10000个点作为一个样本
x = self.relu(self.bn1(self.conv1(x))) #  nn.Conv1d(3, 64, 1)→ torch.Size([3, 64, 10000])
# nn.Conv1d(in_channels, out_channels, kernel_size)
# 卷积核的大小为kernel_size * in_channels   1x3

举个例子:

输入:批大小为32,句子的最大长度为35,词向量维度为256
目标:句子分类,共2类

conv1 = nn.Conv1d(in_channels=256,out_channels=100,kernel_size=2)
input = torch.randn(32,35,256)
# batch_size x text_len x embedding_size -> batch_size x embedding_size x text_len
input = input.permute(0,2,1)
out = conv1(input)
print(out.size())

这里32为batch_size,35为句子最大长度,256为词向量

再输入一维卷积的时候,需要将3235256变换为3225635因为一维卷积是在最后维度上扫的,最后out的大小即为:32100(35-2+1)=3210034

假设window_size = [3, 4, 5, 6],基于上述代码,具体计算过程如下:
1.原始输入大小为(32, 35, 256),经过permute(0, 2, 1)操作后,输入的大小变为(32, 256, 35);
2.使用1个卷积核进行卷积,可得到1个大小为32 x 100 x 1的输出,共4个卷积核,故共有4个大小为32 x 100 x 1的输出;
3.将上一步得到的4个结果在dim = 1上进行拼接,输出大小为32 x 400 x 1;
4. view操作后,输出大小变为32 x 400;
5.全连接,最终输出大小为32 x 2,即分别预测为2类的概率大小。

[

](https://blog.csdn.net/sunny_xsc1994/article/details/82969867)

nn.Conv2d(输入channels,输出channels,卷积核kernels_size=3, padding=1, bias=False)

https://blog.csdn.net/u011688191/article/details/100559813

class DarkNet(nn.Module):
    def __init__(self, layers): # layers=[1, 2, 8, 8, 4]
        super(DarkNet, self).__init__()
        self.inplanes = 32   # 32通道卷积
        self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False)
        self.bn1 = nn.BatchNorm2d(self.inplanes)
        self.relu1 = nn.LeakyReLU(0.1)
        ...
      ...

self.fc1 = nn.Linear(1024, 512)

self.bn1 = nn.BatchNorm1d(64)

pooling特征图

只需要给定输出特征图的大小就好,其中通道数前后不发生变化。

https://blog.csdn.net/m0_51004308/article/details/118000391

作用:
自适应平均池化,指定输出(H,W)
函数语言格式:
nn.AdaptiveAvgPool2d(output_size)

  • output_size:指定输出固定尺寸
          self.avg_pool = nn.AdaptiveAvgPool2d(1) # 1是输出特征图大小
          self.max_pool = nn.AdaptiveMaxPool2d(1)
    
    ```python import torch import torch.nn as nn m = nn.AdaptiveAvgPool2d((5,1)) m1 = nn.AdaptiveAvgPool2d((None,5)) m2 = nn.AdaptiveAvgPool2d(1) input = torch.randn(2, 64, 8, 9) output = m(input) output1 = m1(input) output2 = m2(input) print(‘nn.AdaptiveAvgPool2d((5,1)):’,output.shape) print(‘nn.AdaptiveAvgPool2d((None,5)):’,output1.shape) print(‘nn.AdaptiveAvgPool2d(1):’,output2.shape)

```
image.png