2017-11-13 3 views

답변

1

주어진 모델에서 정방향 통과를 재정의하는 새 클래스를 만들어야한다고 생각합니다. 그러나 대부분의 경우 모델의 아키텍처와 관련된 코드를 만들어야합니다. 여기에 예제가 있습니다 :

class extract_layers(): 

    def __init__(self, model, target_layer): 
     self.model = model 
     self.target_layer = target_layer 

    def __call__(self, x): 
     return self.forward(x) 

    def forward(self, x): 
     module = self.model._modules[self.target_layer] 

     # get output of the desired layer 
     features = module(x) 

     # get output of the whole model 
     x = self.model(x) 

     return x, features 


model = models.vgg19(pretrained=True) 
target_layer = 'features' 
extractor = extract_layers(model, target_layer) 

image = Variable(torch.randn(1, 3, 244, 244)) 
x, features = extractor(image) 

이 경우, 나는 pytorch models zoo에 주어진 사전 정의 된 vgg19 네트워크를 사용하고 있습니다. 네트워크는 두 개의 모듈로 구성되며, 길쌈 부분은 features이고 완전 연결 부분은 classifier입니다. 이 경우, features은 네트워크의 모든 길쌈 레이어를 래핑하기 때문에 직선적입니다. 당신이 연결 층의 출력을 바꿀 필요가 당신이 염두에 두어야한다, 또한

for name, module in self.model._modules.items(): 
    x = module(x) # forward the module individually 
    if name in self.target_layer: 
     features = x # store the output of the desired layer 

: 아키텍처가 서로 다른 이름을 가진 여러 레이어가있는 경우, 당신은이 비슷한을 사용하여 출력을 저장해야합니다 길쌈 부분에서 완전 연결 부분까지. 해당 레이어의 이름을 알고 있으면 쉽게 수행 할 수 있습니다.