sovrasov / flops-counter.pytorch

Flops counter for convolutional networks in pytorch framework
MIT License
2.83k stars 306 forks source link

How to work with two input or more #122

Closed DachunKai closed 1 year ago

DachunKai commented 1 year ago

I have the following code:

class Siamese(nn.Module):
    def __init__(self):
        super(Siamese, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, 3, 1)
        self.conv2 = nn.Conv2d(1, 10, 3, 1)

    def forward(self, x1, x2):
        return self.conv1(x1) + self.conv2(x2)

def prepare_input(resolution):
    x1 = torch.FloatTensor(1, *resolution)
    x2 = torch.FloatTensor(1, *resolution)
    return dict(x1 = x1), dict(x2 = x2)

if __name__ == '__main__':
    model = Siamese()
    flops, params = get_model_complexity_info(model, input_res=(1, 224, 224), 
                                              input_constructor=prepare_input,
                                              as_strings=True, print_per_layer_stat=False)
    print('      - Flops:  ' + flops)
    print('      - Params: ' + params)

But it seems prepare_input not work.

sovrasov commented 1 year ago

@DachunKai do you experience similar issue as in https://github.com/sovrasov/flops-counter.pytorch/issues/117 ?

DachunKai commented 1 year ago

@sovrasov I think my issue is not same as you mentioned. My bug information is:

Exception has occurred: TypeError
unsupported operand type(s) for //: 'NoneType' and 'int'
  File "./test_temp.py", line 24, in <module>
    as_strings=True, print_per_layer_stat=False)
TypeError: unsupported operand type(s) for //: 'NoneType' and 'int'
DachunKai commented 1 year ago

@sovrasov The complete test_temp.py is:

import torch
import torch.nn as nn
from ptflops import get_model_complexity_info

class Siamese(nn.Module):
    def __init__(self):
        super(Siamese, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, 3, 1)
        self.conv2 = nn.Conv2d(1, 10, 3, 1)

    def forward(self, x1, x2):
        return self.conv1(x1) + self.conv2(x2)

def prepare_input(resolution):
    x1 = torch.FloatTensor(1, *resolution)
    x2 = torch.FloatTensor(1, *resolution)
    return dict(x1 = x1), dict(x2 = x2)

if __name__ == '__main__':
    model = Siamese()
    flops, params = get_model_complexity_info(model, input_res=(1, 224, 224),
                                              input_constructor=prepare_input,
                                              as_strings=True, print_per_layer_stat=False)
    print('      - Flops:  ' + flops)
    print('      - Params: ' + params)
sovrasov commented 1 year ago

@sovrasov I think my issue is not same as you mentioned. My bug information is:

Exception has occurred: TypeError
unsupported operand type(s) for //: 'NoneType' and 'int'
  File "./test_temp.py", line 24, in <module>
    as_strings=True, print_per_layer_stat=False)
TypeError: unsupported operand type(s) for //: 'NoneType' and 'int'

Then could you try ptflops==0.7.1.2 ?

sovrasov commented 1 year ago

Please also change dict(x1 = x1), dict(x2 = x2) -> dict(x1 = x1, x2 = x2)

DachunKai commented 1 year ago

Thanks, it solves the problem.

Please also change dict(x1 = x1), dict(x2 = x2) -> dict(x1 = x1, x2 = x2)