-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Gradients and activations shape in the VIT example code #511
Comments
Did you resolve this issue? I have a similar problem: |
I have a similar problem, too. I tried to run it for DINOv2: File "/code/finetune-v2/visualize_gradcam.py", line 208, in gradcam_dataset
gradcam_one_img(img_path)
File "/code/finetune-v2/visualize_gradcam.py", line 152, in gradcam_one_img
grayscale_cam = cam(input_tensor=img_tensor, targets=targets)
File "/opt/conda/envs/dinov2/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 186, in __call__
return self.forward(input_tensor, targets, eigen_smooth)
File "/opt/conda/envs/dinov2/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 110, in forward
cam_per_layer = self.compute_cam_per_layer(input_tensor, targets, eigen_smooth)
File "/opt/conda/envs/dinov2/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 141, in compute_cam_per_layer
cam = self.get_cam_image(input_tensor, target_layer, targets, layer_activations, layer_grads, eigen_smooth)
File "/opt/conda/envs/dinov2/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 66, in get_cam_image
weights = self.get_cam_weights(input_tensor, target_layer, targets, activations, grads)
File "/opt/conda/envs/dinov2/lib/python3.9/site-packages/pytorch_grad_cam/grad_cam.py", line 23, in get_cam_weights
if len(grads.shape) == 4:
AttributeError: 'NoneType' object has no attribute 'shape' here is my code: class Dino(nn.Module):
def __init__(self, type, img_size, cls_num):
super().__init__()
# get feature model
model = torch.hub.load(
'', type, source='local'
).to(device)
autocast_ctx = partial(
torch.cuda.amp.autocast, enabled=True, dtype=torch.float16
)
self.feature_model = ModelWithIntermediateLayers(
model, n_last_blocks=1, autocast_ctx=autocast_ctx
).to(device)
with torch.no_grad():
sample_input = torch.randn(1, 3, *img_size).to(device)
sample_output = self.feature_model(sample_input)
# get linear readout
out_dim = create_linear_input(
sample_output, use_n_blocks=1, use_avgpool=True
).shape[1]
self.classifier = LinearClassifier(
out_dim, use_n_blocks=1, use_avgpool=True, num_classes=cls_num
).to(device)
def forward(self, x):
x = self.feature_model(x)
x = self.classifier(x)
return x
data_transforms = {
'train': transforms.Compose([
transforms.Resize(args.image_size),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
'val': transforms.Compose([
transforms.Resize(args.image_size),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
]),
}
model = Dino(args.arch, args.image_size, 2)
# print(model)
checkpoint_path = f'/code/finetune-v2/best_models/best_model_{model_name}.pth'
checkpoint = torch.load(checkpoint_path, map_location='cpu')
model.load_state_dict(checkpoint)
model.eval()
model = model.cuda()
target_layers = [model.feature_model.feature_model.blocks[-1].norm1]
# target_layers = [model.feature_model.feature_model.blocks[10]]
print(target_layers[0])
targets = [ClassifierOutputTarget(0)]
def reshape_transform(tensor):
result = tensor[:, 1:, :].reshape(tensor.size(0),
args.image_size[0] // 14, args.image_size[1] // 14, tensor.size(2))
# Bring the channels to the first dimension,
# like in CNNs.
result = result.transpose(2, 3).transpose(1, 2)
return result
def gradcam_one_img(img_path):
with GradCAM(model=model, target_layers=target_layers, reshape_transform=reshape_transform) as cam:
rgb_img = Image.open(img_path).convert('RGB')
img_tensor = data_transforms['val'](rgb_img).unsqueeze(0).cuda()
print(img_tensor.shape)
# outputs = model(img_tensor)
grayscale_cam = cam(input_tensor=img_tensor, targets=targets)
# grayscale_cam = cam(input_tensor=img_tensor, targets=targets)
grayscale_cam = grayscale_cam[0, :]
visualization = show_cam_on_image(rgb_img, grayscale_cam, use_rgb=True)
print(visualization)
return cam.outputs, visualization
gradcam_one_img(img_path) |
Hello, did you resolve this issue? I have a similar problem! |
I met the same problem!! |
I have the same problem, have you solved it? |
same problem |
I tried to run the vit example code, however, I noticed the following errors.
Python 3.9.18 (main, Sep 11 2023, 13:41:44)
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pytorch_grad_cam import GradCAM
>>> import torch
>>> model = torch.hub.load('facebookresearch/deit:main',
... 'deit_tiny_patch16_224', pretrained=True)
Using cache found in /home/.cache/torch/hub/facebookresearch_deit_main
>>> target_layers = [model.blocks[-1].norm1]
>>> image = torch.rand(1,3,224,224)
>>> cam = GradCAM(model=model, target_layers=target_layers)
>>> grayscale_cam = cam(input_tensor=image, targets=None)
(1, 197, 192)
Traceback (most recent call last):
File "", line 1, in
File "/data4/user/miniconda3/envs/anti-dreambooth/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 188, in call
return self.forward(input_tensor, targets, eigen_smooth)
File "/data4/user/miniconda3/envs/anti-dreambooth/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 112, in forward
cam_per_layer = self.compute_cam_per_layer(input_tensor, targets, eigen_smooth)
File "/data4/user/miniconda3/envs/anti-dreambooth/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 143, in compute_cam_per_layer
cam = self.get_cam_image(input_tensor, target_layer, targets, layer_activations, layer_grads, eigen_smooth)
File "/data4/user/miniconda3/envs/anti-dreambooth/lib/python3.9/site-packages/pytorch_grad_cam/base_cam.py", line 66, in get_cam_image
weights = self.get_cam_weights(input_tensor, target_layer, targets, activations, grads)
File "/data4/user/miniconda3/envs/anti-dreambooth/lib/python3.9/site-packages/pytorch_grad_cam/grad_cam.py", line 32, in get_cam_weights
raise ValueError("Invalid grads shape."
ValueError: Invalid grads shape.Shape of grads should be 4 (2D image) or 5 (3D image).
If I comment out the error throwing logic in grad_cam.py, then the shape check in
pytorch-grad-cam/pytorch_grad_cam/base_cam.py
Line 74 in 1ff3f58
Does the shape really matter? Is there a way to fix this or just work around it? Thanks!
pytorch '2.1.0+cu121', grad-cam 1.5.2, ubuntu 18.04
The text was updated successfully, but these errors were encountered: