之前做医学图像分类时,老师有提到3D卷积,当时只是觉得3D卷积就是输入图像的3维的,把卷积核改成三维的就行,没有真正意识到3D卷积与2D卷积中的多通道卷积有什么区别,今天突然想到这个问题又查阅了很多资料才搞清楚里面的区别在哪,决定把自己总结的知识点记下来,以便于之后查看。(以下只是博主自己的理解,如有错误的地方,请一定要指出来,谢谢~)
下文的内容将会涉及到这幅图,来源于Learning Spatiotemporal Features with 3D Convolutional Networks(ICCV 2015):
以图像为例,单通道是指输入图像的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的。
直接使用torchvision.datasets.MNIST()导入MNIST数据集,取其中一张图像为例,使用3×3的卷积核进行卷积:
import torch
import torchvision
import torch.nn as nn
input_2d=data
print(input_2d.shape)
conv_2d_1=nn.Conv2d(1, 2, kernel_size=3,stride=1, padding=0)
output=conv_2d_1(input_2d)
print(output.shape)
print(conv_2d_1.weight.size())
与单通道相对应,多通道是指输入图像的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的。
直接使用torchvision.datasets.CIFAR10()导入CIFAR10数据集,取其中一张图像为例,使用3×3的卷积核进行卷积:
import torch
import torchvision
import torch.nn as nn
input_3d=data
print(input_3d.shape)
conv_2d_3=nn.Conv2d(3, 1, kernel_size=5,stride=1, padding=0)
output=conv_2d_3(input_3d)
print(output.shape)
print(conv_2d_3.weight.size())
print(conv_2d_3.weight)
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的。
以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
filename='./coronacases_001.nii.gz'
itkimage = sitk.ReadImage(filename)
numpyImage = sitk.GetArrayFromImage(itkimage)
print(numpyImage.shape)
input_=torch.Tensor(numpyImage.reshape(1,1,301,512,512))
print(input_.shape)
conv_3d=nn.Conv3d(1, 2, kernel_size=(2,3,3),stride=1, padding=0)
output=conv_3d(input_)
print(output.shape)
print(conv_3d.weight.size())
print(conv_3d.weight)
- https://blog.csdn.net/strawqqhat/article/details/107655698
- https://blog.csdn.net/jer8888/article/details/102885963
- https://www.zhihu.com/question/266352189
学习了一段时间神经网络,也基于pytorch1.1 2D卷积你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高
他们处理的都是input tensor前几个维度的信息。
1)1D主要用于NLP中的N_gram,一维卷积又称时域卷积。
2)2D和3D卷积用于图像。其中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卷积支持2D到3D转换学习,在我们的实验中始终如一地大大提高了性能。
即使没有预训练,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 corr
2d(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不可以
内容来自:C
3D的论文
应用于一个图像的
2D卷积将输出一个图像,施加在多个图像上的
2D卷积(将它们视为不同的通道)也输出一个图像。因此,
2D ConvNets在每次
卷积运算之后就会丢失输入信号的时间信息。
只有
3D卷积才能保留输入信号的时间信息,从而产生输出卷。相同的现象适用于
2D和
3D池化。
卷积运算:
卷积核在输入信号(图像)上滑动,相应位置上进行乘加。
卷积核:又称为滤波器,过滤器,可认为是某种特征。
卷积维度:一般情况下 ,
卷积核在几个维度上滑动就是几维
卷积。
卷积过程类似于用一个模版去图像上寻找与它相似的区域,与
卷积核模式越相似,激活值越高,从而
实现特征提取。下图为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》