보통 대부분의 pretrained model(VGG, inception, ResNet,..)의 경우, colored image를 염두에 두고 학습을 진행하여 weight 및 bias를 얻었다. 즉, input 이미지 shape이 반드시 (224,224,3)등 3 channel(R,G,B)를 포함해야 한다는 것이다.
그래서 1 channel인 이미지를 pretrained model에 input으로 넣으려고 하면 다음과 같은 에러를 낸다.
WARNING:tensorflow:Model was constructed with shape (None, 150, 150, 3) for input Tensor("input_7:0", shape=(None, 150, 150, 3), dtype=float32), but it was called on an input with incompatible shape (None, 300, 300, 1).
그렇다면 gray scaling한 이미지는 어떻게 학습시킬 수 있을까?
gray scaling한 이미지를 위해서 이미 학습된 모델의 첫 layer를 channel 3에서 channel 1으로 수정 해야할까? 그렇게 한다면 에러는 없어지겠지만, pretrained model을 사용하는 것이 아니게 된다. 이미 고정된 layer로 weight와 bias를 얻었는데 그 레이어를 수정해버리면 얻어진 weight 및 bias가 의미가 없어지기 때문이다. 또한, 수정된 layer로 학습시키려면 이미 pretrained model을 사용하는 것이 아니기도 하다.
보통의 경우 다음의 방법을 제시한다. 첫 번째로, RGB로 변환하는 방법, 두 번째로, input layer를 pretrained model전에 추가하는 방법, 그리고 마지막 세 번째로 RGB처럼 3channel로 만들기.
1. RGB로 변환하기
애초부터 RGB가 아닌 gray image였다면 생각해볼 수 있는 방법이다. 하지만 이미지 전처리 단계에서 일부로 연산량을 줄이던가하는 이득을 위해 gray scaling했다면 원래 RGB였던 것을 gray scale하고 다시 RGB로 돌리는 것은 듣는 사람으로 하여금 고개를 갸우뚱하게 한다.
2. input layer를 pretrained model전에 하나 더 추가하기
제목 그대로 channel 1인 이미지를 input으로 받아서 3 channel로 만드는 convolution 연산을 제일 처음 layer로 하고 그 다음에 pretrained model을 지정하는 것이다.
3. RGB처럼 3channel로 만들기
사실상 제일 많이 사용하는 방법인 것 같다. 원래 1채널만 있는 이미지를 그 채널 그대로 복사해서 3개의 채널에 붙여넣기하는 것이다.
0 댓글