Computer vision 使用3通道(RGB)PyTorch模型对4通道(RGBY)图像进行分类

Computer vision 使用3通道(RGB)PyTorch模型对4通道(RGBY)图像进行分类,computer-vision,pytorch,pre-trained-model,Computer Vision,Pytorch,Pre Trained Model,我用4通道图像(RGBY)标记数据集。我想使用预训练分类模型(使用pytorch和ResNet50作为模型)。不过,所有的pytorch型号都适用于3个通道。 因此,问题是:如何使用3通道预训练模型来处理4通道数据?我将以下一种方式加载模型: 导入torchvision.models作为模型 resnet50=models.resnet50(pretrained=True) 您可以修改CNN的第一层,使其需要4个输入通道,而不是3个。在您的例子中,第一层是resnet50.conv1。因此: i

我用4通道图像(RGBY)标记数据集。我想使用预训练分类模型(使用
pytorch
和ResNet50作为模型)。不过,所有的pytorch型号都适用于3个通道。 因此,问题是:如何使用3通道预训练模型来处理4通道数据?我将以下一种方式加载模型:

导入torchvision.models作为模型
resnet50=models.resnet50(pretrained=True)

您可以修改CNN的第一层,使其需要4个输入通道,而不是3个。在您的例子中,第一层是
resnet50.conv1
。因此:

import torchvision.models as models
resnet50 = models.resnet50(pretrained=True)

# modify first layer so it expects 4 input channels; all other parameters unchanged
resnet50.conv1 = torch.nn.Conv2d(4,64,kernel_size = (7,7),stride = (2,2), padding = (3,3), bias = False) 

# test
inp = torch.rand([1,4,512,512])
resnet50.eval()
resnet50.training = False
out = resnet50(inp) # should evaluate without error
这种变化的简单性是通过以下实现细节实现的:对于2D卷积(对于其他维度卷积也是如此),Pyrotch为每个期望的输出平面(特征映射)和每个输入平面卷积一个内核。这将导致n_输入_平面x n_输出_平面总特征贴图(在本例中分别为4和64)。Pytorch然后对每个输出平面的所有输入平面求和,得到n个输出平面的总和,而不考虑输入平面的数量


好消息是,这意味着您可以添加额外的输入平面(贴图),而无需修改第一层之后的网络。其中(可能在某些情况下)不利的部分是,对所有输入特征映射的处理是相同的,并且在第一次卷积结束时,每个特征映射的信息都被完全合并。在某些情况下,可能需要在开始时以不同的方式处理输入特征映射,在这种情况下,您需要定义两个单独的CNN分支,以便在每一层中不将特征添加到一起。

您可以修改CNN的第一层,使其期望4个输入通道,而不是3个。在您的例子中,第一层是
resnet50.conv1
。因此:

import torchvision.models as models
resnet50 = models.resnet50(pretrained=True)

# modify first layer so it expects 4 input channels; all other parameters unchanged
resnet50.conv1 = torch.nn.Conv2d(4,64,kernel_size = (7,7),stride = (2,2), padding = (3,3), bias = False) 

# test
inp = torch.rand([1,4,512,512])
resnet50.eval()
resnet50.training = False
out = resnet50(inp) # should evaluate without error
这种变化的简单性是通过以下实现细节实现的:对于2D卷积(对于其他维度卷积也是如此),Pyrotch为每个期望的输出平面(特征映射)和每个输入平面卷积一个内核。这将导致n_输入_平面x n_输出_平面总特征贴图(在本例中分别为4和64)。Pytorch然后对每个输出平面的所有输入平面求和,得到n个输出平面的总和,而不考虑输入平面的数量


好消息是,这意味着您可以添加额外的输入平面(贴图),而无需修改第一层之后的网络。其中(可能在某些情况下)不利的部分是,对所有输入特征映射的处理是相同的,并且在第一次卷积结束时,每个特征映射的信息都被完全合并。在某些情况下,可能需要在开始时以不同的方式处理输入特征映射,在这种情况下,您需要定义两个单独的CNN分支,以便在每一层上不将特征添加到一起。

如果可以,您还可以使用
x[:,:,:,0]
删除第四维,如果可以,您也可以使用
x[:,:,:,0]
以这种方式删除第四维,或者您可以始终只更改第一个conv层中的in_通道:resnet50.conv1.in_通道=4我可以对vgg19执行完全相同的操作吗?我正在尝试,但是维度出现错误,但是VGG层名称不同。试试:
model.features[0]=torch.nn.Conv2d(4,64,kernel_size=(3,3),stride=(1,1),padding=(1,1))
这样做都可以,或者您总是可以只更改第一个conv层中的in_通道:resnet50.conv1.in_通道=4我可以对vgg19做完全相同的操作吗?我正在尝试,但是维度出现错误,但是VGG层名称不同。Try:
model.features[0]=torch.nn.Conv2d(4,64,内核大小=(3,3),步长=(1,1),填充=(1,1))