你能将平均汇聚层作为卷积层的特殊情况实现吗?
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需要学习参数且计算复杂
我也感觉实现不了
如果只是改变卷积核里的元素不动别的代码的话
第一题:
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)
第三题:
第四题:
- 最大汇聚层(Max Pooling Layer):
- 工作方式:在每个池化窗口中,最大汇聚层选择窗口内的最大值作为输出。
- 特点:强调最强的激活,保留最显著的特征。
- 平均汇聚层(Average Pooling Layer):
- 工作方式:在每个池化窗口中,平均汇聚层计算窗口内所有值的平均值作为输出。
- 特点:平滑特征,保留整体信息的平均水平。
使用场景的不同
- 最大汇聚层的使用场景:
- 通常用于捕捉图像中的最显著特征,如边缘、角点等。
- 在分类任务中,可以帮助网络更好地捕捉到关键特征。
- 平均汇聚层的使用场景:
- 常用于需要保留更多背景信息的任务,如图像恢复、去噪等。
- 在一些平滑特征的任务中表现更好,如生成模型或风格迁移。
第五题:
最小汇聚层在某些特殊任务中可能是有用的,但在大多数标准任务中,使用最大汇聚或平均汇聚已经足够。
第六题:
虽然有一些替代汇聚方法如Softmax汇聚和混合汇聚,但由于复杂性、计算成本和性能上的考虑,它们并不如最大汇聚和平均汇聚流行。最大汇聚和平均汇聚由于其简单、高效和在许多任务中的有效性,成为了深度学习中的标准选择。
有办法只填充左(或者上)边而不填充右(或者下)边吗?