0


计算模型的GFLOPs和参数量 & 举例VGG16和DETR

近期忙于写论文,分享一下论文中表格数据的计算方法。

一、FLOPS、FLOPs和GFLOPs的概念

  • FLOPS:注意S是大写,是 “每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。
  • FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
  • GFLOPs:一个GFLOPs等于每秒十亿(=10^9)次的浮点运算

二、计算VGG16的GFLOPs和参数量

  1. from thop import profile
  2. import torch
  3. import torchvision.models as models
  4. model = models.vgg16()
  5. device = torch.device("cuda:0"if torch.cuda.is_available() else"cpu")
  6. model.to(device)
  7. input = torch.zeros((1, 3, 224, 224)).to(device)
  8. flops, params = profile(model.to(device), inputs=(input,))
  9. print("参数量:", params)
  10. print("FLOPS:", flops)

>>>output

参数量: 138357544.0
FLOPS: 15470314496.0

三、计算DETR的GFLOPs和参数量

  1. 首先,访问网址:GitHub - facebookresearch/detr: End-to-End Object Detection with Transformers
  2. 然后,下载DETR源码压缩包,调通源码。
  3. 最后,把下面的代码封装到py文件中,放到DETR源码的根目录即可。
  1. import os
  2. import time
  3. from PIL import Image
  4. import matplotlib.pyplot as plt
  5. import torch
  6. import torchvision.transforms as T
  7. torch.set_grad_enabled(False)
  8. from models import build_model
  9. import argparse
  10. from torch.nn.functional import dropout,linear,softmax
  11. def get_args_parser():
  12. parser = argparse.ArgumentParser('Set transformer detector', add_help=False)
  13. parser.add_argument('--lr', default=1e-4, type=float)
  14. parser.add_argument('--lr_backbone', default=1e-5, type=float)
  15. parser.add_argument('--batch_size', default=1, type=int)
  16. parser.add_argument('--weight_decay', default=1e-4, type=float)
  17. # parser.add_argument('--epochs', default=300, type=int)
  18. parser.add_argument('--epochs', default=100, type=int)
  19. parser.add_argument('--lr_drop', default=200, type=int)
  20. parser.add_argument('--clip_max_norm', default=0.1, type=float,
  21. help='gradient clipping max norm')
  22. # Model parameters
  23. parser.add_argument('--frozen_weights', type=str, default=None,
  24. help="Path to the pretrained model. If set, only the mask head will be trained")
  25. # * Backbone
  26. parser.add_argument('--backbone', default='resnet50', type=str,
  27. help="Name of the convolutional backbone to use")
  28. parser.add_argument('--dilation', action='store_true',
  29. help="If true, we replace stride with dilation in the last convolutional block (DC5)")
  30. parser.add_argument('--position_embedding', default='sine', type=str, choices=('sine', 'learned'),
  31. help="Type of positional embedding to use on top of the image features")
  32. # * Transformer
  33. parser.add_argument('--enc_layers', default=6, type=int,
  34. help="Number of encoding layers in the transformer")
  35. parser.add_argument('--dec_layers', default=6, type=int,
  36. help="Number of decoding layers in the transformer")
  37. parser.add_argument('--dim_feedforward', default=2048, type=int,
  38. help="Intermediate size of the feedforward layers in the transformer blocks")
  39. parser.add_argument('--hidden_dim', default=256, type=int,
  40. help="Size of the embeddings (dimension of the transformer)")
  41. parser.add_argument('--dropout', default=0.1, type=float,
  42. help="Dropout applied in the transformer")
  43. parser.add_argument('--nheads', default=8, type=int,
  44. help="Number of attention heads inside the transformer's attentions")
  45. parser.add_argument('--num_queries', default=40, type=int,
  46. help="Number of query slots") # 论文中对象查询为100
  47. parser.add_argument('--pre_norm', action='store_true')
  48. # * Segmentation
  49. parser.add_argument('--masks', action='store_true',
  50. help="Train segmentation head if the flag is provided")
  51. # Loss
  52. parser.add_argument('--no_aux_loss', dest='aux_loss', action='store_false',
  53. help="Disables auxiliary decoding losses (loss at each layer)")
  54. # * Matcher
  55. parser.add_argument('--set_cost_class', default=1, type=float,
  56. help="Class coefficient in the matching cost")
  57. parser.add_argument('--set_cost_bbox', default=5, type=float,
  58. help="L1 box coefficient in the matching cost")
  59. parser.add_argument('--set_cost_giou', default=2, type=float,
  60. help="giou box coefficient in the matching cost")
  61. # * Loss coefficients
  62. parser.add_argument('--mask_loss_coef', default=1, type=float)
  63. parser.add_argument('--dice_loss_coef', default=1, type=float)
  64. parser.add_argument('--bbox_loss_coef', default=5, type=float)
  65. parser.add_argument('--giou_loss_coef', default=2, type=float)
  66. parser.add_argument('--eos_coef', default=0.1, type=float,
  67. help="Relative classification weight of the no-object class")
  68. # dataset parameters
  69. parser.add_argument('--dataset_file', default='coco')
  70. parser.add_argument('--coco_path', default='', type=str)
  71. parser.add_argument('--coco_panoptic_path', type=str)
  72. parser.add_argument('--remove_difficult', action='store_true')
  73. parser.add_argument('--output_dir', default='E:\project_yd\paper_sci_one_yd\Transformer\DETR\detr\\runs\\train',
  74. help='path where to save, empty for no saving')
  75. parser.add_argument('--device', default='cuda',
  76. help='device to use for training / testing')
  77. parser.add_argument('--seed', default=42, type=int)
  78. # ============================================================================= #
  79. parser.add_argument('--resume', default='', help='resume from checkpoint')
  80. # ============================================================================= #
  81. parser.add_argument('--start_epoch', default=0, type=int, metavar='N',
  82. help='start epoch')
  83. parser.add_argument('--eval', action='store_true')
  84. parser.add_argument('--num_workers', default=2, type=int)
  85. # distributed training parameters
  86. parser.add_argument('--world_size', default=1, type=int,
  87. help='number of distributed processes')
  88. parser.add_argument('--dist_url', default='env://', help='url used to set up distributed training')
  89. return parser
  90. if __name__ == '__main__':
  91. parser = argparse.ArgumentParser('DETR training and evaluation script', parents=[get_args_parser()])
  92. args = parser.parse_args()
  93. # 建立模型
  94. model, criterion, postprocessors = build_model(args)
  95. model.to('cuda:0')
  96. url = r'detr-r50-dc5-f0fb7ef5.pth'
  97. state_dict = torch.load(url)
  98. # print(state_dict)
  99. # 加载模型参数,以字典的形式表示
  100. model.load_state_dict(state_dict['model'])
  101. model.eval() # 把字符串类型转换成字典类型
  102. # ==================================================== #
  103. from thop import profile
  104. import torchsummary
  105. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  106. model.to(device)
  107. input = torch.zeros((1, 3, 800, 1422)).to(device)
  108. flops, params = profile(model.to(device), inputs=(input,))
  109. print("参数量:", params)
  110. print("FLOPS:", flops)
  111. # ==================================================== #

>>> output

参数量: 36739785.0
FLOPS: 100937364480.0

四、整理数据表格

ModelGFLOPsParamsVGG1615.4713.84 MDETR100.9436.74 M

如有疑问,欢迎评论区一起探讨!


本文转载自: https://blog.csdn.net/qq_54185421/article/details/127396361
版权归原作者 Flying Bulldog 所有, 如有侵权,请联系我们删除。

“计算模型的GFLOPs和参数量 & 举例VGG16和DETR”的评论:

还没有评论