Fat*_*Boi 1 python image-processing computer-vision deep-learning pytorch
所以,我有一个 U-Net 模型,我将 5000x5000x3 的图像输入到模型中,然后我得到了上面的错误。
所以这是我的模型。
import torch
import torch.nn as nn
def double_conv(in_channels, out_channels):
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(out_channels, out_channels, 3, padding=1),
nn.ReLU(inplace=True)
)
class UNeT(nn.Module):
def __init__(self, n_class):
super().__init__()
self.dconv_down1 = double_conv(3, 64)
self.dconv_down2 = double_conv(64, 128)
self.dconv_down3 = double_conv(128, 256)
self.dconv_down4 = double_conv(256, 512)
self.maxpool = nn.MaxPool2d(2)
self.upsample = nn.Upsample(scale_factor=2, mode='bilinear',
align_corners=True)
self.dconv_up3 = double_conv(256 + 512, 256)
self.dconv_up2 = double_conv(128 + 256, 128)
self.dconv_up1 = double_conv(128 + 64, 64)
self.conv_last = nn.Conv2d(64, n_class, 1)
def forward(self, x):
conv1 = self.dconv_down1(x)
x = self.maxpool(conv1)
conv2 = self.dconv_down2(x)
x = self.maxpool(conv2)
conv3 = self.dconv_down3(x)
x = self.maxpool(conv3)
x = self.dconv_down4(x)
x = self.upsample(x)
x = torch.cat([x, conv3], dim=1)
x = self.dconv_up3(x)
x = self.upsample(x)
x = torch.cat([x, conv2], dim=1)
x = self.dconv_up2(x)
x = self.upsample(x)
x = torch.cat([x, conv1], dim=1)
x = self.dconv_up1(x)
out = self.conv_last(x)
return out
Run Code Online (Sandbox Code Playgroud)
我试图做模型(inputs.unsqueeze_(0)) 但我得到了一个不同的错误。
pytorch 中的维度顺序与您期望的不同。您的输入张量shape将4x5000x5000x3其解释为一批 size 4,带有5000x5000像素图像,每个像素有 3 个通道。也就是说,您的维度是batch- height- width- channel。
但是,pytorch 期望张量维度采用不同的顺序:batch- channel- height- width。也就是说,channel维度应该在宽度和高度空间维度之前。
您需要permute输入张量的尺寸来解决您的问题:
model(inputs.permute(0, 3, 1, 2))
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅nn.Conv2d.