添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
深情的奔马  ·  无法在AVD管理器android ...·  1 年前    · 
深沉的便当  ·  ffmpeg ERROR: libnpp ...·  1 年前    · 
温暖的便当  ·  oracle ...·  1 年前    · 

之前做医学图像分类时,老师有提到3D卷积,当时只是觉得3D卷积就是输入图像的3维的,把卷积核改成三维的就行,没有真正意识到3D卷积与2D卷积中的多通道卷积有什么区别,今天突然想到这个问题又查阅了很多资料才搞清楚里面的区别在哪,决定把自己总结的知识点记下来,以便于之后查看。(以下只是博主自己的理解,如有错误的地方,请一定要指出来,谢谢~)

下文的内容将会涉及到这幅图,来源于Learning Spatiotemporal Features with 3D Convolutional Networks(ICCV 2015):
原论文:Learning Spatiotemporal Features with 3D Convolutional Networks(ICCV 2015)

1 2D卷积

1.1 单通道卷积

以图像为例,单通道是指输入图像的channel为1,如MNIST数据集中的灰度图像。

  • 以MNIST数据集中的图像为例,输入图像的shape为(1,1,28,28),第一个‘1’表示batchsize为1,第二个‘1’表示图像channel为1,图像大小为28*28。
  • 单通道2D卷积中的卷积核shape为(1,kernel_height,kernel_width),因为卷积核的in_channel与输入图像的channel必须一致,输入图像的channel为1,所以卷积核的in_channel为1。卷积核大小为kernel_height×kernel_width。参数数量为:1×kernel_height×kernel_width×out_channels。
  • 单通道2D卷积的过程可以视为上图的中(a)的情况,卷积核在图像中从左向右,从上到下滑动来提取特征。卷积之后的output是2D的。

1.1.1 单通道卷积Pytorch实现

直接使用torchvision.datasets.MNIST()导入MNIST数据集,取其中一张图像为例,使用3×3的卷积核进行卷积:

import torch
import torchvision
import torch.nn as nn
##data是数据集中的一张图片
input_2d=data
print(input_2d.shape)  
##out: torch.Size([1, 1, 28, 28])
## '1'是in_channels,‘2’是out_channels
conv_2d_1=nn.Conv2d(1, 2, kernel_size=3,stride=1, padding=0)
output=conv_2d_1(input_2d)
print(output.shape)
##out:torch.Size([1, 2, 26, 26])
print(conv_2d_1.weight.size())
##out:torch.Size([2, 1, 3, 3])

1.2 多通道卷积

与单通道相对应,多通道是指输入图像的channel有多个,常见的是彩色图像,其有RGB三个通道,如CIFAR-10数据集中的图像。

  • 以CIFAR-10数据集中的图像为例,输入图像的shape为(1,3,32,32),‘1’表示batchsize,‘3’表示图像channel(R,G,B),图像大小为32*32。
  • 多通道2D卷积中的卷积核shape为(3,kernel_height,kernel_width),输入图像的channel决定了卷积核的in_channel。卷积核大小为kernel_height×kernel_width。参数数量为:3×kernel_height×kernel_width×out_channels,且每个通道的卷积核参数不同。
  • 多通道2D卷积的过程可以视为上图的中(b)的情况,卷积核在图像中从左向右,从上到下滑动来提取特征,卷积过程与单通道卷积区别不大。卷积之后的output是2D的。

1.2.1 多通道卷积Pytorch实现

直接使用torchvision.datasets.CIFAR10()导入CIFAR10数据集,取其中一张图像为例,使用3×3的卷积核进行卷积:

import torch
import torchvision
import torch.nn as nn
##data是CIFAR10数据集中的一个样本
input_3d=data
print(input_3d.shape)
##out: torch.Size([1, 3, 32, 32])
## '3'是in_channels,‘1’是out_channels
conv_2d_3=nn.Conv2d(3, 1, kernel_size=5,stride=1, padding=0)
output=conv_2d_3(input_3d)
print(output.shape)
##out:torch.Size([1, 1, 28, 28])
print(conv_2d_3.weight.size())
##out:torch.Size([1, 3, 5, 5])
print(conv_2d_3.weight)
##out:将每个通道的卷积核参数打印下来,发现不同通道参数不一样。
#Parameter containing:
#tensor([[[[-0.0600, -0.0141, -0.0144,  0.1019, -0.0315],
#          [ 0.0584,  0.0127, -0.0456, -0.0332, -0.0799],
#          [ 0.0907,  0.0177, -0.0280,  0.0516,  0.1063],
#          [-0.0778,  0.0547, -0.0803, -0.0821,  0.1050],
#          [ 0.0043, -0.0023,  0.0605,  0.0147,  0.0778]],
#         [[-0.0456,  0.0874,  0.1106, -0.0932, -0.1071],
#          [ 0.0710, -0.0980, -0.0349, -0.0049, -0.0561],
#          [ 0.0739, -0.0542, -0.0015,  0.0583,  0.0964],
#          [ 0.0017,  0.0645,  0.0116,  0.0480,  0.0664],
#          [-0.0622,  0.1145, -0.0708, -0.0958,  0.0587]],
#         [[ 0.0913, -0.0239,  0.0371, -0.0304,  0.0454],
#          [ 0.0646,  0.1053, -0.0504,  0.0908,  0.0729],
#          [ 0.0518,  0.0235, -0.0326, -0.0338, -0.0240],
#          [-0.0689, -0.0707,  0.0543,  0.1041, -0.0868],
#          [-0.0684, -0.0483, -0.0327, -0.0383, -0.0138]]]], requires_grad=True)

2 3D卷积

2.1 3D卷积特点

3D卷积同样有单通道卷积和多通道卷积,与2D卷积类似,这里不再赘述,只强调区别。

  • 同样以图像为例,3D卷积在医疗图像中使用较多,如CT,MRI等原始数据往往有多个切片构成。
  • 3D卷积中输入图像的shape为(1,channel,depth,height,weight),这里的depth是区别于2D卷积的关键,2D卷积的输入可以看出是3D卷积的特殊情况,即depth为1
  • 3D卷积中卷积核的shape为(input_channels , kernel_depth , kernel_height, kernel_width),与2D卷积相比,3D卷积的卷积核多了kernel_depth这个维度。卷积核大小为kernel_depth×kernel_height×kernel_width。参数数量为:input_channels×kernel_depth×kernel_height×kernel_width×out_channels,且每个通道的卷积核参数不同。
  • 3D卷积的过程可以视为上图的中(c)的情况,卷积核除了在3D图像中从左向右,从上到下滑动来提取特征外,还需要往一个额外的depth维度上滑动(可以看出除了在一个平面上往左右,上下滑动外,还要往里走,就是另外一个维度,想象一下,我不太会形容唉),因此3D卷积可以在空间中提取更强的特征信息,3D卷积后的output仍然是3D的。

2.2 3D卷积Pytorch实现

以CT数据集中的一个nii.gz文件为例,就是一个样本,利用SimpleITK中的SimpleITK.GetArrayFromImage()提取nii.gz中的array信息,可以得到该样本的shape为(301, 512, 512),即depth为301,height为512,weight为512。利用2×3×3的卷积核进行卷积:

import torch
import torchvision
import torch.nn as nn
import SimpleITK as sitk
import numpy as np
##这是一个CT数据集中的样本
filename='./coronacases_001.nii.gz'
itkimage = sitk.ReadImage(filename)
numpyImage = sitk.GetArrayFromImage(itkimage)
print(numpyImage.shape)
##out:(301, 512, 512)
##将输入reshape为网络输入数据的格式(batchsize,channel,depth,height,weight)
input_=torch.Tensor(numpyImage.reshape(1,1,301,512,512))
print(input_.shape)
##out:torch.Size([1, 1, 301, 512, 512])
##'1'是in_channels,‘2’是out_channels
##(2,3,3)分别对应kernel_depth,kernel_height,kernel_width
conv_3d=nn.Conv3d(1, 2, kernel_size=(2,3,3),stride=1, padding=0)
output=conv_3d(input_)
print(output.shape)
##out:torch.Size([1, 2, 300, 510, 510])
print(conv_3d.weight.size())
##out:torch.Size([2, 1, 2, 3, 3])
print(conv_3d.weight)
##out:每个通道的卷积核参数不同
#Parameter containing:
#tensor([[[[[-0.2320, -0.1497, -0.0779],
#           [-0.0511, -0.1489, -0.0866],
#           [ 0.1233, -0.2222,  0.0528]],
#          [[-0.0779,  0.2237, -0.0941],
#           [ 0.0026,  0.0426,  0.2323],
#           [ 0.2230, -0.0586,  0.2127]]]],
#        [[[[ 0.0393, -0.0342, -0.1338],
#           [ 0.0640,  0.0879, -0.2289],
#           [-0.0047, -0.1611,  0.2131]],
#          [[ 0.1573, -0.0108,  0.2327],
#           [-0.0824, -0.1601, -0.2348],
#           [ 0.1938, -0.0731,  0.1490]]]]], requires_grad=True)

参考资料:

  1. https://blog.csdn.net/strawqqhat/article/details/107655698
  2. https://blog.csdn.net/jer8888/article/details/102885963
  3. https://www.zhihu.com/question/266352189
学习了一段时间神经网络,也基于pytorch1.1 2D卷积你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高   他们处理的都是input tensor前几个维度的信息。   1)1D主要用于NLP中的N_gram,一维卷积又称时域卷积。   2)2D3D卷积用于图像。其中2D卷积处理的是一张图像,3D卷积处理的就是多张图像。3D卷积考虑时间维度的信息。   参考资料:   https://github.com/vdumoulin/conv_arithmetic
pytorch卷积神经网络nn.conv2d 卷积网络最基本的是卷积层,使用使用Pytorch中的nn.Conv2d类来实现二维卷积层,主要关注以下几个构造函数参数: nn.Conv2d(self, in_channels, out_channels, kernel_size, stride, padding,bias=True)) in_channel: 输入数据的通道数; out_channel: 输出数据的通道数,这个根据模型调整; kennel_size: 卷积核大小;kennel_size=3,表示卷积大小(3,3), kennel_size=(3,5),表示卷积大小为非正
ACSConv 重塑3D图像的2D卷积( ) IEEE Journal of Biomedical and Health Informatics(IEEE JBHI),2021年( ) ACS卷积旨在用于3D医学图像的标准3D卷积的即插即用替代。 ACS卷积支持2D3D转换学习,在我们的实验中始终如一地大大提高了性能。 即使没有预训练,ACS卷积也可以与3D卷积媲美甚至更好,模型尺寸更小且计算量更少。 运行ACSConv软件包的最低要求。 torch >= 1.8 . 1 torchvision >= 0.9 . 0 您可以手动安装它们,也可以通过以下命令安装它们: pip install -r requirements.txt 运行所包含的实验所需的所有库(已包含基本要求)。 fire == 0.4 . 0 jupyterlab
3D CNN主要运用在视频分类、动作识别等领域,它是在2D CNN的基础上改变而来。由于2D CNN不能很好的捕获时序上的信息,因此我们采用3D CNN,这样就能将视频中时序信息进行很好的利用。 参考博客:https://blog.csdn.net/weixin_38346042/article/details/124966460?spm=1001.2014.3001.5502 ​   虽然卷积层得名于卷积(convolution)运算,但我们通常在卷积层中使⽤更加直观的互相关(crosscorrelation)运算。计算如下: def corr2d(X, K): 计算卷积操作(互操作) h, w = K.shape # 得到卷积后 Y = t.zeros((X.shape[0]-h+1, X.shape[1]-w+1)) for i in range(Y.shape[0]): for j in range(Y.shape[1]): 假设输入数据维度为8,filter维度为5,不加padding时,输出维度为4;如果filter的数量为16,那么输出数据的shape就是; 2 二维卷积神经网络2D-CNN) 二维卷积常用在计算机视觉、图像处理领域(在视频的处理中,是对每一帧图像分别利用CNN来进行识别,没有考虑时间维度的信息);
在项目中用到了conv3但是对其背后的原理还有一些模糊的地方,conv2d与多通道的conv2d区别在哪里?conv3d的思想理论是什么?对此进行探究和记录...... 首先要明确多通道的2d卷积3d卷积是不一样的,3d是可以在通道中移动的,2d不可以
内容来自:C3D的论文 应用于一个图像的2D卷积将输出一个图像,施加在多个图像上的2D卷积(将它们视为不同的通道)也输出一个图像。因此,2D ConvNets在每次卷积运算之后就会丢失输入信号的时间信息。 只有3D卷积才能保留输入信号的时间信息,从而产生输出卷。相同的现象适用于2D3D池化。 卷积运算:卷积核在输入信号(图像)上滑动,相应位置上进行乘加。 卷积核:又称为滤波器,过滤器,可认为是某种特征。 卷积维度:一般情况下 ,卷积核在几个维度上滑动就是几维卷积卷积过程类似于用一个模版去图像上寻找与它相似的区域,与卷积核模式越相似,激活值越高,从而实现特征提取。下图为AlexNet卷积核可视化,可以看出,卷积核学习到的是 边缘,条纹,色彩这些特征。 Conv1D/2D/3D区别
一:手写二维卷积实现 手写二维卷积实现,并从至少一个数据集上进行实验,这里我选取了车辆分类数据集(后面的实验都是用的车辆分类数据集),主要根据数据集的大小,手动定义二维卷积操作,如:自定义单通道卷积、自定义多通道卷积、自定义卷积层等。 实验过程: 1.1相关包的导入 1. import torch 2. import numpy as np 3. import random 4. from IPython import display 5. from matplotlib imp
卷积神经网络中,shortcut连接也被称为残差连接,用于提高网络训练的速度和准确性。在PyTorch中,可以使用`nn.ModuleList`和`nn.Sequential`模块来实现shortcut连接。 具体而言,可以定义一个包含多个卷积层的模块,然后将该模块作为主网络的一部分,并添加shortcut连接。下面是一个使用PyTorch实现shortcut连接的示例代码: ```python import torch import torch.nn as nn class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super(ResidualBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) # 添加shortcut连接 if stride != 1 or in_channels != out_channels: self.shortcut = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(out_channels) else: self.shortcut = nn.Sequential() def forward(self, x): out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out += self.shortcut(x) # 添加shortcut连接 out = self.relu(out) return out 在这个示例中,`ResidualBlock`是一个包含两个卷积层的模块,其中第二个卷积层的输出和shortcut连接的输出相加。如果输入和输出通道数不同或者stride不为1,那么就需要在shortcut连接中添加一个额外的1x1卷积层和BN层来保证通道数和尺寸的一致性。最后,在`forward`函数中,将shortcut连接的输出加到卷积层的输出上,然后再通过ReLU激活函数进行非线性变换。
论文笔记《A Mutual Bootstrapping Model for Automated Skin Lesion Segmentation and Classification》 论文笔记《Automated melanoma recognition in dermoscopy images via very deep residual networks》 论文笔记《DermaKNet: Incorporating the knowledge of dermatologists to Convolutional Neural Networks for 》 论文笔记《Automated melanoma recognition in dermoscopy images via very deep residual networks》