Keras란

2 minute read

Keras란?

Keras는 빠르게 딥러닝 연구 및 실험을 가능하게 하는 데에 중점을 두고 개발되었다.
가능한 개발 시간을 최소화하면서, 빠르게 도출할 수 있게 합니다.

위의 설명은 Tensorflow에서 Keras를 설명하는 이유이다.
하지만 직접적으로 내가 사용하는 이유는 Tensorflow 2.0을 대비하기 위해서 이다.
Tensorflow 2.0이 Tensorflow 1.x와 어떤점이 달라졌는지는 Tensorflow 2.0을 Post하면서 자세히 알아보도록 하고 Tensorflow 2.0을 위해서 Keras를 사용하는 이유는 Tensorflow 2.0에서 Model을 구성하는데에 있어서 Keras가 필수이기 때문이다.
따라서 앞으로의 Keras에 대한 예제는 미리 Pytorch, DeepLearning, Tensorflow 1.x에서 올려둔 Post의 내용이 어떻게 변화였는지에 대해 중점을 두고 알아본다.


Keras의 특징

1. 사용자 친근성(User Friendliness)
Keras는 기계가 아닌 인간을 위해 설계된 API(Application Programming Interface, 응용 프로그램 프로그래밍 인터페이스)입니다. Keras는 일관성 있고 간단한 API를 제공하고, 일반적으로 필요한 사용자 작업의 수를 최소화하며, 사용자 오류 시 명확하고 실용적인 피드백을 제공합니다.
2. 모듈성(Modularity)
모델은 가능한 최소한의 제한으로 독립적으로 생성가능 합니다. 또한, 신경층(Neural Layers), 비용함수(Cost Functions), 최적화기(Optimizers), 초기화 스킴(Initialization Schemes), 활성 함수(Activation Functions), 정규화 스킴(Regularization Schemes)은 모두 새로운 모델을 생성하기 위해 결합할 수있는 독립 실행형 모듈입니다.
3. 쉬운 확장성(Easy Extensibility)
새로운 모듈은 (새로운 클래스와 함수로서) 추가하기 쉽습니다. 새로운 모듈을 쉽게 만들 수 있기 때문에, Keras가 고급 연구에 적합합니다.
4. Python 작업(Work with Python)
모델은 작고, 디버그하기 쉽고, 확장성이 용이한 Python을 기반으로 두고 있습니다.


Keras 기초(Mnist)

본격적으로 Keras에 대해서 알아보기 전에 간단한 MNIST예제를 통하여 Tensorflow에 비해서 얼마나 간편하고 사용하기 쉬워졌는지 알아보자.

필요한 라이브러리 Import

1
2
3
4
from keras.datasets import mnist
from keras.utils import to_categorical
from keras import models
from keras import layers


Mnist Data

Mnist Data를 다운받고 Train 시키기한 과정

1
2
3
4
(train_images, train_labels),(test_images,test_labels) = mnist.load_data()

print(train_images.shape)
print(len(train_labels))


(60000, 28, 28)
60000

Network 구성

network는 models.Sequential()로서 구성
Network안의 Layer는 models.add()로서 Layer를 Network에 추가한다.
하나의 완전연결 Layer는 layer.Dense()로서 Layer를 구성한다.

Layer.Dense() Parameter

  • units: Output의 차원
  • activation: Activation Function
  • use_bias: Bias사용 여부
  • input_shape: Input Shape, 아래 코드에서는 Train Image의 Size인 28 * 28로서 선언하였고 Batch Size나 Channel은 알아서 맞춰 들어가게 된다.
1
2
3
network=models.Sequential()
network.add(layers.Dense(512,activation='relu',input_shape=(28*28,)))
network.add(layers.Dense(10,activation='softmax'))


Compile 구성

Tensorflow와 달리 Keras는 network.compile()을 통하여 Optimizer, Loss Function, Trainning을 시킬 Object를 한꺼번에 선언한다.

1
network.compile(optimizer='rmsprop',loss='categorical_crossentropy',metrics=['accuracy'])


Dataset 준비

  1. 이미지 데이터는 0 ~ 255사이의 값을 가지는 RGB 형태의 Image이므로 0 ~ 1 사이의 값으로 변환
  2. keras.np_utils.categorical()을 통하여 One-Hot-Encoding으로서 변환
1
2
3
4
5
6
7
8
train_images = train_images.reshape((60000,28*28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000,28*28))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)


Train 및 결과 확인

Keras는 Tensorflow와 달리 Session을 열고 닫고 변수를 초기화 하는 과정을 거치면서 Trainning할 필요가 없다. 그저 network.fit()으로서 Network를 Trainning을 시키고 network.evaluate()를 통하여 TestData에 대하여 평가를 한다.

구성한 Network는 network.summary()를 통하여 Network의 구조를 간단히 확인할 수 있다.

1
2
3
4
print(network.summary())
network.fit(train_images,train_labels,epochs=5,batch_size=128)
test_loss,test_acc = network.evaluate(test_images,test_labels)
print('test_acc = ',test_acc)


Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 512)               401920    
_________________________________________________________________
dense_2 (Dense)              (None, 10)                5130      
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________
None  

Epoch 1/5
60000/60000 [==============================] - 1s 18us/step - loss: 0.2548 - accuracy: 0.9263
Epoch 2/5
60000/60000 [==============================] - 1s 16us/step - loss: 0.1038 - accuracy: 0.9694
Epoch 3/5
60000/60000 [==============================] - 1s 15us/step - loss: 0.0686 - accuracy: 0.9798
Epoch 4/5
60000/60000 [==============================] - 1s 17us/step - loss: 0.0497 - accuracy: 0.9852
Epoch 5/5
60000/60000 [==============================] - 1s 15us/step - loss: 0.0380 - accuracy: 0.9881
10000/10000 [==============================] - 1s 55us/step
('test_acc = ', 0.9812999963760376)


Tensorflow에 비해서 매우 간편하게 Network를 구성하고 확인할 수 가 있는것을 확인하였다.
Pytorch와 같은 간편한 Network구성과 Trainning을 할 수 있고, Tensorflow의 장점인 Define & Run 구조를 그대로 가지고 갈 수 있다는 점에서 매우 매력적인 API인것은 부정할 수 없을 것 같다.


참조:원본코드
참조:medium.com
참조: 케라스 창시자에게 배우는 딥러닝
코드에 문제가 있거나 궁금한 점이 있으면 wjddyd66@naver.com으로 Mail을 남겨주세요.

Categories:

Updated:

Leave a comment