Keras FAQ: Keras에 대해 자주 묻는 질문들
- Keras를 어떻게 인용하면 되죠?
- GPU에서 Keras를 어떻게 돌릴 수 있죠?
- "샘플", "batch", "epoch"가 무슨 뜻인가요?
- Keras 모델을 어떻게 저장할 수 있나요?
- 훈련 손실은 시험 손실보다 왜 훨씬 큰가요?
- 중간 계층의 출력을 어떻게 얻을 수 있죠?
- 메모리에 맞지 않는 데이터셋을 Keras에서 어떻게 사용할 수 있나요?
- 검증 손실이 더 이상 줄어들지 않을 때에 훈련 과정에 어떻게 개입할 수 있나요?
- 검증 비율은 어떻게 계산되나요?
- 훈련 중 데이터는 섞이나요?
- 훈련 손실 / 검증 손실 / 정확도를 어떻게 매 epoch마다 기록할 수 있나요?
- Keras 계층을 어떻게 "고정"할 수 있나요?
- 상태유지 재발 신경망(stateful RNNs)은 어떻게 사용할 수 있나요?
- Sequential 모델에서 계층을 어떻게 제거할 수 있나요?
- Keras에서 미리 훈련된 모델을 어떻게 사용할 수 있나요?
- Keras에서 HDF5 입력을 어떻게 사용할 수 있나요?
- Keras 구성 파일은 어디에 저장되나요?
- 개발 중에 Keras를 사용하여 재현 가능한 결과를 어떻게 얻을 수 있나요?
Notice
CodeOnWeb에서는 따로 파이썬을 설치하지 않더라도 코드박스 아래의 실행 버튼을 클릭하여 바로 파이썬 코드를 실행해볼 수 있습니다. TensorFlow, Theano와 같은 백엔드 코드도 마찬가지로 설치 없이 실행 버튼만 눌러 실행할 수 있습니다. 'Keras 연습하기' 과정에서는 실행 결과까지 출력하는 예제 코드에 대해서만 실행하여 결과를 확인할 수 있도록 하였습니다.
Keras를 어떻게 인용하면 되죠?
Keras가 연구에 도움이 되었다면 당신의 저작물에 인용해 주세요. 예를 들어 BibTeX 양식으로는 다음과 같습니다:
GPU에서 Keras를 어떻게 돌릴 수 있죠?
TensorFlow나 CNTK 백엔드에서 돌리고 있는 경우에 사용 가능한 GPU가 감지된다면 코드는 자동으로 GPU에서 돌아갈 겁니다.
Theano 백엔드에서 돌리고 있는 경우에는 다음과 같은 방법을 사용하세요:
방법 1: Theano flags를 사용합니다.
'gpu'라는 이름은 당신의 기기의 식별자에 따라 변경해야 할 수도 있습니다(예를 들어, gpu0
, gpu1
, 등등).
방법 2: .theanorc
를 설정하세요: 설정 방법
방법 3: 다음과 같이 코드의 시작 부분에 직접 theano.config.device
, theano.config.floatX
을 설정해 주세요:
"샘플", "batch", "epoch"가 무슨 뜻인가요?
다음은 Keras를 정확하게 이용하기 위해 제대로 알고 이해할 필요가 있는 일반적인 정의입니다:
- 샘플: 데이터셋의 하나의 요소(element)입니다.
- 예: 하나의 이미지는 합성곱 신경망(convolutional network)의 한 샘플 입니다.
- 예: 하나의 음성 파일은 담화 인지(speech recognition) 모델의 한 샘플 입니다.
- Batch: N개의 샘플의 세트입니다. 한 batch 안의 샘플들은 독립적이고 평행하게 처리됩니다. 훈련 중에는 한 batch는 모델에 한 번의 업데이트를 합니다.
- Batch 는 일반적으로 개별 입력 보다 입력 데이터 전체의 분포를 더 근사합니다. Batch가 더 클 수록 더 잘 근사합니다. 하지만, batch는 처리에 시간이 더 걸리고 업데이트는 한 번 밖에 안 됩니다. 추론(평가/예측)에 있어서는, 메모리를 다 써버리지 않는 한도 내에서 최대한 batch 크기를 크게 하는 것을 추천합니다(보통 batch가 클 수록 평가나 예측이 더 빠릅니다).
- Epoch: 임의의 끊어주기이며, 일반적으로 "전체 데이터셋에 대해 한 바퀴 돌기"로 정의됩니다. 훈련 과정을 단계별로 구분하여서 로깅과 주기적인 평가를 하는 데에 유용합니다.
- Keras 모델의
fit
메소드와evaluation_data
혹은evaluation_split
을 사용할 경우, 평가는 매 epoch의 끝에 수행됩니다. - Keras에서는 epoch의 끝에 특수하게 설계된 callbacks을 추가할 수 있습니다. 이러한 예는 학습율 변경 및 모델 체크포인트 저장 등 입니다.
- Keras 모델의
Keras 모델을 어떻게 저장할 수 있나요?
전체 모델 저장하기/불러오기 (아키텍처 + 가중치 + 최적화기 상태)
Keras 모델을 저장하기 위해서는 pickle이나 cPickle을 사용하는 것을 추천합니다.
model.save(filepath)
을 사용하여 Keras 모델을 다음과 같은 항목을 포함는 하나의 HDF5 파일에 저장할 수 있습니다:
- 모델을 다시 만들 수 있도록 하는 모델의 아키텍처
- 모델의 가중치
- 훈련 구성 (손실, 최적화기)
- 훈련을 중단한 그 시점 그대로 훈련을 재개할 수 있도록 하는 최적화기의 상태
모델을 다시 인스턴스화하기 위해 keras.models.load_model(filepath)
을 사용할 수 있습니다. load_model
은 저장된 훈련 구성을 사용하여 모델을 컴파일 할 수 있도록 합니다(원래의 모델이 컴파일된 적이 없지 않은 경우).
예제입니다:
모델의 아키텍처만 저장하기/불러오기
가중치나 훈련 구성은 빼고 모델의 아키텍처만 저장할 필요가 있을 때는, 다음과 같이 할 수 있습니다:
생성된 JSON / YAML 파일은 사람이 읽을 수 있고, 필요 시 직접 수성할 수 있습니다.
또한 이 데이터로 부터 다음과 같이 새로운 모델을 만들 수도 있습니다:
모델의 가중치만을 저장하기/불러오기
모델의 가중치만을 저장할 필요가 있을 때는, 아래와 코드와 같이 HDF5 형식으로 할 수 있습니다.
다만, HDF5와 파이썬 라이브러리 h5py는 Keras와 같이 설치되지 않으므로 별도로 설치하여야 한다는 점에 주의하세요.
모델을 인스턴스화하는 코드가 있다고 한다면, 저장한 가중치를 동일한 아키텍처를 가진 모델에 불러와 적용할 수 있습니다.
상세 조정이나 이전-학습(transfer-learning)의 경우와 같이 다른 아키텍처를 가진(하지만 몇 개의 공유하는 계층을 가지는) 모델에 저장한 가중치를 불러와 사용할 필요가 있다면, 계층 이름을 통해 가중치를 불러와 사용할 수 있습니다.
예제입니다:
저장된 모델의 사용자 지정 계층(혹은 다른 사용자 지정 객체) 다루기
불러오길 원하는 모델이 사용자 지정 계층이나 다른 사용자 지정 클래스, 함수 등을 포함하고 있다면, custom_objects
인수를 통해 불러오기 기능으로 넘길 수 있습니다:
대신에, CustomObjectScope을 사용할 수도 있습니다:
사용자 지정 객체는 load_model
, model_from_json
, model_from_yaml
와 같은 방법으로 다룰 수 있습니다:
훈련 손실은 시험 손실보다 왜 훨씬 큰가요?
Keras 모델은 두 가지 모드가 있습니다: 훈련 모드와 시험 모드. 탈락(Dropout), L1/L2 가중치 정규화(L1/L2 weight regularization)와 같은 정규화(Regularization) 메커니즘은 시험 모드에서는 꺼집니다.
게다가 훈련 손실은 훈련 데이터의 각 batch별 손실의 평균입니다. 모델이 점차 변화해 가기 때문에 한 epoch의 첫 번째 batch의 손실은 일반적으로 마지막 batch에 비해 큽니다. 반면에 한 epoch의 시험 손실은 epoch의 종료 지점과 동일한 모델을 사용하기 때문에 손실이 더 적습니다.
중간 계층의 출력을 어떻게 얻을 수 있죠?
한 가지 쉬운 방법은 관심 있는 계층을 출력하는 새로운 Model
을 만드는 것입니다:
또는 다음과 같이 어떤 입력에 대해 어떤 계층의 출력을 반환하는 Kears 함수를 만들 수도 있습니다:
유사하게, Theano와 TensorFlow 함수를 직접 만들 수도 있습니다.
모델이 훈련 모드와 시험 모드에서 다르게 동작하는 경우에(예를 들어 Dropout
, BatchNormalization
등을 사용하는 경우), 다음과 같이 함수에 훈련 모드 플래그를 넘겨주어야 하는 것에 주의하세요:
메모리에 맞지 않는 데이터셋을 Keras에서 어떻게 사용할 수 있나요?
model.train_on_batch(x, y)
과 model.test_on_batch(x, y)
을 사용하여 batch 훈련을 할 수 있습니다. [모델] Sequential 강의를 참조하세요.
혹은 훈련 데이터 batch를 산출하는 생성기를 작성한 다음, model.fit_generator(data_generator, steps_per_epoch, epochs)
메소드를 사용할 수도 있습니다.
작동되는 batch 훈련 예제를 CIFAR10 예제에서 확인할 수 있습니다.
검증 손실이 더 이상 줄어들지 않을 때에 훈련 과정에 어떻게 개입할 수 있나요?
다음과 같이 EarlyStopping
callback을 사용할 수 있습니다:
Callbacks 강의에서 좀 더 상세하게 알아볼 수 있습니다.
검증 비율은 어떻게 계산되나요?
예를 들어 model.fit
의 인수 validation_split
을 0.1로 설정하면, 전체 데이터의 마지막 10%가 검증 데이터로 사용됩니다. 0.25로 설정하면, 마지막 25%가 사용되는 식입니다. 검증 데이터를 추출하기 전에 데이터를 섞어주지 않는다면, 검증 데이터는 문자 그대로 전체 입력의 마지막 몇% 된다는 점에 주의하세요.
(같은 fit
이 호출된 동안)모든 epoch에 대해서 동일한 검증 세트가 사용됩니다.
훈련 중 데이터는 섞이나요?
네, model.fit
의 인수 shuffle
을 (기본값인)True
로 설정하면, 훈련 데이터는 매 epoch마다 무작위로 섞이게 됩니다.
검증 데이터는 섞이지 않습니다.
훈련 손실 / 검증 손실 / 정확도를 어떻게 매 epoch마다 기록할 수 있나요?
model.fit
메소드는 주욱 이어지는 손실과 다른 metrics을 포함하고 있는 history
속성을 가진 History
callback을 반환합니다.
Keras 계층을 어떻게 "고정"할 수 있나요?
계층을 "고정" 한다는 것은 해당 계층을 훈련 과정에서 배제한다는 것으로 가중치를 업데이트하지 않는 것을 의미합니다. 모델을 상세 조정할 때나 텍스트 입력에 대해 고정된 임베딩을 사용할 때 유용합니다.
trainable
인수(부울)를 계층 생성자에 넘겨 계층을 훈련-불가능으로 설정할 수 있습니다:
추가로, 인스턴스화한 후에 계층의 trainable
속성을 True
혹은 False
로 설정할 수 있습니다. 적용을 위해서는 trainable
속성을 수정한 뒤에 모델에 compile()
을 호출해야 합니다. 예제입니다:
상태유지 재발 신경망(stateful RNNs)은 어떻게 사용할 수 있나요?
재발 신경망을 상태유지로 만든다는 것은 매 batch 샘플의 상태를 다음 batch 샘플의 초기 상태로 재사용한다는 의미입니다.
상태유지 재발 신경망을 사용할 때는 다음 사항을 가정합니다:
- 모든 batche는 같은 갯수의 샘플을 가집니다.
x1
과x2
가 연속된 batch 샘플이라 할 때,x2[i]
는 모든i
에 대해서x1[i]
의 후속 시퀀스 입니다.
재발 신경망의 상태유지성을 사용하기 위해 다음 사항이 필요합니다:
- 모델의 첫 번 째 계층에
batch_size
인수를 넘김으로서 사용하는 batch의 크기를 명확하게 지정해야 합니다. 예를 들어 매 시간단계마다 16개 feature이며 10개의 시간단계로 구성된 시퀀스의 32 샘플의 batch에 대해서는batch_size=32
를 지정해야 합니다. - 재발 신경망 계층에
stateful=True
를 설정합니다. fit()
을 호출할 때shuffle=False
을 지정합니다.
축적된 상태를 리셋하려면 다음과 같이 합니다:
- 모델의 모든 계층의 상태를 리셋하려면
model.reset_states()
을 사용합니다. - 특정 상태유지 재발 신경망의 상태를 리셋하려면
layer.reset_states()
을 사용합니다.
예제입니다:
Notes that the methods predict
, fit
, train_on_batch
, predict_classes
등의 메소드는 모델의 모든 상태유지 계층의 상태를 업데이트한다는 점을 주의하세요. 이것은 상태유지 훈련 뿐만 아니라 상태유지 예측을 가능하게 합니다.
Sequential 모델에서 계층을 어떻게 제거할 수 있나요?
Sequential 모델에서 다음과 같이 .pop()
을 호출하여 마지막으로 추가한 계층을 제거할 수 있습니다.:
Keras에서 미리 훈련된 모델을 어떻게 사용할 수 있나요?
다음과 같은 이미지 분류 모델에 대해서 코드와 미리 훈련된 가중치를 사용할 수 있습니다:
- Xception
- VGG16
- VGG19
- ResNet50
- Inception v3
keras.applications
모듈에서 import 할 수 있습니다:
몇 개의 간단한 사용 예제를 애플리케이션 강의에서 확인할 수 있습니다.
Feature 추출이나 상세 조정 등을 위해 이렇게 미리 훈련된 모델을 사용하는 자세한 예제는 이 블로그의 게시물을 참조하세요.
VGG16 모델은 다음과 같은 몇 가지 Keras 예제의 기반이기도 합니다:
Keras에서 HDF5 입력을 어떻게 사용할 수 있나요?
keras.utils.io_utils
의 HDF5Matrix
클래스를 사용할 수 있습니다. HDF5Matrix에서 상세한 정보를 확인하세요.
다음과 같이 직접 HDF5 데이터셋을 사용할 수도 있습니다:
Keras 구성 파일은 어디에 저장되나요?
모든 Keras 데이터가 저장되는 기본 디렉토리는 다음과 같습니다:
Windows 사용자는 $HOME
을 %USERPROFILE%
로 변경해야 한다는 것에 주의하세요. Keras가 (권한 문제 등으로)위의 디렉토리를 생성할 수 없을 경우에는 /tmp/.keras/
이 백업으로 사용됩니다.
Keras 구성 파일은 $HOME/.keras/keras.json
에 저장된 JSON 파일입니다. 기본 구성 파일은 다음과 같이 생겼습니다:
다음과 같은 영역을 포함하고 있습니다:
- 이미지 처리 계층과 도구에 기본값으로 사용될 이미지 데이터 양식(
channels_last
이나channels_first
). - 수치 표현에 있어서 0으로 나뉘어 지는 것을 방지하는
epsilon
값. - 기본 실수 데이터형.
- 기본 백엔드. 백엔드 강의를 참조하세요.
비슷하게, get_file()
을 통해 다운로드 받은 것과 같은 캐쉬된 데이터셋 파일은 기본적으로 $HOME/.keras/datasets/
에 저장됩니다.
개발 중에 Keras를 사용하여 재현 가능한 결과를 어떻게 얻을 수 있나요?
모델 개발 중에는, 때때로 실행에 따른 성능의 개선이 실질적인 모델의 개선 혹은 데이터 변형에 의한 것인지 아니면 단순히 새로운 무작위 샘플에 의한 것인지를 확인하기 위해 재현 가능한 결과를 얻을 수 있다면 유용한 경우가 있습니다. 아래의 짧은 코드는 재현 가능한 결과를 얻는 방법의 한 예입니다. 파이썬3 환경에서 TensorFlow 백엔드를 사용하는 경우의 예제입니다:
토론이 없습니다