pytorch学习笔记-最大池化maxpooling的使用、搭建多层网络并验证、sequential的使用
二编:插入说明一下吧,这一系列一直都是作为我的学习笔记使用的,记录的是如何使用pytorch,以及遇到的一些困惑and自问自答,并不涉及到深度学习相关知识的讲解,另外,博主此前有tf基础(虽然忘光了且很菜),因此对一些东西可能会不作记录,有问题可以评论区提问或者参考一些专门讲此类知识的博客或者视频
---------------------------------------分割线------------------------------------------
最近忙着摸鱼(不是 所以没啥时间继续学习/看书and更新…闲里偷忙的上号来更新一点(跪下来求自己赶紧完结吧
其实根据上一篇大概也能推导出大部分层都是去nn底下看看自己需要的层对应的语法然后在自己的module里加入使用就可以,因此,在接下来不对这些层做具体解释了,下面是一个maxpooling的样例:
import torch
from torchvision import transforms, datasets
from torch.utils.data import DataLoader
import torch.nn as nn
from torch.utils.tensorboard import SummaryWriterdata_transforms = transforms.Compose([transforms.ToTensor()
])test_data = datasets.CIFAR10(root="./dataset",train=False,transform=data_transforms)dataloader = DataLoader(test_data,batch_size=64)class myModule(nn.Module):def __init__(self):super().__init__()self.maxpool1 = nn.MaxPool2d(kernel_size=3,ceil_mode=False)def forward(self, input):output = self.maxpool1(input)return outputmy_module = myModule()writer = SummaryWriter("maxpool_logs")step = 0for data in dataloader:imgs, target = datawriter.add_images("input",imgs,step)output = my_module(imgs)writer.add_images("output",output,step)step +=1writer.close()
下面来按照这个图搭建一下网络,插图来自土堆老师的视频,重点关注如何根据图示模型给出的参数推导编程中缺少的参数
import torch
import torch.nn as nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass myModule(nn.Module):def __init__(self):super().__init__()self.conv1 = Conv2d(3,32,5,padding=2)self.maxpool1 = MaxPool2d(2)self.conv2 = Conv2d(32,32,5,padding=2)self.maxpool2 = MaxPool2d(2)self.conv3 = Conv2d(32,64,5,padding=2)self.maxpool3 = MaxPool2d(2)self.flatten = Flatten()self.linear1 = Linear(1024,64)self.linear2 = Linear(64,10)def forward(self, x):x = self.conv1(x)x = self.maxpool1(x)x = self.conv2(x)x = self.maxpool2(x)x = self.conv3(x)x = self.maxpool3(x)x = self.flatten(x)x = self.linear1(x)x = self.linear2(x)return xmy_module = myModule()
##模型验证
#创建张量流,bt_size64 channel3 H=W=32,全填充为1
input = torch.ones([64,3,32,32])
output = my_module(input)
print(output.shape)
# torch.Size([64, 10])
最后输出的前一个是batch_size,因此关注最后一个输出的就好,10和图对应了,所以模型是对的
考虑到每次在forward里写这么多还是有点麻烦,所以引入sequential(好像tensorFlow也有这个?好久没写过tf语法了记错了就当我没说吧…
其实使用感和transform.Compose很类似,而且也只是个语法,所以直接上例程吧,一看就知道怎么使用了
import torch
import torch.nn as nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequentialclass myModule(nn.Module):def __init__(self):super().__init__()self.model1 = Sequential(Conv2d(3,32,5,padding=2),MaxPool2d(2),Conv2d(32,32,5,padding=2),MaxPool2d(2),Conv2d(32,64,5,padding=2),MaxPool2d(2),Flatten(),Linear(1024,64),Linear(64,10))def forward(self, x):x = self.model1(x)return xmy_module = myModule()
##模型验证
#创建张量流,bt_size64 channel3 H=W=32,全填充为1
input = torch.ones([64,3,32,32])
output = my_module(input)
print(output.shape)
# torch.Size([64, 10])
另外,可以使用add_graph看见模型具体的情况,使用方法如下:
writer = SummaryWriter("seq_logs")
writer.add_graph(my_module, input)
writer.close()