CNN图像的尺寸和参数计算(深度学习)

分享一些公式计算张量的尺寸,以及CNN中参数的计算。
以Alexnet网络为例,以下是该网络的参数结构图。
在这里插入图片描述
AlexNet网络的层结构如下:
1.Input: 图像的尺寸是2272273.

2.Conv-1: 第1层卷积层的核大小11*11,96个核。步长(stride)为4,边缘填充(padding)为0。

3.MaxPool-1: 池化层-1对Conv-1进行池化,尺寸为3*3,步长为2.

4.Conv-2: 核尺寸:5*5,数量:256,步长:1,填充:2

5.MaxPool-2: 尺寸:3*3,步长:2

6.Conv-3: 核尺寸:3*3,数量:384,步长:1,填充:1

7: Conv-4: 结构同Conv-3.

  1. Conv-5: 核尺寸:3*3,数量:256,步长:1,填充:1

  2. MaxPool-3: 尺寸:3*3,步长:2

10.FC-1: 全连接层1共有4096个神经元。

11.FC-1: 全连接层2共有4096个神经元。

12.FC-3: 全连接层3共有1000个神经元。

接下来,我们对以上的网络结构进行描述:

1.如何计算张量(图像)的尺寸;

2.如何计算网络的总参数;

卷积层(Conv Layer)的输出张量的大小
定义如下:
O=输出图像的尺寸
I=输入图像的尺寸
K=卷积层的核尺寸
N=核数量
S=移动步长
P=填充数

输出图像尺寸的计算公式如下:
在这里插入图片描述
输出图像的通道数等于核数量N。
示例:AlexNet中输入图像的尺寸为2272273.第一个卷积层有96个尺寸为11113的核。步长为4,填充为0.


输出的图像为55x55x96(每个核对应1个通道)。

池化层(MaxPool Layer)的输出张量(图像)的大小
定义如下:
O=输出图像的尺寸。
I=输入图像的尺寸。
S=移动步长
PS=池化层尺寸
输出图像尺寸的计算公式如下:
在这里插入图片描述
不同于卷积层,池化层的输出通道数不改变。

示例:每1层卷积层后的池化层的池化层尺寸为33,步长为2。根据前面卷积层的输出为5555*96。池化层的输出图像尺寸如下:
在这里插入图片描述
输出尺寸为27x27x96.

全连接层(Fully Connected Layer)的输出张量(图像)的大小

全连接层输出向量长度等于神经元的数量。

通过AlexNet改变张量(图像)的尺寸的结构如下:

在AlexNet网络中,输出的图像尺寸为2272273.

Conv-1,尺寸变为555596,池化层后变为272796。

Conv-2,尺寸变为2727256,池化层后变为1313256.

Conv-3,尺寸变为1313384,经过Conv-4和Conv-5变回1313256.

最后,MaxPool-3尺寸缩小至66256.

图像通过FC-1转换为向量40961.通过FC-2尺寸未改变.最终,通过FC-3输出10001的尺寸张量.

接下来,计算每层的参数数量.

Conv Layer参数数量

在CNN中,每层有两种类型的参数:weights核biases。总参数数量为所有weights核biases的总和。
定义如下:
WC=卷积层的weights数量

BC=卷积层的biases数量

PC=所有参数的数量

K=核尺寸

N=核数量

C =输入图像通道数
卷积层中,核的深度等于输入图像的通道数.于是每个核有K*K个参数.并且有N个核.由此得出以下的公式.

在这里插入图片描述
示例:AlexNet网络中,第1个卷积层,输入图像的通道数©是3,核尺寸(K)是11*11,核数量是96. 该层的参数计算如下:

在这里插入图片描述
计算出Conv-2, Conv-3, Conv-4, Conv-5 的参数分别为 614656 , 885120, 1327488 和884992.卷积层的总参数就达到3,747,200.

Fully Connected (FC) Layer参数数量
在CNN中有两种类型的全连接层.第1种是连接到最后1个卷积层,另外1种的FC层是连接到其他的FC层.两种情况我们分开讨论.

类型1:连接到Conv Layer

定义如下:

Wcf= weights的数量

Bcf= biases的数量
O= 前卷积层的输出图像的尺寸

N = 前卷积层的核数量

F = 全连接层的神经元数量

在这里插入图片描述
示例: AlexNet网络中第1个FC层连接至Conv Layer.该层的O为6,N为256,F为4096.
在这里插入图片描述
参数数目远大于所有Conv Layer的参数和.
类型2:连接到FC Layer

定义如下:

Wff= weights的数量

Bff= biases的数量

Pff= 总参数的数量

F= 当前FC层的神经元数量

F-1 = 前FC层的神经元数量

在这里插入图片描述
示例:AlexNet的最后1个全连接层, F-1=4096,F=1000 .

在这里插入图片描述

1*1卷积理解

1.增加网络的深度,添加非线性

其一:
其一:

这个就比较好理解了,1x1 的卷积核虽小,但也是卷积核,加 1 层卷积,网络深度自然会增加。

其实问题往下挖掘,应该是增加网络深度有什么好处?为什么非要用 1x1 来增加深度呢?其它的不可以吗?

其实,这涉及到感受野的问题,我们知道卷积核越大,它生成的 featuremap 上单个节点的感受野就越大,随着网络深度的增加,越靠后的 featuremap 上的节点感受野也越大。因此特征也越来越形象,也就是更能看清这个特征是个什么东西。层数越浅,就越不知道这个提取的特征到底是个什么东西。

在这里插入图片描述
解释:

好比以上这个图,当层数越浅时,我们只能看到low level parts 也就是一些细节的纹理,并不知道这个纹理是来自于车轮,车身,还是其他哪里。但是随着网络层数的加深,感受野增大,到了mid level parts时,就可以看到车的一部分零件了,比如看到了车轮,车窗,但是看不完。到了层数很深后,就是high level parts了,可以看到这个物品是个完整的车子,或者是其他一个什么东西。
其二:

但有的时候,我们想在不增加感受野的情况下,让网络加深,为的就是引入更多的非线性。而 1x1 卷积核,恰巧可以办到。

我们知道,卷积后生成图片的尺寸受卷积核的大小和卷积核个数影响,但如果卷积核是 1x1 ,个数也是 1,那么生成后的图像长宽不变,厚度为1。

但通常一个卷积层是包含激活和池化的。也就是多了激活函数,比如 Sigmoid 和 Relu。

所以,在输入不发生尺寸的变化下,加入卷积层的同时引入了更多的非线性,这将增强神经网络的表达能力。

2.升维或者降维

大家可以看下面这张图:

参考

https://www.cnblogs.com/touch-skyer/p/9150039.html

https://blog.csdn.net/yaochunchu/article/details/95527760

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 以下是使用PyTorch计算一维卷积神经网络的示例代码: ``` import torch import torch.nn as nn # 定义一个一维卷积神经网络 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv1d(1, 10, kernel_size=3) self.conv2 = nn.Conv1d(10, 20, kernel_size=3) self.fc1 = nn.Linear(20*8, 64) self.fc2 = nn.Linear(64, 10) def forward(self, x): x = nn.functional.relu(self.conv1(x)) x = nn.functional.max_pool1d(x, kernel_size=2) x = nn.functional.relu(self.conv2(x)) x = nn.functional.max_pool1d(x, kernel_size=2) x = x.view(-1, 20*8) x = nn.functional.relu(self.fc1(x)) x = self.fc2(x) return x # 示例数据,形状为(batch_size, channel, sequence_length) x = torch.randn(64, 1, 100) # 初始化模型 model = Net() # 计算输出 output = model(x) print(output.shape) # 输出形状为(batch_size, num_classes) ``` 在这个示例中,我们定义了一个名为 `Net` 的一维卷积神经网络,并使用随机数据作为输入进行计算。这个网络包含两个卷积层和两个全连接层,并使用ReLU激活函数和最大池化操作。最后输出一个形状为(batch_size, num_classes)的张量,其中 `num_classes` 是输出类别数。 ### 回答2: 在PyTorch中调用一维CNN进行输入数据的计算相对简单。首先,我们需要导入必要的库和模块: ```python import torch import torch.nn as nn ``` 接下来,我们可以创建一个自定义的一维CNN模型,并定义其中的网络结构。例如,我们可以定义一个包含卷积层、池化层和全连接层的一维CNN模型: ```python class OneDimensionalCNN(nn.Module): def __init__(self): super(OneDimensionalCNN, self).__init__() self.conv1 = nn.Conv1d(1, 16, kernel_size=3, stride=1, padding=1) self.pool = nn.MaxPool1d(kernel_size=2, stride=2) self.fc1 = nn.Linear(16 * 10, 10) def forward(self, x): x = self.pool(torch.relu(self.conv1(x))) x = x.view(-1, 16 * 10) x = self.fc1(x) return x ``` 在上述代码中,我们定义了一个包含一个输入通道、16个输出通道、卷积核大小为3的卷积层(Conv1d)和一个大小为2的最大池化层(MaxPool1d)。然后,我们将扁平化的输出数据通过一个全连接层(Linear)转换为最后的输出结果。 接下来,我们可以实例化这个自定义模型: ```python model = OneDimensionalCNN() ``` 然后,我们需要将输入数据转换为PyTorch的Tensor对象,并传入模型进行计算。假设我们有输入数据x,其形状为(batch_size, sequence_length, input_size),可通过以下方式计算输出结果: ```python input_data = torch.tensor(x, dtype=torch.float32) output = model(input_data) ``` 最后,输出的结果将是一个形状为(batch_size, num_classes)的Tensor对象,其中num_classes是模型最后一层的输出大小。我们可以通过对这个输出进行进一步的处理、分类或回归等任务。 以上是使用PyTorch调用一维CNN进行输入数据计算的简单示例。该过程可以根据具体的需求和数据进行灵活的调整和修改。 ### 回答3: 要使用PyTorch来调用一维卷积神经网络(CNN计算输入数据,我们需要按照以下步骤进行操作: 1. 导入所需的库: ``` python import torch import torch.nn as nn import torch.nn.functional as F ``` 2. 定义一个继承自`nn.Module`的类,表示我们的一维CNN模型: ``` python class OneDimCNN(nn.Module): def __init__(self): super(OneDimCNN, self).__init__() self.conv1 = nn.Conv1d(in_channels, out_channels, kernel_size) # 定义其他层... def forward(self, x): x = self.conv1(x) # 经过其他层... return x ``` 在这个类中,我们可以定义一个或多个一维卷积层(`nn.Conv1d`),并在`forward()`方法中按照网络的前向传播顺序将输入数据传递给这些层。 3. 创建该模型的实例: ``` python model = OneDimCNN() ``` 4. 准备输入数据: ``` python # 假设我们有一批大小为(batch_size, input_channels, input_length)的输入数据 input_data = torch.randn(batch_size, input_channels, input_length) ``` 5. 使用模型进行计算: ``` python output = model(input_data) ``` 这将使输入数据通过模型的前向传播函数,并返回输出结果。 需要注意的是,具体的`in_channels`、`out_channels`和`kernel_size`等参数需要根据你的任务和数据的特定要求来进行设置或调整。 这样,我们就可以使用PyTorch调用一维CNN对输入数据进行计算了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值