I am working on Cardiac Ct images by implementing the 2DCNN model. I am trying to train vgg model. But every time I got this issue. I know this is related to layers as I am new in PyTorch I am not able to understand. If someone can guide me related to it
Here is the error and code. My torch.Size([2, 1, 65, 65]) I am using the dense-net model and it has the same torch.Size([2, 1, 65, 65]) and it’s working fine .
VGG_MODEL
Traceback (most recent call last):
File "ct_pretrained.py", line 201, in <module>
loss, metric = train(model, train_loader, optimizer)
File "ct_pretrained.py", line 59, in train
output = model(axial, sagittal, coronal, emr)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/data/heart_ct/torch/models/vgg.py", line 44, in forward
sagittal_feature = self.sa_co_model(sagittal)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/root/miniconda/lib/python3.8/site-packages/torchvision/models/vgg.py", line 43, in forward
x = self.features(x)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/container.py", line 117, in forward
input = module(input)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/module.py", line 727, in _call_impl
result = self.forward(*input, **kwargs)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/modules/pooling.py", line 153, in forward
return F.max_pool2d(input, self.kernel_size, self.stride,
File "/root/miniconda/lib/python3.8/site-packages/torch/_jit_internal.py", line 267, in fn
return if_false(*args, **kwargs)
File "/root/miniconda/lib/python3.8/site-packages/torch/nn/functional.py", line 585, in _max_pool2d
return torch.max_pool2d(
RuntimeError: Given input size: (512x1x3). Calculated output size: (512x0x1). Output size is too small
import torch
import torch.nn as nn
from torchvision import models
__all__ = ['Vgg']
class Vgg(nn.Module):
def __init__(self, is_emr=False, mode='sum'):
super().__init__()
self.is_emr = is_emr
self.mode = mode
in_dim = 45
self.axial_model = models.vgg13(pretrained=True)
out_channels = self.axial_model.features[0].out_channels
self.axial_model.features[0] = nn.Conv2d(1, out_channels, kernel_size=7, stride=1, padding=0, bias=False)
self.axial_model.features[3] = nn.MaxPool2d(1)
num_ftrs = self.axial_model.classifier[6].in_features
self.axial_model.classifier[6] = nn.Linear(num_ftrs, 15)
self.sa_co_model = models.vgg13(pretrained=True)
self.sa_co_model.features[0] = nn.Conv2d(1, out_channels, kernel_size=7, stride=1, padding=(3,0), bias=False)
self.sa_co_model.features[3] = nn.MaxPool2d(1)
num_ftrs = self.sa_co_model.classifier[6].in_features
self.sa_co_model.classifier[6] = nn.Linear(num_ftrs, 15)
if self.is_emr:
self.emr_model = EMRModel()
if self.mode == 'concat': in_dim = 90
self.classifier = Classifier(in_dim)
#print(self.classifier)
def forward(self, axial, sagittal, coronal, emr):
#print(axial.shape)
axial = axial[:,:,:-3,:-3]
sagittal = sagittal[:,:,:,:-3]
coronal = coronal[:,:,:,:-3]
axial_feature = self.axial_model(axial)
sagittal_feature = self.sa_co_model(sagittal)
coronal_feature = self.sa_co_model(coronal)
out = torch.cat([axial_feature, sagittal_feature, coronal_feature], dim=1)
out = self.classifier(out)
if self.is_emr:
emr_feature = self.emr_model(emr)
out += emr_feature
return axial_feature
class EMRModel(nn.Module):
def __init__(self):
super().__init__()
self.layer = nn.Sequential(
nn.Linear(7, 256),
nn.BatchNorm1d(256),
nn.LeakyReLU(negative_slope=0.2),
nn.Dropout(p=0.2, inplace=True),
nn.Linear(256, 256),
nn.BatchNorm1d(256),
nn.LeakyReLU(negative_slope=0.2),
nn.Dropout(p=0.2, inplace=True),
nn.Linear(256, 5),
)
def forward(self, x):
return self.layer(x)
class Classifier(nn.Module):
def __init__(self, in_dim):
super().__init__()
self.layer = nn.Sequential(
nn.Linear(in_dim, 5)
)
def forward(self, x):
return self.layer(x)
class ConvBN(nn.Module):
def __init__(self, in_dim, out_dim, **kwargs):
super().__init__()
self.layer = nn.Sequential(
nn.Conv2d(in_dim, out_dim, bias=False, **kwargs),
nn.BatchNorm2d(out_dim),
nn.LeakyReLU(negative_slope=0.2))
def forward(self, x):
return self.layer(x)
'''
if __name__ == "__main__":
images = torch.randn(2,1,65,65)
model = Vgg()
out = model(images,images,images)
model = models.vgg16(pretrained=True)
for k, v in model.state_dict().items():
print(k)
'''