반응형

이 글은 ResNet의 skip connection 아이디어부터 Keras의 input_shape, EarlyStopping, he_normal initializer까지 딥러닝 실습 중 헷갈린 지점을 모은 메모입니다.

제목만 보면 ResNet 글처럼 보이지만, 실제 본문은 Keras 모델 구성과 입력 텐서 모양을 함께 다루므로 그 흐름에 맞춰 읽는 것이 좋습니다.

 

핵심 정리

ResNet의 핵심은 레이어를 깊게 쌓을 때 입력을 일부 경로로 건너뛰게 해 학습이 막히지 않도록 돕는 skip connection입니다. 본문은 여기에서 출발하지만, 실제로는 feature engineering, z-score, EarlyStopping, he_normal, Keras Sequential 모델, Dense 입력 모양, LSTM 입력 모양까지 이어지는 실습 메모입니다. 따라서 하나의 ResNet 설명 글이라기보다는 딥러닝 모델을 만들다가 자주 헷갈리는 설정을 모아둔 글로 보는 편이 정확합니다.

  • ResNet은 skip connection을 이용해 깊은 네트워크 학습을 돕는 구조입니다.
  • feature engineering과 z-score 같은 입력 정제는 모델 구조만큼 결과에 영향을 줄 수 있습니다.
  • he_normal은 ReLU 계열 활성화와 함께 자주 쓰이는 초기화 방법입니다.
  • Keras Dense 입력은 보통 샘플 수와 feature 수 형태로 이해하면 됩니다.
  • LSTM 입력은 샘플 수, 시간축, feature 차원처럼 순서 정보가 포함된 형태로 다룹니다.
  • predict는 예측값을 얻을 때, evaluate는 loss와 metric을 확인할 때 쓰는 흐름으로 구분할 수 있습니다.

원문 제목은 ResNet 하나만 가리켰지만 본문은 Keras 실습 노트 전체에 가깝습니다. 이번 수정은 제목과 첫 문단을 실제 내용에 맞춰 넓혀, 방문자가 기대한 내용과 본문 사이의 어긋남을 줄였습니다.

이어서 볼 글

 

네트워크에 변경을 가하는 것 보다 인풋노드를 어떻게 정제해서 사용하는가 하는 피쳐엔지니어링? 이 훨씬중요함을 발견함

z-score 사용이라는 신기한 기법을 배움

ResNet

스킵하는 라인을 뚫는 기법 (그래서 굉장히 딥하게 쌓을 수 있다는 특징이 나오는거 같다)

https://www.analyticsvidhya.com/blog/2017/08/10-advanced-deep-learning-architectures-data-scientists/

위 링크에 나온 설명이 좋은 것 같다.

이 링크도 꼭읽어보자 여러모로 좋은 내용이 들어 있는 것 같다.

EarlyStopping

여기보면 잘나와있음

initializer

he_normal

normal로 했을때 수렴이 잘 안되는데 he_normal로만 바꾸었는데 잘되는 케이스가 있었다.

he_normal에 대해서는 여기 논문 참조

기본 사용법

https://keras.io/getting-started/sequential-model-guide/


model = Sequential()  # 걍 써준다.
input_node_cnt = 30
layer1_node_cnt = 1000
layer2_node_cnt = 128
output_node_cnt = 6
model.add(Dense(layer1_node_cnt, activation='relu', input_shape=(input_node_cnt,)))
model.add(Dense(output_node_cnt, activation='sigmoid'))
model.add(Dense(output_node_cnt, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])

헷갈릴 수 있는거는.. input_shape에다가는 input_node_cnt를 먼저적어주는데, 실제로 fit()에 들어갈 인풋의 경우는 ndarray기준으로 다음처럼 (개수, input_node_cnt)로 보인다는 점이다.

predict() vs evaluate() vs predict_classes()

여기 잘 정리돼 있다.

예측된 Y값이 필요할땐 predict를 쓰고

accuracy나 loss를 측정하고 싶을 때는 evalute를 쓴다.

predict_classes()는 predict랑 같은데 argmax()한 인덱스가 나오는 것 같다.

즉 predicted[0]이 [0.1, 0.2, 0.7] 이라면 predicted_classes[0]는 2가 된다.

LSTM

LSTM에서는 인풋의 모양이 좀 달라야 한다. 게다가 Embedding이라는 요소도 들어가는 경우가 있다. 살펴보자.

여기에 따르면 다음처럼 이해할 수 있다고 한다.

Dense의 경우는 nparray기준 (nb_samples, input_node_cnt)형태의 데이터가 input으로 들어가는데..

LSTM의 경우는 (nb_samples, timestep, input_dim)형태의 데이터가 input으로 들어간다.

> 예를 들어 1000개의 문장이 있고, 각 문장은 10개의 단어로 이루어 져 있으며, 각 단어는 3개의 숫자로 이루어진 벡터라고 하면

> (1000, 10, 3)이 되는 것

** 다시말하면 Dense에서 단순히 전체 input_node_cnt가 얼마라고 주는 방식에서.. 몇개씩 끊어서 생각할지 힌트를 준다고 보면 될듯 **

** Dense로 위에걸 준다고 하면 (1000, 30)이 되어서 word구분 없이 떡이 되었을테니 말이야 **

실제로 코드 형태로 보면

Dense의 경우 다음처럼 되는데


model.Add(Dense(first_layer_node_cnt, input_shape=(input_node_cnt, )))

LSTM의 경우 다음처럼 된다.


model.Add(LSTM(first_layer_node_cnt, input_shape=(time_step, input_dim, )))

stacking

stacking을 하려면 아래처럼 return_sequences=True를 반드시 줘야 한댄다.


# to stack recurrent layers, you must use return_sequences=True
# on any recurrent layer that feeds into another recurrent layer.
# note that you only need to specify the input size on the first layer.
model = Sequential()
model.add(LSTM(64, input_dim=64, input_length=10, return_sequences=True))
model.add(LSTM(32, return_sequences=True))
model.add(LSTM(10))

batch normalization

relu같은 경우에 output이 무한대로 커질수 있는데.. 이걸 0~1 사이의 값으로 normalize 해주는거라는 느낌을 받았다.

정확한 개념은 아래 논문 디비바야할듯

https://shuuki4.wordpress.com/2016/01/13/batch-normalization-%EC%84%A4%EB%AA%85-%EB%B0%8F-%EA%B5%AC%ED%98%84/

https://keras.io/layers/normalization/

논문: https://arxiv.org/pdf/1502.03167.pdf

instance normalization

배울게 자꾸 늘어간다 ㅠ

batch normalization 비슷한 개념인거 같은데 스타일 트랜스퍼에 쓰이는것 같다는 느낌을 받았다.

논문: https://arxiv.org/pdf/1607.08022.pdf

여기에 보면 다음처럼 설명 나와있다.

> As discussed in the paper Instance Normalization: The Missing Ingredient for Fast Stylization by Dmitry Ulyanov, Andrea Vedaldi, and Victor Lempitsky, replacing batch normalization with instance normalization significantly improves the quality of feedforward style transfer models.

추가할 내용 들

xor sample

concatenate, merge 관련..차이점?

rnn에서 인풋 차원이 왜 늘어나야 하는지 기술

cnn하는 방법

lstm에서 embedding layer 쓰는 법

반응형

+ Recent posts