상세 컨텐츠

본문 제목

2.딥러닝 구조

본문

딥러닝 구조 및 학습

  • 딥러닝 구조와 학습에 필요한 요소
    • 모델(네트워크)를 구성하는 레이어(layer)
    • 입력 데이터와 그에 대한 목적(결과)
    • 학습시에 사용할 피드백을 정의하는 손실 함수(loss function)
    • 학습 진행 방식을 결정하는 옵티마이저(optimizer) 

레이어(Layer)

  • 신경망의 핵심 데이터 구조
  • 하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈
  • 상태가 없는 레이어도 있지만, 대부분 가중치(weight)라는 레이어 상태를 가짐
  • 가중치는 확률적 경사 하강법에 의해 학습되는 하나 이상의 텐서
  • Keras에서 사용되는 주요 레이어
    • Dense
    • Activation
    • Flatten
    • Input
from tensorflow.keras.layers import Dense, Activation, Flatten, Input
 

Dense

  • 완전연결계층(Fully-Connected Layer)
  • 노드수(유닛수), 활성화 함수(activation) 등을 지정
  • name을 통한 레이어간 구분 가능
  • 가중치 초기화(kernel_initializer)
    • 신경망의 성능에 큰 영향을 주는 요소
    • 보통 가중치의 초기값으로 0에 가까운 무작위 값 사용
    • 특정 구조의 신경망을 동일한 학습 데이터로 학습시키더라도, 가중치의 초기값에 따라 학습된 신경망의 성능 차이가 날 수 있음
    • 오차역전파 알고리즘은 기본적으로 경사하강법을 사용하기 때문에 최적해가 아닌 지역해에 빠질 가능성이 있음
    • Keras에서는 기본적으로 Glorot uniform 가중치(Xavier 분포 초기화), zeros bias로 초기화
    • kernel_initializer 인자를 통해 다른 가중치 초기화 지정 가능
    • Keras에서 제공하는 가중치 초기화 종류: https://keras.io/api/layers/initializers/

#이 코드는 출력 유닛이 10개인 밀집(dense) 계층을 생성하고, 출력에 "softmax" 활성화 함수를 적용합니다.
Dense(10,activation='softmax')
#"Dense(10, kernel_initializer='he_normal', name='Dense Layer')"은 딥러닝 모델에서의 코드 줄입니다. 이 코드는 출력 유닛이 10개인 밀집(dense) 계층을 생성하고, 커널 초기화(kernel initializer)를 "he_normal"으로 설정합니다. 계층 이름은 "Dense Layer"로 설정됩니다.
Dense(10, kernel_initializer='he_normal',name='Dense Layer')
 
 

Activation

  • Dense layer에서 미리 활성화 함수를 지정할 수도 있지만 필요에 따라 별도 레이어를 만들어줄 수 있음
  • Keras에서 제공하는 활성화 함수(activation function) 종류: https://keras.io/ko/activations/
 
 

Flatten

  • 배치 크기(또는 데이터 크기)를 제외하고 데이터를 1차원으로 쭉 펼치는 작업
  • 예시)
  • Flatten(input_shape=(128,3,2,2))
  •   (128, 3, 2, 2) -> (128, 12)

Input

  • 모델의 입력을 정의
  • shape, dtype을 포함
  • 하나의 모델은 여러 개의 입력을 가질 수 있음
  • summary() 메소드를 통해서는 보이지 않음
Input(shape=(28,28),dtype=tf.float32)

출력

<KerasTensor: shape=(None, 28, 28) dtype=float32 (created by layer 'input_1')>

 

 

모델(Model)

  • 딥러닝 모델은 레이어로 만들어진 비순환 유향 그래프(Directed Acyclic Graph, DAG) 구조

모델 구성

  • Sequential()
  • 서브클래싱(Subclassing)
  • 함수형 API

Sequential()

  • 모델이 순차적인 구조로 진행할 때 사용
  • 간단한 방법
    • Sequential 객체 생성 후,add()를 이용한 방법
    • Sequential 인자에 한번에 추가 방법
  • 다중 입력 및 출력이 존재하는 등의 복잡한 모델을 구성할 수 없음
from tensorflow.keras.layers import Dense,Input,Flatten
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.utils import plot_model 
model = Sequential()
model.add(Input(shape=(28,28)))
model.add(Dense(300,activation='relu'))
model.add(Dense(100,activation='relu'))
model.add(Dense(10,activation='softmax'))
model.summary()

model =Sequential([Input(shape=(20,20), name='Input'),
                   Dense(300,activation='relu', name='Dense1'),
                   Dense(300,activation='relu',name='Dense2'),
                   Dense(300,activation='relu',name='Dense3')])
 
plot_model(model)

함수형 API

  • 가장 권장되는 방법
  • 모델을 복잡하고, 유연하게 구성 가능
  • 다중 입출력을 다룰 수 있음
inputs=Input(shape=(28,28,1))
x=Flatten(input_shape=(28,28,1))(inputs)
x=Dense(300,activation='relu')(x)
x=Dense(100,activation='relu')(x)
x=Dense(10,activation='relu')(x)
plot_model(model)

from tensorflow.python.ops.array_ops import constant
from tensorflow.keras.layers import Concatenate

input_layer = Input(shape=(28,28))
hidden1=Dense(100,activation='relu')(input_layer)
hidden2=Dense(100,activation='relu')(hidden1)
concat=Concatenate()([input_layer, hidden2])
output=Dense(1)(concat)

model=Model(inputs=[input_layer],outputs=[output])
model.summary()

관련글 더보기