首页 > 其他分享 >卷积神经网络理解(4)

卷积神经网络理解(4)

时间:2024-01-31 17:34:32浏览次数:25  
标签:初始化 nn 卷积 self torch 神经网络 理解 参数

1、CNN中常见的名词

  • padding:padding(填充)参数的作用是决定在进行卷积或池化操作时,是否对输入的图像矩阵边缘补0
  • stride:滑动卷积核时的步长stride(例如每次滑动一个或两个)
  • kernal:卷积核,通常为3x3或者5x5
  • filter:卷积核的数量(神经元的数量)。这个地方怎么理解呢,一个3x3的卷积核有9个参数,这些参数是通过learning出来的,一个卷积核扫过一幅图后,会生成一幅新的图,因为卷积核的参数是不同的,因此生成的图片也是不同的。但是卷积核的作用是侦查patten的对吧,一个图片中不可能只有一个patten吧,比如说一幅图片有100个patten,鸟嘴、鸟爪、牛蹄、猪头等特征都是patten,当将一头猪的图片输入到网络中,猪头这个patten的权重就会非常大,相反鸟嘴、鸟爪、牛蹄的patten权重就很低。所以filter的个数也就代表了神经元的数目。
  • pooling:池化

2、整体流程理解

卷积(Conv2d) -> BN(batch normalization) -> 激励函数(ReLU) -> 池化(MaxPooling) ->
  全连接层(Linear) -> 输出

 1 # 定义网络结构
 2 class CNNnet(torch.nn.Module):
 3     def __init__(self):
 4         super(CNNnet,self).__init__()
 5         self.conv1 = torch.nn.Sequential(
 6             torch.nn.Conv2d(in_channels=1,
 7                             out_channels=16,
 8                             kernel_size=3,
 9                             stride=2,
10                             padding=1),
11             torch.nn.BatchNorm2d(16),
12             torch.nn.ReLU()
13         )
14         self.conv2 = torch.nn.Sequential(
15             torch.nn.Conv2d(16,32,3,2,1),
16             torch.nn.BatchNorm2d(32),
17             torch.nn.ReLU()
18         )
19         self.conv3 = torch.nn.Sequential(
20             torch.nn.Conv2d(32,64,3,2,1),
21             torch.nn.BatchNorm2d(64),
22             torch.nn.ReLU()
23         )
24         self.conv4 = torch.nn.Sequential(
25             torch.nn.Conv2d(64,64,2,2,0),
26             torch.nn.BatchNorm2d(64),
27             torch.nn.ReLU()
28         )
29         self.linear = torch.nn.Linear(2*2*64,100)
30         self.linear = torch.nn.Linear(100,10)
31     def forward(self, x):
32         x = self.conv1(x)
33         x = self.conv2(x)
34         x = self.conv3(x)
35         x = self.conv4(x)
36         x = self.linear(x.view(x.size(0),-1))
37         x = self.linear(x)
38         return x
39 model = CNNnet()
40 print(model)

首先图片经过卷积层。卷积层第一个参数是input channel ,如果是RGB图像,就是3维,如果是灰度图就是1维。

第二个参数是output channel,也就是filter,设置多少个卷积核,每个卷积核做运算后输出新的“图片”,后续的参数再是卷积核的大小、步长、填充等等。

重点要理解这个output channel
那么问题来了,怎么判断做完卷积后新图片的大小?假设输入的tensor size为C H W,若in_channels=C,out_channels=Cout,kernel_size=k,stride=s,padding=p,那么输出的tensor size是:

                                          Cout*((H + 2*p - k)/s+1) * ((W + 2*p - k)/s+1)

这种方法需要手动计算,有时候还可能计算错误,

这里再提供一种方法,执行完下述程序后,加上一句 print(x.size()) 将数据打印出来,

然后再填到torch.nn.Linear(input,100)里

1     def forward(self, x):
2         x = self.conv1(x)
3         x = self.conv2(x)
4         x = self.conv3(x)
5         x = self.conv4(x)
6         print(x.size())

3、关于Pytorch默认的参数初始化问题

用自己的话总结一下:Pytorch中默认会初始化参数,这个初始化在调用神经网络时已经给初始好了,不需要自己手动初始化。系统默认初始化参数时也是用random的相关函数,这也是为什么我们需要设置seed了,因为设置seed后,每次初始化的参数值是一模一样的。

此外,也可以手动初始化参数。自动初始化参数是可以满足大多数情况的,但是针对有些特定的RNN、CNN的网络,有更适合收敛的参数,因此可以默认,但也可以手动初始化参数。

random.seed() random模块的随机数种子
torch.manual_seed() 为CPU设置随机数种子
torch.cuda.manual_seed() 为GPU设置随机数种子

torch.cuda.manual_seed_all()

为所有的GPU设置随机数种子

4、transforms.ToTensor() 这个函数的用法?

ToTensor()shape(H, W, C)nump.ndarrayimg转为shape(C, H, W)tensor

其将每一个数值归一化到[0,1],其归一化方法比较简单,直接除以255即可。

总结一下:① 、起到了一个reshape的作用 ;②、起到归一化的作用。

其实不难理解为什么起到这两点作用,因为PIL的读取的图片格式本来就是(H, W, C),所以肯定要进行一步转换;

且transforms这个库就是针对图像的,而将图像像素的归一化是最基础的操作之一,所以totensor都替我们做好了。

 

标签:初始化,nn,卷积,self,torch,神经网络,理解,参数
From: https://www.cnblogs.com/Zhouce/p/17999750

相关文章

  • 神经网络优化篇:将 Batch Norm 拟合进神经网络(Fitting Batch Norm into a neural netwo
    将BatchNorm拟合进神经网络假设有一个这样的神经网络,之前说过,可以认为每个单元负责计算两件事。第一,它先计算z,然后应用其到激活函数中再计算a,所以可以认为,每个圆圈代表着两步的计算过程。同样的,对于下一层而言,那就是\(z_{1}^{[2]}\)和\(a_{1}^{[2]}\)等。所以如果没有应用Bat......
  • 偏置归纳:神经网络的偏置归纳由什么构成?网络结构?权重参数值?—— 由网络结构和权重参数
    本文记录一个机器学习的一个理论知识:神经网络的偏置归纳由什么构成?网络结构?权重参数值?答案:由网络结构和权重参数值共同决定。参考:https://www.jianshu.com/p/e4c18f6538d2这个问题问的好像很小白,但是这个知识点其实很多人都是搞不大懂的。其实机器学习算法可以分为有参......
  • 深入理解Java引用类型
    深入理解Java引用类型在Java中类型可分为两大类:值类型与引用类型。值类型就是基本数据类型(如int,double等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过class定义的类型)。所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用......
  • python中设置cudnn作用理解
     1、cudnn的简介cuDNN(CUDADeepNeuralNetworklibrary):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。2、torch.backends.cudnn的理解 cuDNN使用非确定性算法,并且可以使用to......
  • 关于C# await的一点新理解
    关于await又理解深一点了,以前有点懵,原来await 是对Task.Run的一个修饰,叶节点,后续技节点是对标有async的方法进行串烧修饰,所以根在Task.Run这个方法要所以要理解await必须要详细查看Task.RunTask.Run是调用后直接把Run的参数委托丢线程池的然后不等待直接返回的,所以返回是一个Task......
  • 用模糊神经网络控制器来实现一个控制系统
    问题的阐述:需要用模糊神经网络控制器来实现一个控制系统,使得输入变量e和ec的范围为[-2,2],并且达到目标误差emin=0.001。输入、输出矢量:输入矢量为e和ec,范围为[-2,2],即e,ec∈[-2,2]。输出矢量为控制器的输出,用来控制系统的行为。网络结构:模糊神经网络控制器由两个部分组成:模......
  • 《深入理解计算机系统(原书第3版)》PDF
    内容简介本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统级I/......
  • 《深入理解计算机系统(原书第3版)》PDF
    内容简介本书从程序员的视角详细阐述计算机系统的本质概念,并展示这些概念如何实实在在地影响应用程序的正确性、性能和实用性。全书共12章,主要内容包括信息的表示和处理、程序的机器级表示、处理器体系结构、优化程序性能、存储器层次结构、链接、异常控制流、虚拟存储器、系统......
  • 深入理解Java双列结合Map
    在Java编程中,集合框架提供了多种数据结构来存储和操作数据.其中,双列集合Map是一种非常有用且广泛使用的数据结构,本文我将深入探讨Java中的双列集合Map,介绍其特点、常用方法和使用场景.一、什么是双列集合Map?双列集合Map是一种用于存储键值对(Key-ValuePair)的数据结构.......
  • 卷积神经网络理解(3)
    1、定义LeNet是深度学习领域的一个经典卷积神经网络模型,由YannLeCun等人于1998年提出,被广泛应用于手写数字识别和其他图像识别任务。LeNet的网络结构相对简单,包含两个卷积层和三个全连接层,是卷积神经网络的基础。LeNet对于现代的图像识别任务来说可能过于简单,但其对于深度学习......