1.讲解 Conv2d
- out_channels 参数为2时,会生成两个卷积核,分别与输入进行卷积。得到的两个输出为输出
新生成的卷积核和原来的卷积核不一定相同
-
in_channels (int) -- Number of channels in the input image
-
out_channels (int) -- Number of channels produced by the convolution
-
kernel_size (int or tuple) -- Size of the convolving kernel
-
stride (int or tuple, optional) -- Stride of the convolution. Default:1
-
padding (int, tuple or str, optional) -- Padding added to all four
sides of the input. Default: 0
2.代码实现
python
import torch
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):
self.conv1(x)
return x
tudui=Tudui()
print(tudui)
python
for data in dataloader:
imgs,targets=data
output=tudui(imgs)
print(output.shape)
python
tudui=Tudui()
writer=SummaryWriter("./logs")
step=0
for data in dataloader:
imgs,targets=data
output=tudui(imgs)
# print(output.shape)
print(imgs.shape)
print(output.shape)
#torch.Size([64, 3, 32, 32])
writer.add_images("input",imgs,step)
#torch.Size([64, 6, 30, 30]) -> [xxx,3,30,30]
output=torch.reshape(output,(-1,3,30,30))
writer.add_images("output", output, step)
step=step+1
注意:torch.Size([64, 3, 32, 32])与torch.Size([64, 6, 30, 30])
- ①输出通道数从3增加到6,因为使用了6个卷积核。
- ②宽度和高度的计算公式:
(输入尺寸 - 卷积核大小 + 2 * 填充) / 步长 + 1
将假设的值代入公式中:
宽度:(32 - 3 + 2 * 0) / 1 + 1 = 30
高度:(32 - 3 + 2 * 0) / 1 + 1 = 30
注意:reshape(output,(-1,3,30,30))
- -1:这个值是一个占位符,表示新张量的第一个维度的大小应该自动计算,以保持元素总数不变。这意味着PyTorch会自动计算这个维度的大小,使得新的张量包含与原始张量相同数量的元素。