글 작성자: 만렙개발자

AutoKeras는 텍사스 A&M 대학의 DATA 연구소에서 개발된 케라스 기반의 AutoML 시스템입니다. "Auto-keras: An efficient neural architecture search system."라는 논문이 2019년에 ACM에서 발표되면서 github에 공개가 되었습니다. AutoKeras의 목표는 모든 사람이 기계 학습에 접근할 수 있도록 하는 것입니다. AutoKeras는 베이지안 최적화를 통해 효율적인 신경 구조 검색을위한 네트워크 형태를 유도 할 수있는 새로운 프레임워크입니다. 이 프레임워크는 검색 공간을 효율적으로 탐색하기 위해 신경망 커널과 트리 구조의 추천 함수 최적화 알고리즘을 개발했습니다. 추천함수는 현재 입력된 값과 확률적 추정 결과값을 바탕으로, 찾고자하는 이상적인 최적의 상태를 찾는데 있어서 다음으로 시험해볼 입력값을 추천해주는 함수입니다. AugoKeras는 아직 pre-relase 버전임에도 불구하고 많은 관심을 받고 있습니다. 코드도 정말 간단합니다.

!pip install --upgrade tensorflow
!pip install --upgrade tensorflow-cpu
!pip install autokeras

AutoKeras는 pip 명령어를 통해 설치할 수 있습니다. 텐서플로우 2.1 버전 이상을 요구하고 있기 때문에, 필요한 경우 텐서플로우를 업그레이드해줍니다.

import autokeras as ak

clf = ak.ImageClassifier()
clf.fit(x_train, y_train)
results = clf.predict(x_test)

이 코드하나면 이미지 분류델을 학습하고 예측합니다. (데이터를 불러오는 부분은 생략되어있습니다.)

 

현재 지원되는 기능으로는 이미지 분류, 이미지 회귀, 텍스트 분류, 텍스트 회귀, 구조적 데이터 분류, 구조적 데이터 회귀가 있습니다. 아직 지원되지 않지만 개발중인 기능으로는 시계열 예측, 객체 검출, 이미지 세그멘테이션이 있습니다.

 

위 코드를 활용하여 MNIST 데이터셋으로 이미지 분류 예제를 한번 실행해봅시다.

import autokeras as ak
from tensorflow.keras.datasets import mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()

clf = ak.ImageClassifier(max_trials=10) 

clf.fit(x_train, y_train)

predicted_y = clf.predict(x_test)

print(clf.evaluate(x_test, y_test))

매우 코드가 간단하죠? 이전에 아무리 간단한 모델이라고 할지라도, MNIST를 해결하기 위해 짜야했던 코드에 비하면 매우 간단합니다. 

 

이렇게 간단하게 된다는 것보다 우리가 관심이 있는, 탐색 공간을 설정하는 것을 해봅시다. ImageClassifer는 AutoKeras 개발자들이 이미지 분류에 적합하다고 생각하는 탐색 공간을 설정하고 모델 아키텍처를 탐색하는 것입니다. AutoModel을 사용하면 탐색 공간을 직접 정의하여 탐색하게 할 수 있습니다. 

import autokeras as ak

input_node = ak.ImageInput()
output_node = ak.ImageBlock(block_type='resnet', normalize=True, augment=False)(input_node)
output_node = ak.ClassificationHead()(output_node)
clf = ak.AutoModel(inputs=input_node, outputs=output_node, max_trials=10)
clf.fit(x_train, y_train)

이미지를 다루는 입력 레이어는 ImageInput을 이용해 만들 수 있습니다. 그리고 분류에 사용할 레이어들을 학습할 ImageBlock 클래스를 만들어 줍니다. 여기서는 ResNet의 구조를 갖는 ImageBlock을 만들었습니다. max_trials는 모델을 찾는 횟수입니다. 10으로 입려개주면 10번의 모델 탐색을 거쳐 최적의 모델을 찾아냅니다. ImageBlock을 입력 레이어와 출력 레이어에 연결을 해주고, AutoKeras의 입력과 출력으로 연결하면 모델이 완성됩니다. 모델 인스턴스의 fit 함수를 이용해 학습을 합니다.

 

IMDB 영화 리뷰 감정 분석 예제 입니다. 텍스트 데이터를 이용해 긍정과 부정의 데이터를 분류해야하기 때문에, AutoKeras의 TextClassifier 클래스를 사용합니다. 

import tensorflow as tf

import autokeras as ak


def imdb_raw():
    max_features = 20000
    index_offset = 3  # word index offset

    (x_train, y_train), (x_test, y_test) = tf.keras.datasets.imdb.load_data(
        num_words=max_features,
        index_from=index_offset)
    x_train = x_train
    y_train = y_train.reshape(-1, 1)
    x_test = x_test
    y_test = y_test.reshape(-1, 1)

    word_to_id = tf.keras.datasets.imdb.get_word_index()
    word_to_id = {k: (v + index_offset) for k, v in word_to_id.items()}
    word_to_id["<PAD>"] = 0
    word_to_id["<START>"] = 1
    word_to_id["<UNK>"] = 2

    id_to_word = {value: key for key, value in word_to_id.items()}
    x_train = list(map(lambda sentence: ' '.join(
        id_to_word[i] for i in sentence), x_train))
    x_test = list(map(lambda sentence: ' '.join(
        id_to_word[i] for i in sentence), x_test))
    x_train = np.array(x_train, dtype=np.str)
    x_test = np.array(x_test, dtype=np.str)
    return (x_train, y_train), (x_test, y_test)


# Prepare the data.
(x_train, y_train), (x_test, y_test) = imdb_raw()
print(x_train.shape)  # (25000,)
print(y_train.shape)  # (25000, 1)
print(x_train[0][:50])  # <START> this film was just brilliant casting <UNK>

# Initialize the TextClassifier
clf = ak.TextClassifier(max_trials=3)
# Search for the best model.
clf.fit(x_train, y_train)
# Evaluate on the testing data.
print('Accuracy: {accuracy}'.format(clf.evaluate(x_test, y_test)))

타이타닉 생존자 예측 문제에 대한 예제입니다. 타이타닉 생존자 예측 문제의 데이터셋은 구조화된, 정형 데이터입니다. 이러한 데이터를 이용한 분류 문제를 풀기위한 AutoKeras의 클래스는 StructuredDataClassifier입니다. 이 클래스를 이용해 데이터셋에 적합한 모델을 검색할 수 있습니다. 

import autokeras as ak

# Initialize the classifier.
clf = ak.StructuredDataClassifier(max_trials=30)
# x is the path to the csv file. y is the column name of the column to predict.
clf.fit(x='titanic/train.csv', y='survived')
# Evaluate the accuracy of the found model.
print('Accuracy: {accuracy}'.format(
    accuracy=clf.evaluate(x='titanic/eval.csv', y='survived')))