• 10주차 과제 : MLP

    image

    • 사용 언어 : 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%의 분류 정확도를 가진다.
    • 결과 : image image image image image image image image image image image image image image

    • 코드

      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))