如何在PyTorch中打印模型摘要,像Keras中的model.summary()
那样:
模型摘要:____________________________________________________________________________________________________层 (类型) 输出形状 参数数 连接到 ====================================================================================================input_1 (输入层) (None, 1, 15, 27) 0 ____________________________________________________________________________________________________convolution2d_1 (二维卷积) (None, 8, 15, 27) 872 input_1[0][0] ____________________________________________________________________________________________________maxpooling2d_1 (二维最大池化) (None, 8, 7, 27) 0 convolution2d_1[0][0] ____________________________________________________________________________________________________flatten_1 (展平) (None, 1512) 0 maxpooling2d_1[0][0] ____________________________________________________________________________________________________dense_1 (全连接层) (None, 1) 1513 flatten_1[0][0] ====================================================================================================总参数: 2,385可训练参数: 2,385不可训练参数: 0
回答:
虽然你不会像Keras的model.summary那样获得关于模型的详细信息,简单地打印模型将为你提供一些关于所涉及的不同层及其规格的想法。
例如:
from torchvision import modelsmodel = 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_dict
方法来获取不同层的权重。但是,使用这种层的列表可能更有助于创建一个辅助函数来获得类似Keras的模型摘要!