Keras
1. 개요
1. 개요
케라스는 파이썬으로 작성된 고수준 딥 러닝 API이다. 2015년 3월 27일에 처음 출시되었으며, 아파치 라이선스 2.0 하에 배포되는 오픈 소스 라이브러리이다. 사용자가 복잡한 신경망 모델을 직관적이고 간결한 코드로 빠르게 구성하고 실험할 수 있도록 설계되었다.
이 라이브러리의 핵심 특징은 모듈화와 사용 편의성에 있다. 사용자는 다층 퍼셉트론, 컨볼루션 신경망, 순환 신경망과 같은 기본적인 신경망 구조부터 이들을 조합한 복잡한 모델까지 비교적 쉽게 구축할 수 있다. 초기에는 텐서플로와 테아노, CNTK와 같은 하위 계산 엔진을 백엔드로 지원하며 유연성을 제공했다.
현재 케라스는 텐서플로의 공식 고수준 API로 통합되어 널리 사용되고 있으며, 최신 버전에서는 파이토치와 JAX도 백엔드로 지원하여 프레임워크 간 호환성을 확장하고 있다. 이로 인해 연구자와 개발자는 익숙한 케라스 API를 유지하면서도 다양한 딥 러닝 엔진의 성능을 활용할 수 있게 되었다.
2. 역사
2. 역사
케라스는 2015년 3월 27일 프랑소와 숄레에 의해 처음 공개된 고수준 신경망 API이다. 초기 버전은 Theano를 백엔드로 사용하여 개발되었으며, 사용 편의성과 모듈성을 강조한 설계로 빠르게 인기를 얻었다. 이후 마이크로소프트의 CNTK와 같은 다른 딥러닝 엔진도 백엔드로 지원하기 시작했다.
2017년, 구글은 자사의 주요 딥러닝 프레임워크인 텐서플로의 2.0 버전부터 코어 레벨에서 케라스를 공식 고수준 API로 통합하겠다고 발표했다. 이로 인해 텐서플로 1.x 버전의 많은 저수준 API가 사용 중지되고, 텐서플로 2.0 안정판부터는 모델 구축과 훈련의 표준 방식이 사실상 케라스를 통하는 방식으로 전환되었다. 이 변화는 기존의 세션 기반 저수준 코딩에 익숙했던 사용자들에게는 큰 변화였지만, 전반적인 사용성을 크게 향상시켰다.
케라스 3.0 버전부터는 다시 텐서플로에 완전히 종속되지 않는 독립적인 라이브러리로의 길을 걷기 시작했다. 이 버전은 텐서플로뿐만 아니라 파이토치와 JAX를 공식 백엔드로 지원하는 다중 백엔드 아키텍처를 채택하여, 사용자가 선호하는 딥러닝 엔진을 유연하게 선택할 수 있도록 했다. 이는 케라스가 프레임워크 중립적인 고수준 인터페이스로서의 원래 목적을 재확립하는 중요한 전환점이 되었다.
3. 특징
3. 특징
3.1. 백엔드 지원
3.1. 백엔드 지원
케라스는 독립적인 고수준 신경망 API를 제공하는 동시에, 그 실행을 위해 다양한 딥 러닝 백엔드 엔진을 지원하는 것이 핵심 설계 철학이다. 초기 버전에서는 Theano와 TensorFlow를 주요 백엔드로 지원했으며, 이후 마이크로소프트의 CNTK도 지원 목록에 추가되었다. 이는 사용자가 동일한 케라스 코드로도 백엔드 설정에 따라 서로 다른 라이브러리 위에서 모델을 실행할 수 있게 해주는 유연성을 제공한다.
이러한 다중 백엔드 지원은 TensorFlow 2.x 버전에서 케라스가 공식 고수준 API로 완전히 통합되면서 잠시 약화되었다. 그러나 케라스 3.0 버전부터는 다시 독립적인 프로젝트로 분리되면서 다중 백엔드 지원이 강화되었다. 현재는 TensorFlow, PyTorch, JAX를 주요 백엔드로 지원하며, 사용자는 필요에 따라 가장 적합한 엔진을 선택하여 사용할 수 있다. 이는 연구와 개발 환경에서 여러 프레임워크를 오가며 작업해야 하는 사용자에게 큰 장점이 된다.
3.2. 사용 편의성
3.2. 사용 편의성
케라스는 사용 편의성을 최우선 설계 목표로 삼은 딥 러닝 라이브러리이다. 이는 복잡한 신경망을 빠르게 구축하고 실험할 수 있도록 직관적이고 간결한 API를 제공한다. 사용자는 낮은 수준의 텐서 연산이나 그래프 구성에 직접 관여하지 않고도, 고수준의 추상화된 구성 요소를 조합하여 모델을 만들 수 있다. 이러한 접근 방식은 연구 단계의 프로토타이핑과 교육 목적의 학습에 특히 적합하다.
사용 편의성은 모델 구성의 단순함에서 두드러진다. 시퀀셜 모델을 사용하면 레이어를 순차적으로 쌓아 나가는 방식으로 복잡한 인공신경망을 몇 줄의 코드로 정의할 수 있다. 더욱 유연한 함수형 API를 이용하면 다중 입력 또는 다중 출력 모델, 공유 레이어를 사용하는 복잡한 네트워크 토폴로지도 쉽게 구현 가능하다. 이는 컨볼루션 신경망이나 순환 신경망과 같은 다양한 딥 러닝 아키텍처를 빠르게 실험하고 비교하는 데 큰 장점이 된다.
또한, 모델의 학습 과정도 매우 간소화되어 있다. 사용자는 모델을 .compile() 메서드로 손실 함수, 옵티마이저, 평가 지표를 지정하고, .fit() 메서드에 훈련 데이터와 검증 데이터를 제공하기만 하면 된다. 학습 중 모델 체크포인트 저장, 학습률 조정, 텐서보드 로깅 등의 작업은 내장된 콜백 기능을 통해 쉽게 추가할 수 있다. 이러한 설계 철학 덕분에 케라스는 딥 러닝의 접근성을 크게 낮추고 폭넓은 사용자 기반을 형성하는 데 기여했다.
3.3. 모델 구성
3.3. 모델 구성
케라스의 모델 구성 방식은 직관적이고 모듈화된 접근법을 제공한다. 사용자는 레고 블록을 조립하듯이 레이어를 순차적으로 쌓아가거나, 복잡한 구조를 함수형 API를 통해 유연하게 정의할 수 있다. 이는 다층 퍼셉트론이나 컨볼루션 신경망 같은 표준 구조부터 여러 입력 또는 출력을 가진 복잡한 조합 모델까지 광범위한 신경망 아키텍처를 빠르게 프로토타이핑하고 구축할 수 있게 해준다.
주요 구성 방식으로는 Sequential 모델과 함수형 API가 있다. Sequential 모델은 레이어를 선형 스택으로 단순하게 추가하는 방식으로, 대부분의 전형적인 딥러닝 모델을 구성하는 데 적합하다. 반면 함수형 API는 비순환 그래프 구조를 지원하여 다중 입력 모델, 다중 출력 모델, 또는 레이어 간 공유 가중치가 필요한 복잡한 모델을 설계할 때 사용된다. 이러한 설계 철학은 사용자가 모델의 내부 흐름에 집중할 수 있도록 하여, 딥 러닝 모델 개발의 진입 장벽을 크게 낮추는 데 기여했다.
4. 주요 기능
4. 주요 기능
4.1. 모델 API (Sequential, Functional)
4.1. 모델 API (Sequential, Functional)
Keras는 사용자가 딥 러닝 모델을 직관적이고 빠르게 구성할 수 있도록 설계된 고수준 API를 제공한다. 이 API는 크게 두 가지 주요 패러다임인 Sequential 모델과 Functional API로 구분된다. 각각은 모델의 구조와 복잡도에 따라 선택적으로 사용되며, Keras의 핵심적인 모델 구성 방식을 대표한다.
Sequential 모델은 가장 단순하고 직관적인 선형 스택 방식의 신경망을 구축하기 위한 인터페이스이다. 사용자는 원하는 레이어를 순서대로 추가하기만 하면 되며, 대부분의 퍼셉트론, 기본적인 컨볼루션 신경망, 순환 신경망 등 단일 입력과 단일 출력을 가지는 직렬 구조의 모델을 쉽게 만들 수 있다. 이 방식은 코드가 간결하고 이해하기 쉬워 초보자에게 적합하며, 복잡한 분기나 다중 입력/출력이 필요하지 않은 표준적인 아키텍처를 빠르게 구현할 때 유용하다.
반면, Functional API는 보다 유연하고 복잡한 모델을 설계할 수 있는 강력한 도구이다. 이 방식은 각 레이어를 호출 가능한 객체로 취급하며, 레이어들 간의 입력과 출력 관계를 직접 정의함으로써 비선형 토폴로지를 구성할 수 있다. 다중 입력 모델, 다중 출력 모델, 잔차 연결이 있는 ResNet 같은 모델, 또는 레이어를 공유하는 모델 등을 만들 때 필수적으로 사용된다. Functional API는 Sequential 모델의 제한을 넘어 연구 및 실무에서 필요한 거의 모든 형태의 딥 러닝 아키텍처를 구현하는 데 사용된다.
이 두 가지 모델 API는 Keras의 사용 편의성과 표현력을 동시에 보여주는 대표적인 기능이다. 사용자는 문제의 복잡성에 따라 적절한 API를 선택하여, TensorFlow나 PyTorch 같은 백엔드 엔진의 세부적인 구현 없이도 고수준에서 모델 설계에 집중할 수 있다.
4.2. 레이어 (Layers)
4.2. 레이어 (Layers)
케라스의 핵심 구성 요소는 레이어이다. 모든 인공신경망 모델은 하나 이상의 레이어를 쌓아 구성되며, 케라스는 다양한 종류의 레이어를 미리 정의된 클래스로 제공하여 사용자가 쉽게 모델을 설계할 수 있게 한다.
주요 레이어 유형으로는 완전 연결 레이어(Dense), 컨볼루션 레이어(Conv2D), 순환 레이어(LSTM, GRU), 풀링 레이어(MaxPooling2D), 정규화 레이어(BatchNormalization), 드롭아웃 레이어 등이 있다. 또한, 입력(Input) 레이어, 레이어를 병합(Concatenate)하거나 더하는(Add) 레이어, 임베딩 레이어와 같은 특수 목적의 레이어도 포함되어 있다. 이러한 레이어 객체를 생성하고 순차적으로 연결하거나 함수형 API를 통해 유연하게 연결함으로써 복잡한 네트워크 아키텍처를 구축할 수 있다.
각 레이어는 구성 가능한 하이퍼파라미터를 가지며, 예를 들어 Dense 레이어는 뉴런의 수와 활성화 함수를, Conv2D 레이어는 필터의 개수와 크기, 스트라이드를 인자로 설정할 수 있다. 레이어는 텐서를 입력받아 텐서를 출력하는 변환 함수로 동작하며, 대부분의 레이어는 학습 과정에서 최적화되는 가중치(파라미터)를 내부에 가지고 있다. 케라스는 이러한 레이어들의 조합을 통해 다층 퍼셉트론, 컨볼루션 신경망, 순환 신경망 또는 이들의 혼합 모델을 직관적으로 구현할 수 있는 기반을 제공한다.
4.3. 컴파일 및 학습
4.3. 컴파일 및 학습
케라스에서 모델을 구성한 후에는 학습을 시작하기 전에 compile 메서드를 통해 모델을 컴파일해야 한다. 컴파일 과정에서는 학습에 사용할 손실 함수와 옵티마이저, 그리고 평가 지표를 지정한다. 손실 함수는 모델의 예측과 실제 값 사이의 오차를 계산하며, 옵티마이저는 이 손실을 최소화하기 위해 가중치를 업데이트하는 알고리즘이다. 대표적인 옵티마이저로는 SGD, RMSprop, Adam 등이 있다. 평가 지표는 학습 과정에서 모니터링할 성능 척도를 추가로 지정할 수 있다.
컴파일이 완료된 모델은 fit 메서드를 호출하여 실제 학습을 진행한다. fit 메서드는 학습 데이터와 검증 데이터, 에포크 수, 배치 크기 등을 인자로 받는다. 학습이 진행되는 동안 지정된 손실과 평가 지표의 값이 각 에포크마다 출력되며, 검증 데이터를 제공했다면 검증 성능도 함께 확인할 수 있다. 이 과정에서 과적합을 방지하기 위해 드롭아웃이나 배치 정규화 같은 기법이 레이어 내에 포함되어 있다면 자동으로 적용된다.
fit 메서드는 학습 데이터를 메모리에 한 번에 로드하지 않고 제너레이터를 통해 배치 단위로 공급받을 수도 있어, 대용량 데이터를 처리할 때 유용하다. 또한, 학습 중간에 모델을 저장하거나 학습률을 조정하는 등의 작업을 자동화할 수 있는 콜백 기능을 지원한다. 학습이 완료된 모델은 새로운 데이터에 대한 예측을 위해 predict 메서드를, 성능 평가를 위해 evaluate 메서드를 사용할 수 있다.
4.4. 콜백 (Callbacks)
4.4. 콜백 (Callbacks)
콜백은 케라스에서 모델의 학습 과정 중 특정 시점에 호출되는 객체이다. 사용자는 콜백을 활용하여 학습의 진행 상황을 모니터링하거나, 특정 조건에 따라 학습을 제어할 수 있다. 이는 모델의 성능을 실시간으로 확인하고, 과적합을 방지하며, 최적의 가중치를 저장하는 등 학습 과정을 자동화하고 최적화하는 데 핵심적인 역할을 한다.
주요 콜백 클래스로는 ModelCheckpoint, EarlyStopping, ReduceLROnPlateau, TensorBoard, CSVLogger 등이 있다. ModelCheckpoint는 정해진 주기마다 모델의 가중치를 파일로 저장한다. EarlyStopping은 검증 데이터에 대한 성능 지표가 더 이상 개선되지 않을 때 학습을 조기에 중단시켜 불필요한 연산을 줄인다. ReduceLROnPlateau는 학습이 정체될 때 학습률을 동적으로 낮춰 학습의 안정성을 높인다.
이러한 콜백들은 model.fit() 메서드의 callbacks 매개변수에 리스트 형태로 전달하여 사용한다. 사용자는 여러 콜백을 동시에 등록하여 복합적인 학습 전략을 구성할 수 있다. 또한, keras.callbacks.Callback 클래스를 상속받아 사용자 정의 콜백을 직접 구현하여 학습의 특정 단계(예: 에포크 시작/종료, 배치 처리 전/후)에 원하는 로직을 실행할 수 있다.
4.5. 사전 학습 모델
4.5. 사전 학습 모델
케라스는 다양한 분야에서 검증된 성능을 가진 사전 학습 모델을 제공한다. 이러한 모델은 이미지넷과 같은 대규모 데이터셋으로 학습되어 컴퓨터 비전 및 자연어 처리 작업에 바로 활용하거나 전이 학습의 기반으로 사용할 수 있다. 대표적인 모델로는 VGG, ResNet, 인셉션, 엑셉션넷, 이지넷 등이 포함된다.
사전 학습 모델은 keras.applications 모듈을 통해 쉽게 불러와 사용할 수 있다. 사용자는 모델의 전체 구조를 가져오거나, 최상위 분류 층을 제외한 특징 추출기 부분만 로드할 수 있다. 이를 통해 적은 양의 데이터로도 효율적인 전이 학습이나 파인 튜닝이 가능해진다. 이는 의료 영상 분석이나 위성 사진 분류 등 데이터 수집이 어려운 전문 분야에서 특히 유용하다.
케라스 3.0으로 넘어오면서, 이러한 모델들은 텐서플로우, 파이토치, JAX 등 선택한 백엔드에 맞게 자동으로 호환되어 로드된다. 이는 사용자가 선호하는 딥러닝 프레임워크를 변경하더라도 동일한 고수준 API로 검증된 모델 아키텍처를 활용할 수 있음을 의미한다.
5. 버전 변천
5. 버전 변천
5.1. 초기 독립 버전
5.1. 초기 독립 버전
케라스는 2015년 3월 27일, 프랑소와 숄레에 의해 처음 공개된 독립적인 오픈소스 딥러닝 라이브러리이다. 초기 버전은 Theano를 기본 백엔드 엔진으로 사용하여 개발되었으며, 파이썬으로 작성되어 사용자 친화적인 고수준 API를 제공하는 데 중점을 두었다. 이 시기의 케라스는 복잡한 신경망 구조를 직관적이고 간결한 코드로 빠르게 구현할 수 있게 해주어 연구자와 개발자 사이에서 빠르게 인기를 얻었다.
초기 독립 버전의 핵심 목표는 모듈성, 사용 편의성, 그리고 확장성이었다. 사용자는 Sequential 모델이나 함수형 API를 통해 레고 블록을 쌓듯이 레이어를 쉽게 추가하고 연결하여 모델을 구성할 수 있었다. 이러한 설계 철학은 딥러닝의 접근성을 크게 높이는 데 기여하였다. 또한, Theano 외에도 CNTK와 같은 다른 백엔드 엔진을 선택적으로 사용할 수 있는 다중 백엔드 지원을 초기부터 특징으로 내세웠다.
2017년을 전후로 케라스의 위상은 크게 변화하게 된다. 당시 가장 널리 사용되기 시작한 텐서플로의 코어 라이브러리가 비교적 낮은 수준의 API를 제공하는 반면, 케라스는 높은 생산성을 보여주고 있었기 때문이다. 이에 구글은 케라스의 개발을 적극적으로 지원하기 시작했으며, 결국 케라스는 텐서플로 2.0의 공식 고수준 API로 완전히 통합되는 길을 걷게 된다. 이로 인해 케라스의 초기 독립 버전 시대는 막을 내리게 되었다.
5.2. TensorFlow 통합 (2.x)
5.2. TensorFlow 통합 (2.x)
2017년, 구글은 TensorFlow 2.0부터 코어 레벨에서 Keras를 지원하겠다고 발표했다. 이에 따라 2019년에 정식 출시된 TensorFlow 2.0 stable 버전부터는 고수준 API가 사실상 Keras를 통해 제공되도록 통합되었다. 이로 인해 사용자는 tf.keras 모듈을 통해 Keras의 모든 기능을 TensorFlow 생태계 내에서 직접 활용할 수 있게 되었다.
이 통합 과정에서 TensorFlow 1.x 버전의 복잡한 세션 실행 방식과 자잘한 저수준 API들은 대부분 정리되거나 사용이 권장되지 않는 상태가 되었다. 이는 기존 TensorFlow 1.x의 프로그래밍 패러다임에 익숙했던 사용자들에게는 큰 변화였지만, 모델 구축과 훈련 과정을 더 직관적이고 간결하게 만들어 주는 결과를 가져왔다. tf.keras는 TensorFlow의 즉시 실행 모드와 완벽하게 통합되어 더욱 유연한 개발을 가능하게 했다.
5.3. Keras 3.0 및 다중 백엔드
5.3. Keras 3.0 및 다중 백엔드
Keras 3.0은 Keras 역사상 중요한 전환점으로, 다시 다중 백엔드 아키텍처를 채택한 주요 업데이트이다. 이 버전은 TensorFlow에 완전히 통합된 상태에서 독립적인 상위 레벨 API로 재탄생하여, 사용자에게 PyTorch와 JAX를 포함한 더 넓은 백엔드 선택권을 제공한다. 이 변화는 개발자가 특정 프레임워크에 종속되지 않고도 Keras의 직관적인 고수준 API를 활용할 수 있게 하여, 연구와 생산 환경의 유연성을 크게 높였다.
주요 개선 사항으로는 모든 지원 백엔드(TensorFlow, PyTorch, JAX)에서 완전한 기능 호환성을 보장하는 것이 있다. 이는 단일 Keras 코드베이스로 여러 백엔드에서 동일한 모델을 구성, 학습, 배포할 수 있음을 의미한다. 또한 성능 최적화가 이루어져 대규모 모델 학습과 분산 학습 시 효율성이 향상되었으며, 새로운 기능과 API가 추가되어 표현력이 더욱 풍부해졌다.
이러한 다중 백엔드 지원은 딥러닝 생태계의 통합을 촉진하는 역할을 한다. 개발자는 프로젝트 요구사항이나 팀의 선호도에 따라 백엔드를 자유롭게 선택하거나 전환할 수 있으며, 이는 오픈 소스 커뮤니티의 협력과 지식 공유를 더욱 원활하게 만든다. Keras 3.0은 단순한 라이브러리 업데이트를 넘어, 사용자 중심의 유연한 딥러닝 인터페이스 표준을 제시하는 방향으로 진화하고 있다.
6. 사용 예시
6. 사용 예시
케라스는 직관적인 API를 통해 간단한 코드로도 복잡한 딥 러닝 모델을 빠르게 구축하고 학습할 수 있게 해준다. 가장 기본적인 사용 예시는 순차 모델(Sequential Model)을 이용해 다층 퍼셉트론(MLP)을 구성하는 것이다. 사용자는 Sequential() 객체를 생성한 후, .add() 메서드를 사용해 Dense 레이어와 활성화 함수를 순차적으로 쌓아 나가기만 하면 된다. 모델 구조가 정의되면 .compile() 메서드로 옵티마이저, 손실 함수, 평가 지표를 설정하고, .fit() 메서드에 훈련 데이터와 레이블을 입력하여 학습을 시작한다.
보다 복잡한 구조, 예를 들어 다중 입력 또는 다중 출력을 가진 모델을 만들기 위해서는 함수형 API(Functional API)를 사용한다. 이 방식은 각 레이어를 함수처럼 호출하고, 레이어의 입력과 출력을 명시적으로 연결함으로써 유연한 모델 그래프를 설계할 수 있게 한다. 컨볼루션 신경망(CNN)이나 순환 신경망(RNN), LSTM과 같은 고급 레이어들도 동일한 방식으로 쉽게 조합하여 이미지 분류나 시계열 예측 모델을 구현할 수 있다.
케라스는 학습 과정을 세밀하게 제어할 수 있는 콜백(Callback) 기능도 제공한다. 예를 들어, ModelCheckpoint 콜백은 학습 중 특정 조건(예: 검증 정확도 향상 시)에 모델 가중치를 자동으로 저장하고, EarlyStopping 콜백은 검증 성능이 더 이상 개선되지 않을 때 학습을 조기에 중단시켜 과적합을 방지한다. 또한, TensorBoard 콜백을 통해 손실과 정확도 같은 지표를 시각화하여 모델 성능을 실시간으로 모니터링할 수 있다.
사전 학습된 모델을 활용하는 것도 케라스의 주요 사용 예시 중 하나이다. keras.applications 모듈은 이미지넷(ImageNet) 데이터셋으로 사전 학습된 VGG, ResNet, EfficientNet 등의 모델을 제공한다. 사용자는 이러한 모델을 완전히 재학습시키거나, 마지막 레이어만 교체하여 새로운 작업에 맞춰 미세 조정(파인 튜닝)함으로써 적은 데이터와 계산 자원으로도 높은 성능의 모델을 얻을 수 있다.
