汇聚层

你能将平均汇聚层作为卷积层的特殊情况实现吗?


import torch

import torch.nn as nn

in_channel, out_channel = 1, 1

padding = 2

avg_pooling = nn.Conv2d(kernel_size=2, in_channels=in_channel, out_channels=out_channel, padding=0,stride=padding,bias=False)

nn.init.constant_(avg_pooling.weight, 1/4)

print(avg_pooling.weight)

X = torch.range(start=1, end=16).reshape((1,1,4, 4))

y = avg_pooling(X)

print(y)

'''

Parameter containing:

tensor([[[[0.2500, 0.2500],

          [0.2500, 0.2500]]]], requires_grad=True)

tensor([[[[ 3.5000,  5.5000],

          [11.5000, 13.5000]]]], grad_fn=<ConvolutionBackward0>)

'''

你能将最大汇聚层作为卷积层的特殊情况实现吗?

假设汇聚层的输入大小为 𝑐×ℎ×𝑤 ,则汇聚窗口的形状为 𝑝ℎ×𝑝𝑤 ,填充为 (𝑝ℎ,𝑝𝑤) ,步幅为 (𝑠ℎ,𝑠𝑤) 。这个汇聚层的计算成本是多少?

$c*((h+p_h-p_h)/s_h + 1 )((w+p_w-p_w)/s_w + 1 )(p_h*p_w-1 +1)$ -1是加法个数 后面+1是除法个数

为什么最大汇聚层和平均汇聚层的工作方式不同?

一个是找最大的元素,更侧重于检测响应大的点,求均值则会在一定程度上进行空间位置的融合。

我们是否需要最小汇聚层?可以用已知函数替换它吗?

最小汇聚层指的是最小响应的值?这样会造成信息大量丢失?

除了平均汇聚层和最大汇聚层,是否有其它函数可以考虑(提示:回想一下softmax)?为什么它不流行?

softmax需要学习参数且计算复杂

请问是为什么呀

你这个代码最大汇聚不是求最大值,而是求右下的值

我也感觉实现不了 :joy:
如果只是改变卷积核里的元素不动别的代码的话

第一题:

import torch
import torch.nn as nn

# 定义一个简单的神经网络,其中包含一个平均池化层
class SimpleNet(nn.Module):
    def __init__(self, kernel_size, stride=None, padding=0):
        super(SimpleNet, self).__init__()
        if stride is None:
            stride = kernel_size
        self.avg_pool = nn.AvgPool2d(kernel_size=kernel_size, stride=stride, padding=padding)

    def forward(self, x):
        return self.avg_pool(x)

# 示例使用
x = torch.randn(1, 1, 8, 8)  # 批量大小1,1个通道,8x8的输入
model = SimpleNet(kernel_size=3, stride=2, padding=1)
output = model(x)

print("输入:")
print(x)
print("输出:")
print(output)

第二题:

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

class MaxPoolAsConv(nn.Module):
    def __init__(self, kernel_size, stride=None, padding=0):
        super(MaxPoolAsConv, self).__init__()
        if stride is None:
            stride = kernel_size
        self.kernel_size = kernel_size
        self.stride = stride
        self.padding = padding

    def forward(self, x):
        # Apply max pooling directly using PyTorch's max_pool2d function
        return F.max_pool2d(x, kernel_size=self.kernel_size, stride=self.stride, padding=self.padding)

示例使用

x = torch.randn(1, 1, 8, 8)  # 批量大小1,1个通道,8x8的输入
model = MaxPoolAsConv(kernel_size=3, stride=2, padding=1)
output = model(x)

print("输入:")
print(x)
print("输出:")
print(output)

第三题:

第四题:

  1. 最大汇聚层(Max Pooling Layer):
  • 工作方式:在每个池化窗口中,最大汇聚层选择窗口内的最大值作为输出。
  • 特点:强调最强的激活,保留最显著的特征。
  1. 平均汇聚层(Average Pooling Layer):
  • 工作方式:在每个池化窗口中,平均汇聚层计算窗口内所有值的平均值作为输出。
  • 特点:平滑特征,保留整体信息的平均水平。

使用场景的不同

  1. 最大汇聚层的使用场景:
  • 通常用于捕捉图像中的最显著特征,如边缘、角点等。
  • 在分类任务中,可以帮助网络更好地捕捉到关键特征。
  1. 平均汇聚层的使用场景:
  • 常用于需要保留更多背景信息的任务,如图像恢复、去噪等。
  • 在一些平滑特征的任务中表现更好,如生成模型或风格迁移。

第五题:
最小汇聚层在某些特殊任务中可能是有用的,但在大多数标准任务中,使用最大汇聚或平均汇聚已经足够。

第六题:
虽然有一些替代汇聚方法如Softmax汇聚和混合汇聚,但由于复杂性、计算成本和性能上的考虑,它们并不如最大汇聚和平均汇聚流行。最大汇聚和平均汇聚由于其简单、高效和在许多任务中的有效性,成为了深度学习中的标准选择。

Q1和Q2

分别定义两个卷积,kernel权重初始化为全1


修改corr2d适应padding和stride

验证输出

有办法只填充左(或者上)边而不填充右(或者下)边吗?