딥러닝 구조 및 학습
- 딥러닝 구조와 학습에 필요한 요소
- 모델(네트워크)를 구성하는 레이어(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
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')])
함수형 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)
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()