Real Late Starter

[PyTorch] 3. nn & nn.functional 본문

PyTorch

[PyTorch] 3. nn & nn.functional

조슈아박 2020. 1. 22. 21:00

이번 포스트에서는 pytroch에서 사용하는 패키지에 대해서 알아보겠습니다.

torch.nn torch.nn.functional

Parameters

Dropout

Conv

Containers

Sparse

Pooling

Conv

Distance

Non-linear activation

Pooling

Loss

Normalization

Padding

Vision

Linear function(=fully connected layer)

Non-linear Activation

Data Paralles

Dropout

Normalization

Utilities

Distance

Recurrent

 

Loss

Linear

 

Vision

1. torch.nn

1) torch.nn.Conv2d

torch.nn.Conv2d를 사용해서 하나의 컨볼루션 레이어를 생성할 수 있다.

torch.nn.Conv2d은 weight값을 직접 설정해주지 않는다는 특징이 있다.

필요한 파라미터를 설정하게 되면 Conv2d를 진행하기 위한 weight를 자동으로 선언해준다. 

# class
torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,
				bias=True)

- in_channels : 들어가는 이미지의 채널

- out_channles : 나오는 이미지의 채널 (사용하고자하는 필터의 갯수)

- kernel_size : 필터의 사이즈

- bias : 필터에 붙어있는 bias값을 줄 것인가에 대한 파라미터

 

3x3 Conv2d (nn.Conv2d)

 

.

nn.Conv2d(1,1,3) # (input_channels, output_channels, kernel_size)

# 1채널이 들어가서 1채널이 나오는데 그것을 연산하는 kernel의 크기는 3 by 3이다.

nn을 통해 conv2d 층을 만들어보겠습니다. input을 선언하고 Variable까지 선언을 해줍니다. 여기서 사용하고자하는 함수를

func에 저장합니다. func가 가지고있는 weight값을 출력해보면 위와 같이 나타난다.

input을 func에 입력으로 넣어주게되면 out은 다음과 같이 출력된다. 하지만 실제로 이 연산을 실행해보면 설정한 weight값과

out에서 나온 값과 다르다. 값이 다른 이유는 이 nn.Conv2d는 자동으로 bias value를 가지고 있고 bias value가 추가가 되어야 out과 같이 출력값이 나오는 것이다.

5x5에서 3x3으로 conv2d

 

 위의 예제에서는 nn.Conv2d를 사용해서 weight값을 직접 설정하는 방법을 사용해보았다. 추후에 직접 Layer를 만들고 다른

Network에서 pre-trained된 weight값을 집어넣어야하는 경우, 4번째 코드 블럭 처럼 filter의 weight 값을 직접 설정해줄 수가 있다.

 

2. torch.nn.functional

torch.nn.functional은 torch.nn이 지원하는 기능과 유사한 점이 있지만 사용하는 방식의 차이가 있다.

 

1) torch.nn.functional.conv2d

torch.nn.functional.conv2d(input,weight,bias=None,stride=1,padding=0,dilation=1,groups=1)

functional.conv2d은 앞서 살펴본 nn.Conv2d에서 input_channel과 output_channel을 사용해서 연산했던 것과 달리

input과 weight자체를 직접 넣어줘야한다. 그렇기 때문에 weight에 외부에서 직접 만든 filter를 넣어줘야한다. 그 외에 채워야하는 파라미터들은 nn.Conv2d와 비슷하다.

 

 

3x3 Conv2d (functional)

 

input 선언과 함께 필터를 설정해준다. 필터가 weight가 되는 형태이다.

input를 Variable로 선언해준다. 또한 backward를 위해 requires_grad = True를 선언해준다.

마찬가지로 filter도 Variable 선언을 해준다.

out으로 F.conv2d사용하여 input과 filter를 넣어주게되면 out을 출력했을 때 원하는 결과가 나오게 된다.

마지막으로 out을 backward를 시켜주고 out.grad_fn를 출력하면 MkldnnConvolutionBackward라고 나타난다.

input.grad를 출력하면 저장된 input의 gradient값을 확인할 수가 있다.

 

위의 예제와 비슷하지만 filter에 elementwise로 1을 더하여 2로 만들었을 때, 결과값들이 어떻게 나오는지 확인해 보겠습니다.

결과는 18이 출력이된다.

 

3. ReLU, sigmoid, tanh, MaxPooling, AvgPooling

다음은 활성화 함수와 Pooling의 사용법에 대해 알아보겠습니다.

가장 많이 사용하는 활성화 함수로는 Sigmoid, tanh, Relu 등이 있습니다. 

 

- ReLU

Relu를 사용하게 되면 0 이하의 값들은 모두 0으로 변환되고 0 이상의 값들만 남게 됩니다.

 

다음으로는 Maxpooling을 하게되면 2 x 2 텐서가 나오게됩니다.

그 후에 시그모이드 활성화함수를 사용하여 출력을 해보면 함수에 맞게 활성화되어 텐서가 바뀐 모습을 볼 수 있다.

 

그 다음 tanh함수를 사용하여 또 텐서 내의 값들을 변경해주고 마지막으로 Average Pooling을 통해 하나의 값으로 출력한 과정입니다.