데알못정을

신경망 특정 layer 결과 값 출력하기 본문

Coding

신경망 특정 layer 결과 값 출력하기

쩡을이 2022. 10. 3. 17:21
728x90

신경망에서 특정 layer의 결과 값을 출력할 수 있다. 최근 신경망 관련 연구를 하다가, 신경망의 각 layer의 결과 값이 input data 대비 어떻게 representation 되는지 확인하기 위해 이 작업이 필요 했다.

[전체 코드]

class MLPclassifier(nn.Module):
    def __init__(self, input_size, drop_rate):
        super(MLPclassifier, self).__init__()
        self.input_size = input_size
        
        layer1 = [nn.Linear(input_size, 39),
                   nn.BatchNorm1d(39),
                   nn.Dropout(drop_rate),
                   nn.ReLU()]
        
        layer2 = [nn.Linear(39, 72),
                   nn.BatchNorm1d(72),
                   nn.Dropout(drop_rate),
                   nn.ReLU()]
        
        layer3 = [nn.Linear(72, 129),
                   nn.BatchNorm1d(129),
                   nn.Dropout(drop_rate),
                   nn.ReLU()]
        
        layer4 = [nn.Linear(129, 111),
                   nn.BatchNorm1d(111),
                   nn.Dropout(drop_rate),
                   nn.ReLU()]
        
        
        layer5 = [nn.Linear(111, 1),
                   nn.Sigmoid()]
    
       

        
        self.first_layer = nn.Sequential(
            *layer1
        )
        
        self.second_layer = nn.Sequential(
            *layer2
        )
        
        
        self.third_layer = nn.Sequential(
            *layer3
        )
        
        
        self.fourth_layer = nn.Sequential(
            *layer4
        )
        
        self.last_layer = nn.Sequential(
            *layer5
        )
        


    def forward_first(self,x): 
        x = self.first_layer(x)
        return x
    
    def forward_second(self,x):
        x = self.second_layer(x)
        return x
    
    def forward_third(self,x):
        x = self.third_layer(x)
        return x
    
    def forward_fourth(self,x):
        x = self.fourth_layer(x)
        return x
    
    def forward_last(self,x):
        x = self.last_layer(x)
        return x

    
    def forward(self, x, path='all'):
        
        if path =='all':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            x = self.forward_last(x)
            
        elif path == 'first':
            x = self.forward_first(x)
            
        elif path == 'second':
            x = self.forward_first(x)
            x = self.forward_second(x)
            
        elif path == 'third':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            
        elif path == 'fourth':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            
        elif path == 'last':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            x = self.forward_last(x)
            
        else:
            raise NotImplementedError
            
        return x

각각의 layer를 따로 선언하고 이를 forward 함수에 잘 연계해주면 된다.

아래의 코드를 보면 forward 함수에 path라는 인자를 넣어주고 출력하기를 원하는 layer를 선언해주면 원하는 layer의 출력 값을 얻을 수 있다.

    def forward(self, x, path='all'):
        
        if path =='all':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            x = self.forward_last(x)
            
        elif path == 'first':
            x = self.forward_first(x)
            
        elif path == 'second':
            x = self.forward_first(x)
            x = self.forward_second(x)
            
        elif path == 'third':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            
        elif path == 'fourth':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            
        elif path == 'last':
            x = self.forward_first(x)
            x = self.forward_second(x)
            x = self.forward_third(x)
            x = self.forward_fourth(x)
            x = self.forward_last(x)
            
        else:
            raise NotImplementedError
            
        return x

이렇게 코드를 짜고나서 원하는 그림을 그릴 수 있었다. 실제로 layer 별로 값이 어떻게 representation 되는지 확인할 수 있었다.

 

728x90
Comments