Notice
<aside> 💡 CodeOnWeb에서는 따로 파이썬을 설치하지 않더라도 코드박스 아래의 실행 버튼을 클릭하여 바로 파이썬 코드를 실행해볼 수 있습니다. TensorFlow, Theano와 같은 백엔드 코드도 마찬가지로 설치 없이 실행 버튼만 눌러 실행할 수 있습니다. 'Keras 연습하기' 과정에서는 실행 결과까지 출력하는 예제 코드에 대해서만 실행하여 결과를 확인할 수 있도록 하였습니다.
</aside>
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>}},
}
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'
다음은 Keras를 정확하게 이용하기 위해 제대로 알고 이해할 필요가 있는 일반적인 정의입니다:
fit
메소드와 evaluation_data
혹은 evaluation_split
을 사용할 경우, 평가는 매 epoch의 끝에 수행됩니다.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]