池化
人话:在一个范围内(选中的kernel_size中)选择有代表的一个数来代表整个kernel_size,减少数据量
torch.nn里面的MaxPool2d
stride:步长,默认值为kernel size的长度(卷积默认步长为1)
dilation:偏移,见如下链接
conv_arithmetic/README.md at master · vdumoulin/conv_arithmetic (github.com)
ceil_model:取不到完整的时候是否保留
看例子:
import torch
import torchvision
from torch import nn
from torch.nn import MaxPool2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset2 = torchvision.datasets.CIFAR10("dataset2",transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset2,batch_size=20)
class qiqi(nn.Module):
def __init__(self):
super(qiqi, self).__init__()
self.maxpool1 = MaxPool2d(kernel_size=3,ceil_mode=False)
def forward(self,input):
output=self.maxpool1(input)
return output
qq=qiqi()
writer=SummaryWriter("nn_maxpool")
step=0
for data in dataloader:
imgs,target=data
writer.add_images("input",imgs,step)
output = qq(imgs)
writer.add_images("output",output,step)
step=step+1
writer.close()
用tensorboard打开:
最大池化到这里就很清楚了
非线性激活
ReLU
inplace:是否对原来的进行替代
下面拿sigmoid函数进行举例
import torch
import torchvision
from torch import nn
from torch.nn import Sigmoid
from torch.utils.tensorboard import SummaryWriter
from torch.utils.data import DataLoader
dataset2 = torchvision.datasets.CIFAR10("dataset2",transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(dataset2,batch_size=24)
class qiqi(nn.Module):
def __init__(self):
super(qiqi, self).__init__()
self.sigmoid1 = Sigmoid()
def forward(self,input):
output = self.sigmoid1(input)
return output
qq=qiqi()
writer = SummaryWriter("nn_sigmoid")
step=0
for data in dataloader:
imgs,target = data
writer.add_images("input",imgs,step)
output=qq(imgs)
writer.add_images("output",output,step)
step=step+1
writer.close()
至于使用sigmoid函数的意义,我在知乎上得到一个比较认同的答案:
线性层
bias:偏置,即线性层里面的b(kx+b)
代码示例:
flatten和上面reshape展平的功能一样