[모두의 딥러닝] NN, ReLu, Xavier, Dropout, and Adam
📗강의노트/모두의 딥러닝

[모두의 딥러닝] NN, ReLu, Xavier, Dropout, and Adam

728x90
반응형

Sung Kim 님의 "모두의 딥러닝" 강의노트입니다

좋은 강의 감사드립니다!

https://www.youtube.com/watch?v=mQGwjrStQgg&list=PLlMkM4tgfjnLSOjrEJN31gZATbcj_MpUm&index=5


기존의 softmax로 진행했을 때이다. 

cost를 구할 때 tf.nn.softmax_cross_entropy_with_logits를 사용하여 더 간편하게 하였다. 
또한 이제 GradientDescentOptimizer를 사용하지 않고 AdamOptimizer를 사용하였다. 

여기에 ReLU를 이용하여 Layer를 더 쌓아준다. 마지막 단에서 hypothesis를 구성할 때는 그냥 tf.matmul만을 이용한다. 
더욱 더 향상된 94%의 정확도를 보인다.


여기서 Xavier initialize를 해준다. tf.get_variable을 통해 변수를 선택하거나 만든다. 여기서 두 번 저 라인을 실행하게 되면 “이미 존재하는 변수”라고하면서 실행이 되지 않는다. 그 때에는 
## tf.get_variable_scope().reuse_variables()
# get_variable 재사용 하고 싶을 뗴
## tf.get_variable_scope().reuse == False
# 재사용 막을 때
# 혹은
## tf.reset_default_graph()

등을 상황에 맞게 사용하여 방지하면 된다. 코드의 앞에 tf.reset_default_graph()를 붙이는 것이 해결방법이 되는 것이다. 

그래서 Xavier를 했을 때 기존의 tf.random_normal ( normal dist )에 비해 더 좋은 성능을 보인다!

이를 더 깊고 넓게 쌓는다고 좋아지는 것은 아니다!

네트워크가 깊어지면 모델이 “ Overfitting “ 문제를 보인다. 모델이 학습데이터를 그냥 다 기억해버려서 새로운 test데이터에 대해 성능이 나빠지는 것이다. 


-> 이를 방지하기 위해서 Dropout을 이용한다. (Keep_prob : 네트워크중 몇 개나 유지할지 )  train에서는 0.5~0.7 / 테스트에서는 무조건 “ 1 “ => 학습 때는 쉬어도 testing때는 총동원하여야한다. 그래서 placeholder로 지정후 이후 feed_dict를 통해 다른 값들을 넣어준다.   

통상적으로 Adam으로 시작한다. 사용은 기존 GradientDescent와 똑같이 쓰면 된다. 

Exercise : Batch Normalization ( 최근들어서 사용 입력값을 Normaliize하는 것 )

무조건 batch normalization을 해줘야한다!


728x90
반응형