PyTorch Week 3——nn.MaxPool2d、nn.AvgPool2d、nn.Linear、激活层

系列文章目录

PyTorch Week 3——卷积
PyTorch Week 3——nn.Module的容器:Sequential、ModuleList、ModuleDice
PyTorch Week 3——模型创建
PyTorch Week 2——Dataloader与Dataset
PyTorch Week 1


前言

从本节开始转变思路,主要关注各种方法的pytorch代码,对于原理部分略微写写,等后面阅读论文时再以原理为重点。

一级目录

二级目录

三级目录

一、池化

1、nn.MaxPool2d()

1 池化概念以及基础使用方法

nn.MaxPool2d(kernel_size,
			 stride=None,
			 padding=0,
			 dilation=1,#池化核间隔大小,空洞卷积的概念
			 return_indices=False,#记录池化索引函数,用于最大反池化上采样
			 ceil_mode=False#尺寸是否向上取整,池化除法操作为了保证输出整数有取整操作,可以选择True向下取整,False向上取整)

实例,输入一张图片,

path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lena.png")
img = Image.open(path_img).convert('RGB')  # 0~255

# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)   
maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2))   # input:(i, o, size) weights:(o, i , h, w)
img_pool = maxpool_layer(img_tensor)

输入尺寸为512×512,输出为256×256
MaxPooling池化
可以看出,池化后,图像尺寸减小,没有改变图像的特征。

2 return_indices参数,记录最大池化时取最大值的索引,用于上采样

    # pooling
    img_tensor = torch.randint(high=5, size=(1, 1, 4, 4), dtype=torch.float)
    maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2), return_indices=True)
    img_pool, indices = maxpool_layer(img_tensor)

    # unpooling
    img_reconstruct = torch.randn_like(img_pool, dtype=torch.float)
    maxunpool_layer = nn.MaxUnpool2d((2, 2), stride=(2, 2))
    img_unpool = maxunpool_layer(img_reconstruct, indices)

    print("raw_img:\n{}\nimg_pool:\n{}".format(img_tensor, img_pool))
    print("img_reconstruct:\n{}\nimg_unpool:\n{}".format(img_reconstruct, img_unpool))

在这里插入图片描述

2、nn.AvgPool2d()平均池化

1 平均池化效果

nn.MaxPool2d(kernel_size,
			 stride=None,
			 padding=0,
			 count_include_pad=True,#填充值用于计算
			 divisor_override=None,#除法因子
			 ceil_mode=False#尺寸是否向上取整,池化除法操作为了保证输出整数有取整操作,可以选择True向下取整,False向上取整)

实例

path_img = os.path.join(os.path.dirname(os.path.abspath(__file__)), "lena.png")
img = Image.open(path_img).convert('RGB')  # 0~255

# convert to tensor
img_transform = transforms.Compose([transforms.ToTensor()])
img_tensor = img_transform(img)
img_tensor.unsqueeze_(dim=0)   
maxpool_layer = nn.MaxPool2d((2, 2), stride=(2, 2))   # input:(i, o, size) weights:(o, i , h, w)
img_pool = maxpool_layer(img_tensor)
avgpoollayer = nn.AvgPool2d((2, 2), stride=(2, 2))   # input:(i, o, size) weights:(o, i , h, w)
img_avgpool = avgpoollayer(img_tensor)

输出为:原图、最大池化、平均池化。可以看出,平均池化的图片更暗
原图,最大池化,平均池化

2 参数divisor_override

另外,关于divisor_override,默认None是除以池化核的元素个数
自定义输入为torch.ones((1, 1, 4, 4)),divisor_override设为默认时

    img_tensor = torch.ones((1, 1, 4, 4))
    avgpool_layer = nn.AvgPool2d((2, 2), stride=(2, 2))# divisor_override=3)
    img_pool = avgpool_layer(img_tensor)

    print("raw_img:\n{}\npooling_img:\n{}".format(img_tensor, img_pool))

在这里插入图片描述
divisor_override设为3时,结果为4/3

    img_tensor = torch.ones((1, 1, 4, 4))
    avgpool_layer = nn.AvgPool2d((2, 2), stride=(2, 2), divisor_override=3)
    img_pool = avgpool_layer(img_tensor)

    print("raw_img:\n{}\npooling_img:\n{}".format(img_tensor, img_pool))

在这里插入图片描述

二、线性层nn.Linear

nn.Linear()和linear_layer.weight.data()设置权重初始化

    inputs = torch.tensor([[1., 2, 3]])
    linear_layer = nn.Linear(3, 4)#3为输入单元个数,4为输出单元个数
    linear_layer.weight.data = torch.tensor([[1., 1., 1.],
                                             [2., 2., 2.],
                                             [3., 3., 3.],
                                             [4., 4., 4.]])

    linear_layer.bias.data.fill_(0.5)
    output = linear_layer(inputs)
    print(inputs, inputs.shape)
    print(linear_layer.weight.data, linear_layer.weight.data.shape)
    print(output, output.shape)

3、激活层

1 、nn.Sigmoid

个人理解:Sigmoid函数有一个线性激活区域,大约在-2.5,2.5之间,这个区域的梯度表现是比较好的,但梯度最大才0.25,容易导致梯度消失,而在-5,5之外的区域梯度趋近于0,这个范围梯度几乎消失
Sigmoid

2、nn.tanh

在这里插入图片描述

3、nn.ReLu、以及改进的nn.LeakyReLU、nn.PReLU、nn.RReLU

个人理解:ReLU的这三种改进主要针对的是负半轴梯度为0导致死神经元,改进方法是设置不同的梯度,非常小的梯度(LeakyReLU)、可以学习的梯度(PReLU)、随机的梯度(RReLU)
在这里插入图片描述
在这里插入图片描述

总结

本文介绍了网络层中的其他常用层:池化层、线性层、激活层。

  • 池化层根据计算方式不同分为最大池化和平均池化,文中演示了nn.MaxPool2d()和nn.AvgPool2d()的代码。
  • 线性层演示了nn.Linear(),可以使用Linear.weight.data()方法自定义初始化,这也是下一节课要讲解的网络层权值的初始化
  • 激活层介绍了Sigmoid、tanh、ReLU,Sigmoid。其中Sigmoid梯度最大值为0.25,并且-5,以外的梯度趋近于0,容易导致梯度消失,并且输出均值不为0,破坏了分布;tanh的输出均值为0,但是-2.5,2.5以外的梯度趋近于0,输出值域为0,1,更容易导致梯度消失。ReLU在正半轴的导数为1,缓解梯度消失,但易引发梯度爆炸,而负半轴梯度为0,导致死神经元,针对负半轴的梯度提出了另外三种改进的方法。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值