-
10주차 과제 : MLP
- 사용 언어 : python
- 해결 날짜 : 2021-12-06
-
코드 설명 :
- mnist 데이터를 다운 받아 불러온 후 1, 5, 8 클래스 데이터만 가지도록 재구성한다.
- 그 후 데이터를 train set : validation set : test set = 7 : 1 : 2 가 되도록 나눈다.
- 다음으로 validation을 set을 이용해 가장 좋은 모델을 가지도록, 노드의 개수를 10씩 늘려가며 solver의 옵션은 “adam, sgd”, activation function의 옵션은 “relu, logistic(sigmoid)”, 은닉층 수는 “2, 3”으로 검증한다. 총 경우의 수는 80개이다.
- 그 결과, 노드의 개수=90, solver=adam, activation function=relu, 은닉층 개수=3일 때의 validation 정확도가 0.9938…으로 가장 좋은 것으로 나타났고, 이에 동일한 모델에 train + validation set을 학습하여 test set으로 분류 정확도를 측정한 결과 0.99000…으로 약 99%의 분류 정확도를 가진다.
-
결과 :
-
코드
from sklearn.datasets import fetch_openml mnist = fetch_openml('mnist_784') import numpy as np from sklearn.model_selection import train_test_split X = mnist.data Y = mnist.target # 1,5,8 클래스 데이터만 가지도록 구성 data = X[np.logical_or(np.logical_or(Y=='1', Y=='5'), Y=='8')] target = Y[np.logical_or(np.logical_or(Y=='1', Y=='5'), Y=='8')] # train : validation : test = 7 : 1 : 2 가 되도록 나눔 train_x, test_input, train_y, test_target = train_test_split(data, target, test_size=0.2, random_state=0) train_input, val_input, train_target, val_target = train_test_split(train_x, train_y, test_size=0.125, random_state=0) from sklearn.neural_network import MLPClassifier import mglearn for i in range (0, 101, 10): j = i if i == 0: j = i + 1 mlp = MLPClassifier(solver='adam', activation='relu', random_state=0, hidden_layer_sizes=[j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='adam', activation='relu', random_state=0, hidden_layer_sizes=[j, j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='adam', activation='logistic', random_state=0, hidden_layer_sizes=[j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='adam', activation='logistic', random_state=0, hidden_layer_sizes=[j, j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='sgd', activation='relu', random_state=0, hidden_layer_sizes=[j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='sgd', activation='relu', random_state=0, hidden_layer_sizes=[j, j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='sgd', activation='logistic', random_state=0, hidden_layer_sizes=[j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) mlp = MLPClassifier(solver='sgd', activation='logistic', random_state=0, hidden_layer_sizes=[j, j, j]) mlp.fit(train_input, train_target) print("노드의 개수가 {node}일 때 검증 : {score}".format(node = j, score = mlp.score(val_input, val_target))) final_mlp = MLPClassifier(solver='adam', activation='relu', random_state=0, hidden_layer_sizes=[90, 90, 90]) final_mlp.fit(train_x, train_y) print(final_mlp.score(test_input, test_target))