VGG-19는 이렇게 생겼다.
tf.keras.applications.VGG19(include_top=False 한줄로 불러올 수 있다.
style loss를 구하는 코드는 위와 같다. Correlation을 구하기 위해 filter output 행렬을 자기 자신의 전치행렬과 곱연산을 한 후 squared-error를 구한다. 총 5개의 error에 대해 0.2씩의 가중치를 곱한 후 더해 total style loss를 구한다.
논문을 읽으면서 궁금했던 점은 왜 제일 깊은 layer에서 content reconstruction을 하지 않는가 였다. 좋은 성능의 image classifier가 content를 잘 분리해내기 때문에 그 당시 논문에서 VGG를 가져다가 쓴 것인데, VGG의 성능을 완전히 사용하려면 모든 layer를 거친 후에 content를 reconstruction 하는게 낫지 않을까?
block5_pool layer에서 content를 뽑아내 보겠다.
결과는 위와 같다. 마지막 layer에서는 feature들이 너무 추상화되기 때문에 비슷한 모습이 거의 남아있지 않다.
block5_conv1에서 뽑아낸 content는 위와 같다.
block4_conv1에서 뽑아낸 content이다. 이 정도가 artistic한 이미지를 만들기 위해 적절한 깊이인 듯 하다.
모나리자와 섞으면 이런 느낌이다.
이번엔 별이 빛나는 밤에를 사용해서 만들어 보았다.
이번엔 톰 크루즈와 피카소이다.
위의 결과물들을 보면 style loss의 가중치가 조금 낮아서 미술 작품 느낌이 조금 덜 한듯 하다.
style loss를 높이면 이런 양상을 보인다.
learning rate는 최초 0.02에서 시작해서 loss가 진전이 없을 경우 0.1을 곱하였다. 이상하게 훈련 시에 loss가 너무 크게 나왔다(1e+20 이상). 학습은 잘 된 것으로 보인다.
구현하면서 느낀점은
1. VGG말고 더 뛰어난 classifier를 사용하면 어떨까 하는 생각이 있었는데, VGG조차 중간 layer까지만 사용하기 때문에 의미가 크게 없을 것 같다.
2. Pre-trained model을 사용할 수 있기 때문에 dataset을 준비하지 않아도 돼서 편하다.
3. 훌륭한 모델이지만, 새로운 데이터 쌍에 대해 매번 처음부터 학습을 시켜야 사용할 수 있기 때문에 이것을 개선한 연구가 있는지 알아보고 싶다.