Hi, I have the following snippet in Unet structure:
class DoubleConv(nn.Module):
def __init__(self,in_channels, out_channels, mid_channels=None):
super(DoubleConv,self).__init__()
if not mid_channels:
mid_channels = out_channels
self.d_conv = nn.Sequential(
nn.Conv2d(in_channels,mid_channels,kernel_size=3, padding=1),
nn.BatchNorm2d(mid_channels),
nn.ReLU(inplace=True),
nn.Conv2d(mid_channels,out_channels,kernel_size=3,padding=1),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True))
def forward(self,x):
## The spatial dim is not changed: (out_dim, h,w)
return(self.d_conv(x))
class Up(nn.Module):
"""Upscaling then double conv"""
def __init__(self,in_channels, out_channels, bilinear=True):
super(Up,self).__init__()
# if bilinear, use the normal convelutions to reduce the number of channels if bilinear:
self.up = nn.Upsample(scale_factor=2,mode='bilinear', align_corners=True)
# here we devide the number of filters
self.conv = DoubleConv(in_channels,out_channels,in_channels//2)
else:
self.up = nn.ConvTranspose2d(in_channels,in_channels//2,kernel_size=2,stride=2)
self.conv = DoubleConv(in_channels,out_channels)
def forward(self,x1,x2):
x1 = self.up(x1)
print(x1.size())
# input is CHW
diffy = x2.size()[2] - x1.size()[2]
diffx = x2.size()[3]- x1.size()[3]
x1 = to_pil_image(x1)
x1 = F.pad(x1, [diffx // 2, diffx - diffx // 2,diffy // 2, diffy - diffy // 2])
x1= to_tensor(x1)
x = torch.cat([x2, x1], dim=1)
return(self.conv(x))
But when I run it to two random tensors, I get two errors:
First: img should be PIL Image. Got <class ‘torch.Tensor’>
while in documentation of pytorch.org it was written that torchvision.transforms.functional.pad
can be applied on both PIL and Tensor images.
When I change the tensors in PIL then I get an error in dimension. While in pytorch.org I read that it dose not matter what dimension you have , just it is important we have […, h,w]. In the following when I put tensors if dimension [batch_num, c,h,w] it gives me the error of size 4 that should be 2 or 3 and when I omit the batch_num from the tensors it returns an error of dimension again.
x2 = torch.randn(1,3,130,130)
x1 = torch.randn(1,3,126,126)
upp = Up(3,32,True)
result = upp(x1,x2)
Error:
ValueError: pic should be 2/3 dimensional. Got 4 dimensions.