Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.
13841 단어 Autoencoder파이썬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와 같은...새로운 숫자가 태어난 느낌(^_^;)
할 수 있었다!
Reference
이 문제에 관하여(Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mix_dvd/items/31e5daa467eb8479564e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
필기 숫자 데이터가 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와 같은...새로운 숫자가 태어난 느낌(^_^;)
할 수 있었다!
Reference
이 문제에 관하여(Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mix_dvd/items/31e5daa467eb8479564e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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와 같은...새로운 숫자가 태어난 느낌(^_^;)
할 수 있었다!
Reference
이 문제에 관하여(Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/mix_dvd/items/31e5daa467eb8479564e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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와 같은...새로운 숫자가 태어난 느낌(^_^;)
할 수 있었다!
Reference
이 문제에 관하여(Scikit-learn으로 자동 인코더 같은 것을 구현해 봅니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mix_dvd/items/31e5daa467eb8479564e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)