nn_conv2d

https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode=’zeros’, device=None, dtype=None)

in_channels代表输入的通道数,比如RGB图片 通道数就是3

out_channels代表输出的通道数,可以自己设置

如图所示吗,输入一个5×5的图片数据,in_channels=1,用一个卷积核对其进行卷积运算,最后输出的out_channels= 1

如图当我们设置out_channels=2时,会生成两个卷积核,这两个卷积核的数值可以是不一样的(卷积核数值是随机生成的后续进行学习优化),这两个卷积核分别对原始图像进行卷积运算,生成两个结果,这两个结果就构成输出的两个通道,及out_channels=2。

如图比如一个RGB图channels = 3,那么卷积核的通道数也自动变为3

最后我们设置out_channels = 4,那么就会有4个卷积核对图像进行卷积运算,而每个卷积核的通道数等于in_channles

  1. import torch
  2. import torchvision
  3. from torch import nn
  4. from torch.nn import Conv2d
  5. from torch.utils.data import DataLoader
  6. from torch.utils.tensorboard import SummaryWriter
  7. dataset = torchvision.datasets.CIFAR10('./dataset',train=False,transform=torchvision.transforms.ToTensor(),
  8. download=True)
  9. dataloader = DataLoader(dataset,batch_size=64)
  10. class DEMO(nn.Module):
  11. def __init__(self):
  12. super(DEMO,self).__init__()
  13. self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size= 3, stride=1, padding=0)
  14. def forward(self, x):
  15. x = self.conv1(x)
  16. return x
  17. demo = DEMO()
  18. writer = SummaryWriter('logs')
  19. step = 0
  20. for data in dataloader:
  21. imgs,targets = data
  22. output = demo(imgs)
  23. print(imgs.shape)
  24. # torch.Size([16, 3, 32, 32])
  25. print(output.shape)
  26. # torch.Size([16, 6, 30, 30])
  27. writer.add_images('input',imgs,step)
  28. # 由于RGB图片是三通道,channles = 6时无法显示,因此reshape成3通道
  29. # tensorboard中可以看到:
  30. # out_channels = 3时,输出是8×8
  31. # out_channels = 6时,reshape后
  32. # 会把另一个3通道的RGB图片平铺在前一个3通道RGB图片上,及16×8
  33. output = torch.reshape(output,(-1,3,30,30))
  34. writer.add_images('output',output,step)
  35. step += 1
  36. writer.close()

tips: Alt+Enter可以自动补全需要的库