fully convolutional network는 어떻게 임의의 input size에서 동작하게 만들었을까?

1. 어떻게 하면 임의의 size에도 동작할 수 있을까?

 

기존 네트워크의 마지막 단인 fully connected layer 대신에 1*1 convolutional layer로 구성하여 가능하게 만들었다

 

기존 네트워크의 경우는 마지막이 fully connected layer로 linear layer니까 vector 형태로 나와서 class에 대한 확률분포를 구해주기에 적절했다면

 

fully convolutional network는 convolutional layer이므로 activation map을 출력하여 각 pixel에 속하는 classification 결과를 알 수 있게 해준다.

 

 

2. 1*1 convolution layer의 성질

 

기존 네트워크의 문제점은 output이 하나의 벡터로 나와 이미지 map의 pixel classification을 하기에 부족하다

 

물론 input 이미지 size에 따라 벡터 크기도 달라지므로 input 이미지 size도 고정되어야한다는 것도 문제다.

 

 

이미지의 pixel들이 한 줄의 벡터로 섞여 이미지 전체의 class를 분류하기에는 적절해도 개별 pixel 분류하기에는 부적절하다

 

사실 이렇게 벡터로 만들어도 pixel classification이 불가능한 것은 아니다.

 

어떻게 하면 pixel마다 classification을 할 수 있도록 만들수 있을까?

 

activation map에서 각 pixel 채널축으로 여러개의 flatten vector를 만들면 충분하다

 

그리고 그 flatten vector마다 fully connected를 전부 해서 class 분류를 한다면 pixel classification이 fully connected layer로도 가능하다

 

 

map에서 각 pixel부분에 대하여 채널축으로 벡터를 만드는 것이다

 

그렇다면 그림에서는 9개의 pixel channel vector를 만들 수 있을 것이다

 

그런데 사실 이 연산 어디서 본 것 같지는 않은가?

 

1*1 convolutional filter로 convolution 연산을 하는 것과 동일하다

 

fully connected layer로 할때는 (예시에서는 9개) 여러개의 벡터 각각을 출력하여 각각 pixel classification해야했는데

 

1*1 convolution filter는 spatial dimension을 유지하여 하나의 feature map으로 출력시켜주므로

 

단 한번만에 모든 pixel의 classification까지 가능하다

 

 

1*1 convolutional filter을 사용하면 각 pixel 위치의 채널축 flatten vector를 하나의 점으로 그 위치 그대로 가져온다

 

특히 filter가 m개면 결과도 m개의 채널을 가지는 map으로 출력된다

 

따라서 fully connected layer는 1*1 convolutional layer로 해석이 가능하면서(그래서 바꿀 수 있었다)

 

심지어 어떠한 입력사이즈가 들어와도 가능하고 단 1번에 모든 pixel classification도 가능하다

 

 

TAGS.

Comments