2017-02-27 8 views
21

में मॉडल सारांश क्या कोई तरीका है, मैं पीरटोर में एक मॉडल का सारांश प्रिंट कर सकता हूं जैसे model.summary() विधि केरस में विधि निम्नानुसार है?pytorch

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 
+0

आप state_dict() मॉड्यूल पर विधि को देखा है ?? यह आपको मॉडल के विभिन्न मानकों देता है। कोई प्रत्यक्ष सारांश विधि नहीं है, लेकिन कोई राज्य_डिक्ट() विधि – Kashyap

उत्तर

22

जबकि एक अच्छा visualizaton देता द्वारा script उल्लेख कर सकते हैं नहीं है आपको मॉडल के बारे में विस्तृत जानकारी नहीं मिलेगी जैसा कि केरास मॉडल.summary में है, बस मॉडल को प्रिंट करने से आपको अलग-अलग परतों और उनके विनिर्देशों के बारे में कुछ जानकारी मिल जाएगी।

उदाहरण के लिए:

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) 
) 
) 

अब तुम सकता है, के रूप में Kashyap से उल्लेख किया है, state_dict विधि का उपयोग का भार प्राप्त करने के लिए:

from torchvision import models 
model = models.vgg16() 
print(model) 

इस मामले में उत्पादन कुछ इस प्रकार होगा विभिन्न परतें। लेकिन परतों की इस सूची का उपयोग करने से शायद अधिक दिशा प्रदान की जाएगी कि केरास मॉडल सारांश की तरह प्राप्त करने के लिए एक सहायक कार्य बना रहा है! उम्मीद है की यह मदद करेगा!

1

Afak कोई model.summary() pytorch में बराबर की तरह

इस बीच आप szagoruyko है, जो की तरह resnet18-example

चीयर्स में

10

यह मॉडल के वजन और पैरामीटर दिखाएगा (लेकिन आउटपुट आकार नहीं)।

from torch.nn.modules.module import _addindent 
import torch 
import numpy as np 
def torch_summarize(model, show_weights=True, show_parameters=True): 
    """Summarizes torch model by showing trainable parameters and weights.""" 
    tmpstr = model.__class__.__name__ + ' (\n' 
    for key, module in model._modules.items(): 
     # if it contains layers let call it recursively to get params and weights 
     if type(module) in [ 
      torch.nn.modules.container.Container, 
      torch.nn.modules.container.Sequential 
     ]: 
      modstr = torch_summarize(module) 
     else: 
      modstr = module.__repr__() 
     modstr = _addindent(modstr, 2) 

     params = sum([np.prod(p.size()) for p in module.parameters()]) 
     weights = tuple([tuple(p.size()) for p in module.parameters()]) 

     tmpstr += ' (' + key + '): ' + modstr 
     if show_weights: 
      tmpstr += ', weights={}'.format(weights) 
     if show_parameters: 
      tmpstr += ', parameters={}'.format(params) 
     tmpstr += '\n' 

    tmpstr = tmpstr + ')' 
    return tmpstr 

# Test 
import torchvision.models as models 
model = models.alexnet() 
print(torch_summarize(model)) 

# # Output 
# AlexNet (
# (features): Sequential (
#  (0): Conv2d(3, 64, kernel_size=(11, 11), stride=(4, 4), padding=(2, 2)), weights=((64, 3, 11, 11), (64,)), parameters=23296 
#  (1): ReLU (inplace), weights=(), parameters=0 
#  (2): MaxPool2d (size=(3, 3), stride=(2, 2), dilation=(1, 1)), weights=(), parameters=0 
#  (3): Conv2d(64, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2)), weights=((192, 64, 5, 5), (192,)), parameters=307392 
#  (4): ReLU (inplace), weights=(), parameters=0 
#  (5): MaxPool2d (size=(3, 3), stride=(2, 2), dilation=(1, 1)), weights=(), parameters=0 
#  (6): Conv2d(192, 384, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)), weights=((384, 192, 3, 3), (384,)), parameters=663936 
#  (7): ReLU (inplace), weights=(), parameters=0 
#  (8): Conv2d(384, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)), weights=((256, 384, 3, 3), (256,)), parameters=884992 
#  (9): ReLU (inplace), weights=(), parameters=0 
#  (10): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)), weights=((256, 256, 3, 3), (256,)), parameters=590080 
#  (11): ReLU (inplace), weights=(), parameters=0 
#  (12): MaxPool2d (size=(3, 3), stride=(2, 2), dilation=(1, 1)), weights=(), parameters=0 
# ), weights=((64, 3, 11, 11), (64,), (192, 64, 5, 5), (192,), (384, 192, 3, 3), (384,), (256, 384, 3, 3), (256,), (256, 256, 3, 3), (256,)), parameters=2469696 
# (classifier): Sequential (
#  (0): Dropout (p = 0.5), weights=(), parameters=0 
#  (1): Linear (9216 -> 4096), weights=((4096, 9216), (4096,)), parameters=37752832 
#  (2): ReLU (inplace), weights=(), parameters=0 
#  (3): Dropout (p = 0.5), weights=(), parameters=0 
#  (4): Linear (4096 -> 4096), weights=((4096, 4096), (4096,)), parameters=16781312 
#  (5): ReLU (inplace), weights=(), parameters=0 
#  (6): Linear (4096 -> 1000), weights=((1000, 4096), (1000,)), parameters=4097000 
# ), weights=((4096, 9216), (4096,), (4096, 4096), (4096,), (1000, 4096), (1000,)), parameters=58631144 
#) 

संपादित करें:

print(model) 

यह भी काम करते हैं: isaykatsman एक model.summary() कि वास्तव में keras https://github.com/pytorch/pytorch/pull/3043/files

+0

ग्रेट कोड का उपयोग करके एक बना सकता है! क्या आपने यह लिखा है? – acgtyrant

+1

धन्यवाद, हाँ :)। मैंने मशाल __repr__ से उधार लिया लेकिन इसे रिकर्सिव बना दिया और कैरस जैसी अधिक जानकारी दी। – wassname

+0

अद्यतन कोड: https://gist.github.com/wassname/0fb8f95e4272e6bdd27bd7df386716b7/ – wassname

0

सरल (नहीं पर सुंदर Keras के रूप में) को याद करने की तरह है जोड़ने के लिए एक pytorch पीआर है:

repr(model) 

यदि आप केवल पैरामीटर की संख्या चाहते हैं:

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

से: Is there similar pytorch function as model.summary() as keras? (forum.PyTorch.org)

संबंधित मुद्दे