一、定义
- Channels:表示输入数据的通道数,也就是特征图的深度。对于彩色图像,通常有三个通道(红、绿、蓝),分别对应于图像的不同颜色通道。对于灰度图像,通常只有一个通道。对于其他类型的数据,通道数可能会根据具体情况而不同。【明确说就是特征,只不过在输入的彩色图像中是RGB三通道,颜色也可算作是通道,经过卷积后输出的通道可以是边缘、纹理、形状、物体部分等,而不仅仅局限于输入图像的颜色信息。】
二、同一个卷积层中输入的通道和输出的通道数目要一致吗?
- 在传统的卷积操作中,输入通道数和输出通道数通常是相等的。这意味着每个卷积核都与输入数据的所有通道进行卷积操作,并产生一个输出通道。这种情况下,输出的特征图的深度(通道数)与卷积核的数量相等。 然而,并不是所有的卷积操作都要求输入通道数和输出通道数相等。在一些特殊的网络架构中,例如使用跨通道卷积操作的网络结构,输出通道数可能与输入通道数不同。跨通道卷积操作是一种用于增加网络表达能力的技巧,它允许卷积核的通道数与输入通道数不同,从而使得每个卷积核可以对输入数据的所有通道进行不同的处理。总的来说,在绝大多数情况下,卷积层的输入通道数和输出通道数是相等的。这样做有助于保持特征图的维度一致性,并且利用每个卷积核对输入数据的所有通道进行联合处理,从而提取更加丰富和复杂的特征信息。
例如:
class conv(nn.module):
def __int__(self):
super(conv,self).__init()
self.conv1 = Conv2d(in_channel = 3,out_channel = 6,kernel_size=3,strid=1,padding=0)
#定义的input通道为3 output通道为6
def forward(self,x):
x = self.conv1(x)
return x
writer = SummaryWriter('./logs')
step = 0
for data in dataload:
imgs,targets = data
output = conv(imgs)
writer.add_image("input",imgs,step)
writer.add_image("output",output,step)#此处会报错,由于输入和输出的通道数不一样
step = step+1
三、总结
本次问题来源于B站小土堆pytorch入门-神经网络-卷积层,代码也是视频中提供的例子。完整可运行代码如下所示:
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)
dataload = DataLoader(dataset,batch_size=64)
class conv(nn.Module):
def __init__(self):
super(conv,self).__init__()
self.conv1 = Conv2d(in_channels = 3,out_channels = 3,kernel_size=3,stride=1,padding=0)
def forward(self,x):
x = self.conv1(x)
return x
use_conv = conv()
writer = SummaryWriter('./logs')
step = 0
for data in dataload:
imgs,targets = data
output = use_conv(imgs)
writer.add_images("input",imgs,step)
writer.add_images("output",output,step)
step = step+1
最后使用tensorboard显示出来结果,在pycharm的terminal中输入:
tensorboard --logdir=logs
显示结果:
这中间还有很多容易出现的错误,例如【AssertionError: Input tensor input format are different】是由于writer.add_image和writer.add_images之间的区别。