Python pytorch中的模型摘要

Python pytorch中的模型摘要,python,pytorch,Python,Pytorch,如何在PyTorch中打印模型摘要,就像Keras中的model.summary()方法一样: Model Summary: ____________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to

如何在PyTorch中打印模型摘要,就像Keras中的
model.summary()
方法一样:

Model Summary:
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input_1 (InputLayer)             (None, 1, 15, 27)     0                                            
____________________________________________________________________________________________________
convolution2d_1 (Convolution2D)  (None, 8, 15, 27)     872         input_1[0][0]                    
____________________________________________________________________________________________________
maxpooling2d_1 (MaxPooling2D)    (None, 8, 7, 27)      0           convolution2d_1[0][0]            
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 1512)          0           maxpooling2d_1[0][0]             
____________________________________________________________________________________________________
dense_1 (Dense)                  (None, 1)             1513        flatten_1[0][0]                  
====================================================================================================
Total params: 2,385
Trainable params: 2,385
Non-trainable params: 0

虽然您不会像Keras的model.summary中那样获得关于模型的详细信息,但简单地打印模型将让您了解所涉及的不同层及其规格

例如:

from torchvision import models
model = models.vgg16()
print(model)
本例中的输出如下所示:

VGG (
  (features): Sequential (
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU (inplace)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU (inplace)
    (4): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU (inplace)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU (inplace)
    (9): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU (inplace)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU (inplace)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU (inplace)
    (16): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU (inplace)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU (inplace)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU (inplace)
    (23): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU (inplace)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU (inplace)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU (inplace)
    (30): MaxPool2d (size=(2, 2), stride=(2, 2), dilation=(1, 1))
  )
  (classifier): Sequential (
    (0): Dropout (p = 0.5)
    (1): Linear (25088 -> 4096)
    (2): ReLU (inplace)
    (3): Dropout (p = 0.5)
    (4): Linear (4096 -> 4096)
    (5): ReLU (inplace)
    (6): Linear (4096 -> 1000)
  )
)

现在,如所述,您可以使用
state\u dict
方法获得不同层的权重。但使用这个层列表可能会提供更多的方向,即创建一个帮助函数来获得类似于Keras的模型摘要!希望这有帮助

这将显示模型的权重和参数(但不显示输出形状)

编辑:isaykatsman有一个pytorch PR来添加一个与keras完全相似的
model.summary()
,最容易记住(不像keras那么漂亮):

这项工作还包括:

repr(model)
如果只需要参数的数量:

sum([param.nelement() for param in model.parameters()])

From:

是的,您可以使用该软件包获得精确的Keras表示

VGG16的示例:

from torchvision import models
from torchsummary import summary

vgg = models.vgg16()
summary(vgg, (3, 224, 224))

----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv2d-1         [-1, 64, 224, 224]           1,792
              ReLU-2         [-1, 64, 224, 224]               0
            Conv2d-3         [-1, 64, 224, 224]          36,928
              ReLU-4         [-1, 64, 224, 224]               0
         MaxPool2d-5         [-1, 64, 112, 112]               0
            Conv2d-6        [-1, 128, 112, 112]          73,856
              ReLU-7        [-1, 128, 112, 112]               0
            Conv2d-8        [-1, 128, 112, 112]         147,584
              ReLU-9        [-1, 128, 112, 112]               0
        MaxPool2d-10          [-1, 128, 56, 56]               0
           Conv2d-11          [-1, 256, 56, 56]         295,168
             ReLU-12          [-1, 256, 56, 56]               0
           Conv2d-13          [-1, 256, 56, 56]         590,080
             ReLU-14          [-1, 256, 56, 56]               0
           Conv2d-15          [-1, 256, 56, 56]         590,080
             ReLU-16          [-1, 256, 56, 56]               0
        MaxPool2d-17          [-1, 256, 28, 28]               0
           Conv2d-18          [-1, 512, 28, 28]       1,180,160
             ReLU-19          [-1, 512, 28, 28]               0
           Conv2d-20          [-1, 512, 28, 28]       2,359,808
             ReLU-21          [-1, 512, 28, 28]               0
           Conv2d-22          [-1, 512, 28, 28]       2,359,808
             ReLU-23          [-1, 512, 28, 28]               0
        MaxPool2d-24          [-1, 512, 14, 14]               0
           Conv2d-25          [-1, 512, 14, 14]       2,359,808
             ReLU-26          [-1, 512, 14, 14]               0
           Conv2d-27          [-1, 512, 14, 14]       2,359,808
             ReLU-28          [-1, 512, 14, 14]               0
           Conv2d-29          [-1, 512, 14, 14]       2,359,808
             ReLU-30          [-1, 512, 14, 14]               0
        MaxPool2d-31            [-1, 512, 7, 7]               0
           Linear-32                 [-1, 4096]     102,764,544
             ReLU-33                 [-1, 4096]               0
          Dropout-34                 [-1, 4096]               0
           Linear-35                 [-1, 4096]      16,781,312
             ReLU-36                 [-1, 4096]               0
          Dropout-37                 [-1, 4096]               0
           Linear-38                 [-1, 1000]       4,097,000
================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.57
Forward/backward pass size (MB): 218.59
Params size (MB): 527.79
Estimated Total Size (MB): 746.96
----------------------------------------------------------------

为模型类定义对象后,只需打印模型即可

class RNN(nn.Module):
    def __init__(self, input_dim, embedding_dim, hidden_dim, output_dim):
        super().__init__()

        self.embedding = nn.Embedding(input_dim, embedding_dim)
        self.rnn = nn.RNN(embedding_dim, hidden_dim)
        self.fc = nn.Linear(hidden_dim, output_dim)
    def forward():
        ...

model = RNN(input_dim, embedding_dim, hidden_dim, output_dim)
print(model)

要使用torchsummary类型:

from torchsummary import summary
如果没有,请先安装它

pip install torchsummary 
然后您可以尝试它,但请注意,由于某种原因,除非我将model设置为cuda
alexnet.cuda
,否则它不会工作:

from torchsummary import summary
help(summary)
import torchvision.models as models
alexnet = models.alexnet(pretrained=False)
alexnet.cuda()
summary(alexnet, (3, 224, 224))
print(alexnet)
摘要
必须采用输入大小,并且批大小设置为-1表示我们提供的任何批大小

如果我们设置了
summary(alexnet,(32224224),32)
这意味着使用
bs=32

summary(model, input_size, batch_size=-1, device='cuda')

输出:

你可以用

from torchsummary import summary
您可以指定设备

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
您可以创建一个网络,如果您使用的是MNIST数据集,那么以下命令将起作用并向您显示摘要

model = Network().to(device)
summary(model,(1,28,28))

使用torchsummary的Keras类模型摘要:

from torchsummary import summary
summary(model, input_size=(3, 224, 224))
(以前的
torchsummary
)包生成与Keras1类似的输出(对于给定的输入形状):2


来自torchinfo导入摘要的

model=ConvNet()
批量大小=16
摘要(型号,输入尺寸=(批次尺寸,1,28,28)
==========================================================================================
图层(类型:深度idx)输出形状参数#
==========================================================================================
├─Conv2d(conv1):1-1[5,10,24,24]260
├─Conv2d(conv2):1-2[5,20,8,8]5020
├─辍学2d(conv2_drop):1-3[5,20,8,8]--
├─线性(fc1):1-4[5,50]16050
├─线性(fc2):1-5[5,10]510
==========================================================================================
总参数:21840
可培训参数:21840
不可训练参数:0
总乘数加总(M):7.69
==========================================================================================
输入大小(MB):0.05
向前/向后传递大小(MB):0.91
参数大小(MB):0.09
估计总大小(MB):1.05
==========================================================================================

注意事项:

  • Torchinfo提供了与PyTorch中的
    print(您的_型号)
    提供的信息互补的信息,类似于Tensorflow的
    model.summary()

  • 与Keras不同,PyTorch具有一个可适应多个调用中的任何兼容输入形状,例如任何足够大的图像大小(用于完全卷积网络)

    因此,它不能为每个层提供一组固有的输入/输出形状,因为这些形状依赖于输入,以及为什么在上述包中必须指定输入尺寸


  • summary(my_model,(3,224,224),device='cpu')
    将解决这个问题。

    您看到模块上的state_dict()方法了吗?它为您提供了模型的不同参数。没有直接的summary方法,但是可以使用state_dict()来形成一个方法方法所选答案现已过时,
    torchsummary
    是更好的解决方案。
    torchsummary
    已过时。请使用TylerYep提供的
    torchinfo
    找到解决方案。
    摘要(model.cuda(),(INPUT_SHAPE))
    有效。大家好。我是新手,但我如何知道模型所需的输入形状?3224224对所有模型都是真的吗?@adikshit,这是网络输入的尺寸,在本例中是来自ImageNet数据集的224x224 RGB图像,因此是(3224224)。更一般地说,对于2D输入,形状是(C、H、W)其中C=通道,H=高度,W=宽度,对于1D输入,它将是(C,L),其中C=通道,L=长度。此软件包的更新版本可以在相同的用法中找到,但不同的pip安装。
    torchsummary
    已失效。请使用TylerYepHow中的
    torchinfo
    这与三(3)不同吗上面建议使用
    torchsummary
    torchsummary
    的旧答案已失效。请使用TyleryEPTH中的
    torchinfo
    ,PR已关闭。
    torchsummary
    已失效。请使用TyleryEPTH中的
    torchinfo
    无效。
    summary
    既不是PyTorch,也不是Python函数。
    from torcinfo导入摘要
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    model = Network().to(device)
    summary(model,(1,28,28))
    
    from torchsummary import summary
    summary(model, input_size=(3, 224, 224))