四、Neural Network 神经网络
参考文档:https://pytorch.org/docs/stable/nn.html
1、Containers - Module
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module
import torch from torch import nn class Tudui(nn.Module): def __init__(self): super().__init__() def forward(self, input): output = input + 1 return output tudui = Tudui() x = torch.tensor(1.0) output = tudui(x) print(output)
tensor(2.)
2、Convolution Layers - functional.conv2d
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.functional.conv2d.html#torch.nn.functional.conv2d
2.1 stride
import torch import torch.nn.functional as F input = torch.tensor([ [1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 0, 0], [5, 2, 3, 1, 1], [2, 1, 0, 1, 1] ]) kernel = torch.tensor([ [1, 2, 1], [0, 1, 0], [2, 1, 0] ]) input = torch.reshape(input, (1, 1, 5, 5)) # torch.Size([1, 1, 5, 5]) kernel = torch.reshape(kernel, (1, 1, 3, 3)) # torch.Size([1, 1, 3, 3]) output1 = F.conv2d(input, kernel, stride=1) print(output1) output2 = F.conv2d(input, kernel, stride=2) print(output2)
tensor([[[[10, 12, 12], [18, 16, 16], [13, 9, 3]]]]) tensor([[[[10, 12], [13, 3]]]])
2.2 padding
import torch import torch.nn.functional as F input = torch.tensor([ [1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 0, 0], [5, 2, 3, 1, 1], [2, 1, 0, 1, 1] ]) kernel = torch.tensor([ [1, 2, 1], [0, 1, 0], [2, 1, 0] ]) input = torch.reshape(input, (1, 1, 5, 5)) # torch.Size([1, 1, 5, 5]) kernel = torch.reshape(kernel, (1, 1, 3, 3)) # torch.Size([1, 1, 3, 3]) output1 = F.conv2d(input, kernel, stride=1, padding=1) print(output1) output2 = F.conv2d(input, kernel, stride=2, padding=1) print(output2)
tensor([[[[ 1, 3, 4, 10, 8], [ 5, 10, 12, 12, 6], [ 7, 18, 16, 16, 8], [11, 13, 9, 3, 4], [14, 13, 9, 7, 4]]]]) tensor([[[[ 1, 4, 8], [ 7, 16, 8], [14, 9, 4]]]])
3、Convolution Layers - Conv2d
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d
动画实现:https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md
3.1 in_channels out_channels
import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoader dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset, batch_size=64) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0) def forward(self, x): x = self.conv1(x) return x tudui = Tudui() for data in dataloader: imgs, targets = data output = tudui(imgs) print(imgs.shape) print(output.shape)
Files already downloaded and verified torch.Size([64, 3, 32, 32]) # in_channels=3 torch.Size([64, 6, 30, 30]) # out_channels=6 卷积之后 32 -> 30 ...
TensorBoard展示:
import torch import torchvision from torch import nn from torch.nn import Conv2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset, batch_size=64) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1, padding=0) def forward(self, x): x = self.conv1(x) return x tudui = Tudui() writer = SummaryWriter("logs") step = 0 for data in dataloader: imgs, targets = data output = tudui(imgs) print(imgs.shape) # torch.Size([64, 3, 32, 32]) print(output.shape) # torch.Size([64, 6, 30, 30]) writer.add_images("input", imgs, step) output = torch.reshape(output, (-1, 3, 30, 30)) # -> [xxx, 3, 30, 30] writer.add_images("output", output, step) print(output.shape) # torch.Size([128, 3, 30, 30]) step += 1 writer.close()
4、Pooling layers - MaxPool2d
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.MaxPool2d.html#torch.nn.MaxPool2d
4.1 ceil_mode
import torch from torch import nn from torch.nn import MaxPool2d input = torch.Tensor([ [1, 2, 0, 3, 1], [0, 1, 2, 3, 1], [1, 2, 1, 0, 0], [5, 2, 3, 1, 1], [2, 1, 0, 1, 1], ]) input = torch.reshape(input, (-1, 1, 5, 5)) # torch.Size([1, 1, 5, 5]) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=True) def forward(self, input): output = self.maxpool1(input) return output tudui = Tudui() output = tudui(input) print(output)
tensor([[[[2., 3.], [5., 1.]]]])
4.2 TensorBoard
import torchvision from torch import nn from torch.nn import MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset, batch_size=64) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.maxpool1 = MaxPool2d(kernel_size=3, ceil_mode=False) def forward(self, input): output = self.maxpool1(input) return output tudui = Tudui() writer = SummaryWriter("../logs") step = 0 for data in dataloader: imgs, targets = data writer.add_images("input", imgs, step) output = tudui(imgs) writer.add_images("output", output, step) step += 1 writer.close()
5、Non-linear Activations
5.1 ReLU
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.ReLU.html#torch.nn.ReLU
inplace说明:
①input = -1 – ReLU(input, inplace = True) – input = 0
②input = -1 – output = ReLU(input, inplace = True) – input = -1 output = 0
import torch from torch import nn from torch.nn import ReLU input = torch.Tensor([[1, -0.5], [-1, 3]]) # torch.Size([2, 2]) input = torch.reshape(input, (-1, 1, 2, 2)) # torch.Size([1, 1, 2, 2]) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.relu1 = ReLU() def forward(self, input): output = self.relu1(input) return output tudui = Tudui() output = tudui(input) print(output) # torch.Size([1, 1, 2, 2])
tensor([[[[1., 0.], [0., 3.]]]])
5.2 Sigmoid
参考文档:https://pytorch.org/docs/stable/generated/torch.nn.Sigmoid.html#torch.nn.Sigmoid
import torchvision from torch import nn from torch.nn import ReLU, Sigmoid from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter dataset = torchvision.datasets.CIFAR10("../data", train=False, transform=torchvision.transforms.ToTensor(), download=True) dataloader = DataLoader(dataset, batch_size=64) class Tudui(nn.Module): def __init__(self): super(Tudui, self).__init__() self.sigmoid1 = Sigmoid() def forward(self, input): output = self.sigmoid1(input) return output tudui = Tudui() writer = SummaryWriter("../logs") step = 0 for data in dataloader: imgs, targets = data writer.add_images("input", imgs, global_step=step) output = tudui(imgs) writer.add_images("output", output, global_step=step) step += 1 writer.close()