소개
이 튜토리얼에서는 Scikit-learn 을 사용하여 MNIST 데이터셋에서 손으로 쓴 숫자를 분류하는 MLPClassifier 를 만드는 방법을 보여줍니다. 또한 MLP 의 첫 번째 레이어의 가중치를 시각화하여 학습 동작에 대한 통찰력을 얻을 것입니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
라이브러리 가져오기
이 프로젝트에 필요한 라이브러리를 가져오는 것으로 시작합니다.
import warnings
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_openml
from sklearn.exceptions import ConvergenceWarning
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
데이터 로드
다음으로, Scikit-learn 의 fetch_openml 함수를 사용하여 MNIST 데이터셋을 로드합니다.
X, y = fetch_openml(
"mnist_784", version=1, return_X_y=True, as_frame=False, parser="pandas"
)
데이터 전처리
각 픽셀 값을 최대 픽셀 값인 255.0 으로 나누어 데이터를 정규화합니다.
X = X / 255.0
데이터 분할
train_test_split 함수를 사용하여 데이터셋을 학습용 데이터셋과 테스트용 데이터셋으로 분할합니다.
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, test_size=0.7)
MLPClassifier 학습
40 개의 뉴런을 포함하는 단일 은닉층을 가진 MLPClassifier 를 생성합니다. 자원 제약으로 인해 MLP 를 8 번의 반복만 학습시킵니다. 또한, 모델이 제한된 반복 횟수 내에 수렴하지 않아 발생하는 ConvergenceWarning을 처리합니다.
mlp = MLPClassifier(
hidden_layer_sizes=(40,),
max_iter=8,
alpha=1e-4,
solver="sgd",
verbose=10,
random_state=1,
learning_rate_init=0.2,
)
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=ConvergenceWarning, module="sklearn")
mlp.fit(X_train, y_train)
모델 평가
MLPClassifier 의 정확도를 학습 데이터셋과 테스트 데이터셋에서 계산하여 평가합니다.
print("Training set score: %f" % mlp.score(X_train, y_train))
print("Test set score: %f" % mlp.score(X_test, y_test))
가중치 시각화
마지막으로, MLP 의 첫 번째 층의 가중치를 시각화합니다. 4x4 그리드의 서브플롯을 생성하고 각 가중치를 28x28 픽셀의 회색조 이미지로 표시합니다.
fig, axes = plt.subplots(4, 4)
vmin, vmax = mlp.coefs_[0].min(), mlp.coefs_[0].max()
for coef, ax in zip(mlp.coefs_[0].T, axes.ravel()):
ax.matshow(coef.reshape(28, 28), cmap=plt.cm.gray, vmin=0.5 * vmin, vmax=0.5 * vmax)
ax.set_xticks(())
ax.set_yticks(())
plt.show()
요약
이 튜토리얼에서는 Scikit-learn 을 사용하여 MNIST 데이터셋에서 손글씨 숫자를 분류하는 MLPClassifier 를 만드는 방법을 배웠습니다. 또한 MLP 의 첫 번째 층의 가중치를 시각화하여 학습 과정을 이해하는 데 도움이 되었습니다.