save the world

2주차 본문

Deep Learning Diary

2주차

함안조씨 2018. 1. 22. 14:10

<2018.01.22.월>

Step Size
Step size를 N/2회까지는 alpha로 하고 0.75N까지는 alpha/10로하고 N까지는 alpha/100으로 한다. 이렇게 step size를 유동적으로 만들면 처음에 Stochastic Gradient Descent의 랜덤성으로 인한 효과로 대략적인 수렴구간을 찾게되고 이후 값이 진동하는 것을 막기위해 step size를 줄인다.

tf.train.exponential_decay 라는 함수가 있으나 점차적으로 줄어들수만 있고 원하는 지점에서 stepSize를 바꿀 수 없기 때문에 if문을 사용하여 stepSize를 바꾸었다.

BatchSize
BatchSize가 현재 20개 밖에 되지 않기 때문에 그 수를 늘여야 하는데 그러기 위해서는 latent이미지의 크기와 kernel의 크기를 줄이는 것이 어떤가 생각해본다. 왜냐하면 MNIST에서는 28 x 28 크기의 이미지 128개를 하나의 배치로 두고 학습시키는데 이때 픽셀의 모든 개수는 28*28*128 = 100,352개가 나온다. 현재 내 모델의 픽셀개수는 140 x 140 이미지에 BatchSize 20으로 총 
392,000 개로 GPU가 수용할 수 있는 용량의 최대치에 와있는 듯 하다. (BatchSize를 21로 하면 ran out of GPUmemory... 이라는 메세지가 뜸) 그러므로 메모리 부족현상을 방지하기 위해서 latent이미지의 크기를 줄인다.

예전모델의 Latent Batch에서 현재모델 Latent Batch로 이미지크기를 100 x 100으로 랜덤 crop 한 뒤 커널에의해 손실된 영역을 제거한 크기는 60 x 60으로 두 배 이상 작아졌으므로 BatchSize를 20에서 64로 늘릴 수 있었다.

DenseNet IDEA
레이어의 구조가 (컨볼루션 + ReLu) x 4 + DropOut 밖에 없어 매우 단순하므로 복잡한 Deblurring 문제가 해결이 되지 않는것인가에 대한 의심이 들기 시작하였으므로 BatchNormalization도 추가하고 DenseNet(tf.layer.dense 라는 기능이 있음)의 아이디어도 추가해볼까 하였다.
우선 DenseNet의 아이디어보다 대부분의 경우에 성능을 향상시키는 BatchNormalization 부터 적용시켜보는 것이 좋을 것 같았다.

<2018.01.24.수>

Pixel Softmax method
오늘 회의에서 언급된 이야기로 DenseNet과 ResNet을 Deblurring 네트워크에 적용하려고 했으나 이들은 Classification을 목적으로 만들어진 네트워크이므로 Regression 문제에 적합하지 않고 VGG-Net이 Regression 문제에 좋을 수 있다고 교수님이 말씀하셨다. 왜냐하면 지금 내가 가진 Deblurring 문제의 cost는 layer의 최종 output인 60 x 60의 이미지와 
60 x 60의 label (latent)이미지 간의 Mean Square Error를 계산한 값이므로 Regression [ mean(output - label)^2 ] 문제로 볼 수 있다. 그러나 이 문제를 다르게 생각하여 만약 네트워크 모델이 Input으로 이미지를 받아 출력으로 가운데 픽셀의 밝기값인 0~ 255중 하나의 값을 출력하는 Classification 문제로 본다면 DenseNet 과 ResNet을 잘 활용할 수 있지 않을까 하는 생각이 들었으며 괜찮은 방법이라는 쪽으로 이야기가 모아졌다.

Cost값 Tensorboard로 확인하기
C:\Users\VML1>D:
D:\>cd Users\VML1\PycharmProjects\TensorFlow-Tutorials-master
D:\Users\VML1\PycharmProjects\TensorFlow-Tutorials-master>activate tensorflow
(tensorflow) D:\Users\VML1\PycharmProjects\TensorFlow-Tutorials-master>tensorboard --logdir=./logs/nn_logs
TensorBoard 0.4.0rc3 at http://VML1:6006 (Press CTRL+C to quit)

Window의 CMD창에서 위의 코드처럼 입력하고 인터넷 주소창에 "localhost:6006"을 입력하면 텐서보드창이 뜬다.
첫번째 줄은 log가 있는 폴더로 가기위해 디렉토리를 C에서 D 드라이브로 변경한 것이고.
두번재 줄은 log가 있는 경로 직전까지 간 것 이다.
세번째 줄은 텐서플로우를 활성화시킨 것이며.
네번재 줄은 텐서보드를 실행시키는 동작이며 두번째줄에서 "튜토리얼"폴더까지 이동했으므로 현재까지의 경로에서 logs/nn_logs 로 들어가면 로그파일이 있다는 것을 알려주는 것이다.
이후에 localhost:6006을 인터넷 주소창에서 실행하면 보드가 실행된다.

tensorboard를 사용하기 위한 코드는 TensorFlow-Tutotials-master를 참고하였다.

1, 2, 3, 17, 18, 24, 25, 26 번째줄이 tensorboard를 사용하기위해 추가한 명령어들이며 18번째와 26번째는 그려지는 그래프의 인덱스값을 주기위함이었다. (인덱스값 제대로 안주니까 그래프가 엉망이 됨.)
tf.summary.scalar("cost", cost) 는 cost 값을 "cost"라는 이름의 스칼라 값으로 준비시켜둔다(텐서보드에 올라가기 전 단계)는 의미로 해석된다.
tf.summary.scalar("cost", cost) 는 predict_op 값을 "predict_op"라는 이름의 스칼라 값으로 준비시키는 것.
merged = tf.summary.merge_all()는 이 모든 준비한 값을 병합시킨다는 의미로 해석되며 나중에 sess.run([merged])에서 실행된다. 이는 summary로 저장되고 이를 writer.add_summary(summary[k])로 각각의 summary된 값들을 k 인덱스에 표현하는 것으로 보인다.


참고로 17번째 줄을 실행하면서 log 파일이 업데이트가 된다.
아래는 그래프를 띄워 캡쳐한 화면이다.

위의 cost는 매 학습 때 마다 측정한 cost이다. 즉 한 번 training하고 한 번 prediction하는 것을 반복한 결과. (학습이 아예 되지않는 것으로 보임.)

'Deep Learning Diary' 카테고리의 다른 글

6주차  (0) 2018.02.19
4주차  (0) 2018.02.06
3주차  (0) 2018.01.31
1주차  (0) 2018.01.18
정리  (0) 2017.09.26