1. Keras 소개
    1. [시작하기] Sequential 모델 가이드
    2. [시작하기] 함수형 API 가이드
    3. [시작하기] FAQ
    4. [모델] Keras의 모델
    5. [모델] 함수형 API
    6. [모델] Sequential
    7. [계층] Keras의 계층
    8. [계층] Core 계층
    9. [계층] 합성곱 계층
    10. [계층] 풀링 계층
    11. [계층] 부분적으로 연결된 계층
    12. [계층] 재발 계층
    13. [계층] 임베딩 계층
    14. [계층] Merge 계층
    15. [계층] 고급 활성화 계층
    16. [계층] 표준화 계층
    17. [계층] 노이즈 계층
    18. [계층] 계층 Wrappers
    19. [계층] 자신만의 Keras 계층 만들기
    20. [전처리] 시퀀스 전처리
    21. [전처리] 텍스트 전처리
    22. [전처리] 이미지 전처리
  2. Metrics
  3. 손실
  4. 최적화기
  5. 활성화
  6. Callbacks
  7. 데이터셋
  8. 애플리케이션
  9. 백엔드 1
  10. 백엔드 2
  11. 백엔드 3
  12. 백엔드 4
  13. 백엔드 5
  14. 초기화기
  15. 정규화기
  16. 제한
  17. 시각화
  18. Scikit-Learn API
  19. 유용한 도구

Keras FAQ: Keras에 대해 자주 묻는 질문들


Notice

<aside> 💡 CodeOnWeb에서는 따로 파이썬을 설치하지 않더라도 코드박스 아래의 실행 버튼을 클릭하여 바로 파이썬 코드를 실행해볼 수 있습니다. TensorFlow, Theano와 같은 백엔드 코드도 마찬가지로 설치 없이 실행 버튼만 눌러 실행할 수 있습니다. 'Keras 연습하기' 과정에서는 실행 결과까지 출력하는 예제 코드에 대해서만 실행하여 결과를 확인할 수 있도록 하였습니다.

</aside>

Keras를 어떻게 인용하면 되죠?

Keras가 연구에 도움이 되었다면 당신의 저작물에 인용해 주세요. 예를 들어 BibTeX 양식으로는 다음과 같습니다:

@misc{chollet2015keras,
  title={Keras},
  author={Chollet, Fran\\c{c}ois and others},
  year={2015},
  publisher={GitHub},
  howpublished={\\url{<https://github.com/fchollet/keras>}},
}

GPU에서 Keras를 어떻게 돌릴 수 있죠?

TensorFlow나 CNTK 백엔드에서 돌리고 있는 경우에 사용 가능한 GPU가 감지된다면 코드는 자동으로 GPU에서 돌아갈 겁니다.

Theano 백엔드에서 돌리고 있는 경우에는 다음과 같은 방법을 사용하세요:

방법 1: Theano flags를 사용합니다.

THEANO_FLAGS=device=gpu,floatX=float32 python my_keras_script.py

'gpu'라는 이름은 당신의 기기의 식별자에 따라 변경해야 할 수도 있습니다(예를 들어, gpu0, gpu1, 등등).

방법 2: .theanorc를 설정하세요: 설정 방법

방법 3: 다음과 같이 코드의 시작 부분에 직접 theano.config.device, theano.config.floatX을 설정해 주세요:

import theano
theano.config.device = 'gpu'
theano.config.floatX = 'float32'

"샘플", "batch", "epoch"가 무슨 뜻인가요?

다음은 Keras를 정확하게 이용하기 위해 제대로 알고 이해할 필요가 있는 일반적인 정의입니다:


Keras 모델을 어떻게 저장할 수 있나요?

전체 모델 저장하기/불러오기 (아키텍처 + 가중치 + 최적화기 상태)

Keras 모델을 저장하기 위해서는 pickle이나 cPickle을 사용하는 것을 추천합니다.

model.save(filepath)을 사용하여 Keras 모델을 다음과 같은 항목을 포함는 하나의 HDF5 파일에 저장할 수 있습니다:

모델을 다시 인스턴스화하기 위해 keras.models.load_model(filepath)을 사용할 수 있습니다. load_model은 저장된 훈련 구성을 사용하여 모델을 컴파일 할 수 있도록 합니다(원래의 모델이 컴파일된 적이 없지 않은 경우).

예제입니다:

from keras.models import load_model

model.save('my_model.h5')  # creates a HDF5 file 'my_model.h5'
del model  # deletes the existing model

# returns a compiled model
# identical to the previous one
model = load_model('my_model.h5')

모델의 아키텍처만 저장하기/불러오기

가중치나 훈련 구성은 빼고 모델의 아키텍처만 저장할 필요가 있을 때는, 다음과 같이 할 수 있습니다:

# save as JSON
json_string = model.to_json()

# save as YAML
yaml_string = model.to_yaml()

생성된 JSON / YAML 파일은 사람이 읽을 수 있고, 필요 시 직접 수성할 수 있습니다.

또한 이 데이터로 부터 다음과 같이 새로운 모델을 만들 수도 있습니다:

# model reconstruction from JSON:
from keras.models import model_from_json
model = model_from_json(json_string)

# model reconstruction from YAML
from keras.models import model_from_yaml
model = model_from_yaml(yaml_string)

모델의 가중치만을 저장하기/불러오기

모델의 가중치만을 저장할 필요가 있을 때는, 아래와 코드와 같이 HDF5 형식으로 할 수 있습니다.

다만, HDF5와 파이썬 라이브러리 h5py는 Keras와 같이 설치되지 않으므로 별도로 설치하여야 한다는 점에 주의하세요.

model.save_weights('my_model_weights.h5')

모델을 인스턴스화하는 코드가 있다고 한다면, 저장한 가중치를 동일한 아키텍처를 가진 모델에 불러와 적용할 수 있습니다.

model.load_weights('my_model_weights.h5')

상세 조정이나 이전-학습(transfer-learning)의 경우와 같이 다른 아키텍처를 가진(하지만 몇 개의 공유하는 계층을 가지는) 모델에 저장한 가중치를 불러와 사용할 필요가 있다면, 계층 이름을 통해 가중치를 불러와 사용할 수 있습니다.

model.load_weights('my_model_weights.h5', by_name=True)

예제입니다:

"""
Assuming the original model looks like this:
    model = Sequential()
    model.add(Dense(2, input_dim=3, name='dense_1'))
    model.add(Dense(3, name='dense_2'))
    ...
    model.save_weights(fname)
"""

# new model
model = Sequential()
model.add(Dense(2, input_dim=3, name='dense_1'))  # will be loaded
model.add(Dense(10, name='new_dense'))  # will not be loaded

# load weights from first model; will only affect the first layer, dense_1.
model.load_weights(fname, by_name=True)

저장된 모델의 사용자 지정 계층(혹은 다른 사용자 지정 객체) 다루기

불러오길 원하는 모델이 사용자 지정 계층이나 다른 사용자 지정 클래스, 함수 등을 포함하고 있다면, custom_objects 인수를 통해 불러오기 기능으로 넘길 수 있습니다:

from keras.models import load_model
# Assuming your model includes instance of an "AttentionLayer" class
model = load_model('my_model.h5', custom_objects={'AttentionLayer': AttentionLayer})

대신에, CustomObjectScope을 사용할 수도 있습니다:

from keras.utils import CustomObjectScope

with CustomObjectScope({'AttentionLayer': AttentionLayer}):
    model = load_model('my_model.h5')

사용자 지정 객체는 load_model, model_from_json, model_from_yaml와 같은 방법으로 다룰 수 있습니다:

from keras.models import model_from_json
model = model_from_json(json_string, custom_objects={'AttentionLayer': AttentionLayer})

훈련 손실은 시험 손실보다 왜 훨씬 큰가요?

Keras 모델은 두 가지 모드가 있습니다: 훈련 모드와 시험 모드. 탈락(Dropout), L1/L2 가중치 정규화(L1/L2 weight regularization)와 같은 정규화(Regularization) 메커니즘은 시험 모드에서는 꺼집니다.

게다가 훈련 손실은 훈련 데이터의 각 batch별 손실의 평균입니다. 모델이 점차 변화해 가기 때문에 한 epoch의 첫 번째 batch의 손실은 일반적으로 마지막 batch에 비해 큽니다. 반면에 한 epoch의 시험 손실은 epoch의 종료 지점과 동일한 모델을 사용하기 때문에 손실이 더 적습니다.


중간 계층의 출력을 어떻게 얻을 수 있죠?

한 가지 쉬운 방법은 관심 있는 계층을 출력하는 새로운 Model을 만드는 것입니다:

from keras.models import Model

model = ...  # create the original model

layer_name = 'my_layer'
intermediate_layer_model = Model(inputs=model.input,
                                 outputs=model.get_layer(layer_name).output)
intermediate_output = intermediate_layer_model.predict(data)

또는 다음과 같이 어떤 입력에 대해 어떤 계층의 출력을 반환하는 Kears 함수를 만들 수도 있습니다:

from keras import backend as K

# with a Sequential model
get_3rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[3].output])
layer_output = get_3rd_layer_output([x])[0]

유사하게, Theano와 TensorFlow 함수를 직접 만들 수도 있습니다.

모델이 훈련 모드와 시험 모드에서 다르게 동작하는 경우에(예를 들어 Dropout, atchNormalization 등을 사용하는 경우), 다음과 같이 함수에 훈련 모드 플래그를 넘겨주어야 하는 것에 주의하세요:

get_3rd_layer_output = K.function([model.layers[0].input, K.learning_phase()],
                                  [model.layers[3].output])

# output in test mode = 0
layer_output = get_3rd_layer_output([x, 0])[0]

# output in train mode = 1
layer_output = get_3rd_layer_output([x, 1])[0]