[딥러닝] 01. 인공 신경망의 구조(입력층, 은닉층, 출력층)와 함수 용어 설명(keras), 가중치 행렬

2022. 1. 17. 13:31딥러닝

목차

     

     

    인공 신경망 ( ANN(Artificial Neural Networks, 뉴럴넷(Neural-Net) )

     

    구조

    그림 2. ANN의 구조

     

        • 입력층 ( input )
          • dataset에서 출력값(label)에 영향을 끼치는 특성들을 입력받는 층으로 학습의 맨 처음 단계이다.
          • 입력된 data(dataset의 feature)들을 은닉층으로 전달한다. -> 신경망의 깊이(층 수)를 셀 때 입력층은 포함하지 않는다.
        •  은닉층 ( hidden )
          • 입력층에서 전달받은 특성들을 훈련(연산)시키는 층이다.
          • 출력층으로 훈련된 데이터를 전달한다.
          • 신경망의 외부에서는 이 층에 직접 접근할 수 없다.
            = 계산의 결과를 사용자가 볼 수 없기 때문에 은닉층이라는 이름이 붙었다.

          • 은닉층이 2개 이상일 때 심층 신경망이라 하고, deep learning으로 볼 수 있다.
        •  출력층 ( output )
          • 은닉층을 통해 훈련된 예측한 정답을 출력하는 층이다.
          • 은닉층에서 받은 데이터의 총 합을 활성화 함수를 통해 변환한다.
          • 이진 분류 : sigmoid 함수
            • 출력층의 노드 수 : 1 ( 출력되는 값은 0~1로 확률 값 )
            • compile에서 loss 함수 : binary_crossentropy
          •  다중 분류 : softmax 함수
            • 출력층의 노드 수 : 출력값의 특성(feature, class) 수와 동일
            • compile에서 loss 함수 : sparse_categorical_crossentropy 
          •  회귀 ( Regression ) : 일반적으로 활성화 함수를 지정해주지 않음
            • 출력층의 노드 수 : 출력값의 특성수와 동일하게 설정

    모델링 (keras)

     

    ver 1.

    from tensorflow.keras.layers import Dense
    
    model = tf.keras.models.Sequential()
    model.add(Dense(64, activation='relu', input_shape=100))	# [입력층]
    model.add(Dense(32, activation='relu'))		# [은닉층 2]
    model.add(Dense(1. activation='sigmoid'))	# [출력층]

     

    위의 코드와 같은 내용으로 아래처럼도 쓸 수 있다.

    ver 2.

    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(64, activation='relu', input_shape=100),	# [입력층, 은닉층1]
        tf.keras.layers.Dense(32, activation='relu'),	# [은닉층 2]
        tf.keras.layers.Dense(1, activation='sigmoid')	# [출력층]
    ])

     

    여기서 가중치 행렬의 shape?

     

    • [입력층]
      • input_shape=100 : 데이터의 특성이 100개, 입력층의 노드도 100개
      • [입력층]과 [은닉층 1] 사이의 가중치 행렬의 shape : ( 100, 64 )
    • [은닉층]
      • Dense(64, …  : 생성된 노드 개수 64개
      • Dense(32, … : 생성된 노드 개수 32개
      • [은닉층 1]과 [은닉층 2] 사이의 가중치 행렬의 shape : ( 64, 32 )
    • [출력층]
      • Dense(1, … : 생성된 노드 개수 1 ( 이진 분류 )
      • [은닉층 2]과 [출력층] 사이의 가중치 행렬의 shape : ( 32, 1 )

     

    model.compile(optimizer='sgd',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])
    
    history = model.fit(x_train_scaled, y_train, epochs=200)
    
    model.evaluate(x_test_scaled, y_test)
    
    model.save("model_name.h5")
    
    from tensorflow.keras.models import load_model
    model = load_model("model_name.h5")

     

     

     

     

     

    용어

     

    • Sequential : keras에서 layer을 구성하기 위해 사용. model에 Sequential 객체를 불러와서 저장한다. 
      아래 model.add(~)는 해당 Sequential 객체에 layer을 추가하는 것이다.
    • Dense
      • Dense(128, ... : [은닉층]의 노드 개수 128개
    • Flatten : 2차원 이상의 데이터일 때 1차원으로 펴주는 역할을 한다. 만일 데이터가 (4, 4)라면 데이터는 16이 된다.
      그림 2. Flatten
    • .compile : 모델을 컴파일(기계가 이해할 수 있도록 변환), 신경망에서 사용할 optimizer, loss, metrics를 설정
      • optimizer : 훈련 과정 중 최적화 함수 설정
      • loss : 손실 함수 설정
      • metrics : 훈련 모니터링 지표 선택 ( 평가 지표가 된다 )
    • .fit : 실제로 신경망 학습이 진행되는 부분
      • Epochs : 데이터셋 전체를 반복할 학습 횟수, 총 훈련 횟수
      • Iteration : 가중치를 한 번 수정하는 단위
      • batch_size : default는 32, 미니 배치 경사 하강법을 사용하고 싶지 않다면 batch_size=None 입력
      • validation_data(x_val, y_val) : 검증데이터를 사용하여 훈련이 잘 되고 있는지 보여준다.
        모델이 검증 데이터를 학습하지는 않는다.
        만일 검증 데이터의 오차(loss)가 낮아지다가 높아지면 과적합(overfitting)의 신호이다.
      • validation_split : validation_data(..)과 비슷하지만, 학습 데이터에서 일부를 검증데이터로 분리시켜 사용하는 방식이다.
        model.filt(X_train, .... , validation_split=0.2) : 학습데이터의 20%를 검증데이터로 사용한다.
      • verbose : 학습 중 출력되는 문구 설정
        • 0 : None
        • 1 : 진행 막대(진행도)
        • 2 : 미니 배치마다 손실 정보 출력
      • # of data = batch_size * iteration
    • .evaluate : 모델에 대한 평가
    • .predict() : test(임의의 입력)에 대해 예측 = 모델의 출력값 확인
    • .save("~.h5") : 모델을 hdf5파일에 저장
    • .load_model("~.h5") : 해당 모델을 불러옴