Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.

소개



여러가지 세미나를 시켜 주시는 것이 많아져, 특히 AI 관련 기술의 세미나에서는 별로 모르고 이야기를 하고 있으면, 실은 잘못하고 있었습니다...따위 일이 될 수 있다.

그래서 공부를 위해 AutoEncoder를 Scikit-learn으로 구현해 보았으므로 그 절차를 아래에 정리합니다.

데이터 세트



필기 숫자 데이터가 Scikit-learn에 준비되어 있으므로 여기를 이용합니다.
로드한 후 일부 이미지를 보고 어떤 느낌인지 확인합니다.

from sklearn.datasets import load_digits
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

dig = load_digits()

for i in [10, 230, 450]:
    npimg = np.array(dig.data[i])
    npimg = npimg.reshape((8, 8))
    plt.imshow(npimg, cmap='gray')
    plt.show()

실행 결과는 다음과 같습니다.







입력 데이터 작성



데이터 세트에서 입력 및 출력 데이터를 검색하고 학습 및 검증을 위해 데이터를 분리합니다.
여기서 엔코더 학습에도 데이터의 일부를 사용하기 때문에 절반씩 나누고 있습니다.
import pandas as pd

X = pd.DataFrame(dig.data)
y = pd.DataFrame({"y":dig.target})

from sklearn import model_selection
X_train, X_test, y_train, y_test = model_selection.train_test_split(X, y, test_size=.5, random_state=42)

# 後で使うので先にとっておきます
y_proba = pd.DataFrame(X_test)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)

X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

학습



방금 전 데이터를 신경망으로 학습합니다.
from sklearn.neural_network import MLPClassifier

model = MLPClassifier(random_state=42)
model.fit(X_train, y_train.as_matrix().astype("int").flatten())
model.score(X_test, y_test)

실행해 보면 점수는 "0.9699666295884316"이었습니다.

인코더



그런 다음 인코더를 만듭니다.
여기서, 검증용 데이터로부터 predict_proba를 사용해 10개의 배열 데이터를 취득해, 입력 데이터로 합니다.

그런 다음 교사 데이터로 확인 데이터의 셀당 값을 y_proba_cells로 분해합니다.

모델을 셀 수와 동일하게 준비하고 각 셀마다 입력 값에 대한 출력을 학습합니다.
X_proba = pd.DataFrame(model.predict_proba(X_test))

y_proba_cells = []

for col in y_proba.columns:
    y_proba_cells.append(y_proba[col])

model_proba = []

for i in range(y_proba.shape[1]):
    model_proba.append(MLPClassifier(max_iter=500, random_state=42))

for i in range(y_proba.shape[1]):
    model_proba[i].fit(X_proba, y_proba_cells[i])

이미지 생성



학습 후의 모델에, 출력하고 싶은 수치에 따른 배열을 입력해, 얻어진 셀마다의 예측치로부터, 화상을 생성해 봅니다.
X_encode = 6

m = [0] * 10
m[X_encode] = 1
X_encode = m

result = []

for i in range(y_proba.shape[1]):
    result.append(model_proba[i].predict([X_encode])[0])

npimg = np.array(result)
npimg = npimg.reshape((8, 8))
plt.imshow(npimg, cmap='gray')

수행한 결과는 여기입니다.



6같다(^-^)

다음은 0과 9의 확률이 0.5씩인 경우를 시도합니다.
X_encode = [0.5,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.5]

result = []

for i in range(y_proba.shape[1]):
    result.append(model_proba[i].predict([X_encode])[0])

npimg = np.array(result)
npimg = npimg.reshape((8, 8))
plt.imshow(npimg, cmap='gray')

실행하면 ...



0과 같은 9와 같은...새로운 숫자가 태어난 느낌(^_^;)

할 수 있었다!

좋은 웹페이지 즐겨찾기