Day2 自学Pytorch—-神经网络

继续跟着文档学习(Pytorch神经网络官方文档)

1.Conv2d() 关于通道数:
有一篇博客讲的特别清楚,附上链接【CNN】理解卷积神经网络中的通道 channel

这里再附上我自己的理解

Day2 自学Pytorch----神经网络
图1 神经网络结构图

        self.conv1 = nn.Conv2d(1, 6, 5)

如以上代码,输入图像的通道数由输入图像的格式所确定,由于输入的图像是灰度图像,所以通道数为1;
而输出的通道数则是由卷积核的数量所决定,由神经网络的结构图可以看出。第一层卷积核的数量为6,所以输出的通道数为6


 self.conv2 = nn.Conv2d(6, 16, 5)

继续看代码,第一层的输出通道数即为第二层的输入通道数,所以输入的通道数为6;
第二层的卷积核为16个,所以输出的通道数为16

2.Linear()函数

self.fc1 = nn.Linear(16 * 5 * 5, 120)

Linear()函数的参数说明:

Day2 自学Pytorch----神经网络

in_features:输入图像的大小;在图一的结构中,输入的是16个5×5的矩阵,所以参数设置为16×5×5(通道数 _宽_高)

out_features:输出的张量大小;它也代表了该全连接层的神经元个数。

Day2 自学Pytorch----神经网络

3.池化层(降维操作):

(1)池化层的常见操作包含以下几种:最大值池化,均值池化,随机池化,中值池化,组合池化等。
池化层在forward()函数里面定义,torch.nn.functional提供了:

平均池化avg_pool1d(input, kernel_size, stride=None)、avg_pool12d()、avg_pool13d()
最大值池化max_pool1d()、max_pool2d()、max_pool3d()
还有其他函数不一一列举,贴上一个官方文档链接,torch.nn.functional中的池化函数

(2)代码理解:

x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))

此处采用的是最大值池化,贴上图示便于理解:

Day2 自学Pytorch----神经网络
该池化层的输入是卷积层1经过激活函数以后的结果,池化层的窗口大小为2*2

4 .view函数
这个是把一个矩阵重新排列成不同维度但不改变元素的函数,如代码中x.view(-1,self.num_flat_features(x)),这里-1就是把后面的矩阵展成一维数组,以便后面线性变换层操作
eg:

x = torch.zeros((2, 2))
print(x)
x = x.view(-1)
print(x)

输出:

Day2 自学Pytorch----神经网络

5.num_flat_features

num_flat_features函数是把经过两次池化后的16x5x5的矩阵组降维成二维,便于view函数处理,而其中用乘法也是为了不丢失每一层相关的特性

def num_flat_features(self, x):
    size = x.size()[1:]
    num_features = 1
    for s in size:
        num_features *= s
    return num_features

附上完整代码:

import torch
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()

        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)

        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):

        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))

        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        x = x.view(-1, self.num_flat_features(x))
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    def num_flat_features(self, x):
        size = x.size()[1:]
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

net = Net()
print(net)

Original: https://blog.csdn.net/weixin_43987546/article/details/123750703
Author: 天下第一菜-
Title: Day2 自学Pytorch—-神经网络

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/692314/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球