본문 바로가기

AI Theory/key concept of AI

딥러닝 구조와 모델

딥러닝 구조와 모델

keras api의 구조

딥러닝 구조와 레이어

  • 딥러닝은 여러개의 layer로 구성되어 있다
  • 기본적으로 입력층(input), 은닉층(hidden), 출력층(output)으로 구분된다
  • 레이어는 딥러닝 모델을 구성하는 핵심 데이터 구조로서 하나 이상의 텐서를 입력받아 하나 이상의 텐서를 출력하는 데이터 처리 모듈이다.

딥러닝 모델 구조

input 객체 입력 데이터 모양인 shape와 예상 데이터유형 dtype을 정의. 그 외에도 batch size, name 지정 가능
Dense 레이어 완전연결계층(Fully-Connected Layer)으로 노드수(유닛수)를 지정
Flatten 레이어 배치 크기 또는 데이터 크기를 제외하고 데이터를 1차원 형태로 평평하게 반환
activation 레이어 주로 비선형 활성화 함수 사용 Dense layer에서 미리 활성화함수를 지정할수도, activation layer를 만들 수도 있다 sigmoid, hyperbolic tangent, ReLU, Leaky ReLU, ELU 등이 있다.
# input
keras.Input(shape=(28, 28), dtype=tf.float32, batch_size=16, name='input')

# dense
tf.keras.layers.Dense(
    units, # 노드 개수
    activation=None, # 활성화함수
    name='None', # 이름
    use_bias=True, # bias vector 사용유무
    kernel_initializer="glorot_uniform",
    bias_initializer="zeros",
    kernel_regularizer=None,
    bias_regularizer=None,
    activity_regularizer=None,
    kernel_constraint=None,
    bias_constraint=None,
    **kwargs
)


# flatten
inputs = keras.Input(shape=(28, 28, 1))
layer = layers.Flatten(input_shape=(28, 28, 1))(inputs)
print(layer.shape) # (None, 28*28)

딥러닝 모델을 생성하는 방법

크게 3가지로 나뉘어진다.

1. Sequential() 함수 이용한 Sequential API 방법, 2. Functional API를 이용하는 방법, 3. Subclassing API를 이용하는 방법
일반적으로는 Functional API를 주로 많이 사용한다.


Sequential API

  • 모델이 순차적인 구조로 진행할 때 사용하는 간단한 방법
  • 다중 입력 및 출력이 존재하는 등의 복잡한 모델을 구성할 수 없EK.
  • 사용 방식
    • Sequential 객체 생성 후,add()를 이용하여 사용할 레이어들을 추가하는 방법
    • model = models.Sequential() model.add(layers.Input(shape=(28, 28))) model.add(layers.Dense(300, activation='relu')) model.add(layers.Dense(100, activation='relu')) model.add(layers.Dense(10, activation='softmax')) model.summary() utils.plot_model(model) # 모델 모습 한번에 확인
    • Sequential 인자에 한번에 추가하는 방법
    • model = models.Sequential([layers.Input(shape=(28, 28), name='Input'), layers.Dense(300, activation='relu', name='Dense1'), layers.Dense(100, activation='relu', name='Dense2'), layers.Dense(10, activation='softmax', name='Output')]) model.summary()

Functional API

  • 가장 권장되는 방법
  • 딥러닝 모델을 복잡하고, 유연하게 구성하는 것이 가능하며, 다중 입출력을 다룰 수 있다.
  • Input 객체를 여러 레이어에서 사용할 수 있다.
# 예제 1
inputs = layers.Input(shape=(28, 28, 1))
x = layers.Flatten(input_shape=(28, 28, 1))(inputs)
x = layers.Dense(300, activation='relu')(x)
x = layers.Dense(100, activation='relu')(x)
x = layers.Dense(10, activation='softmax')(x)

model = models.Model(inputs=inputs, outputs=x)
model.summary()

# 예제2
inputs = keras.Input(shape=(28, 28))
hidden1 = layers.Dense(100, activation='relu')(inputs)
hidden2 = layers.Dense(30, activation='relu')(hidden1)
concat = layers.Concatenate()([inputs, hidden2]) # concatenate를 이용해 dense 레이어의 결과와 input을 결합
output = layers.Dense(1)(concat)

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

# 예제 3: 여러 input객체 사용
input_1 = keras.Input(shape=(10, 10), name='Input_1')
input_2 = keras.Input(shape=(10, 28), name='Input_2')

hidden1 = layers.Dense(100, activation='relu')(input_2)
hidden2 = layers.Dense(10, activation='relu')(hidden1)
concat = layers.Concatenate()([input_1, hidden2])
output = layers.Dense(1, activation='sigmoid', name='output')(concat)

model = models.Model(inputs=[input_1, input_2], outputs=[output])
model.summary()

# 예제 4: 결과를 여러개로 분리
input_ = keras.Input(shape=(10, 10), name='input_')
hidden1 = layers.Dense(100, activation='relu')(input_)
hidden2 = layers.Dense(10, activation='relu')(hidden1)
output = layers.Dense(1, activation='sigmoid', name='main_output')(hidden2)
sub_out = layers.Dense(1, name='sum_output')(hidden2)

model = models.Model(inputs=[input_], outputs=[output, sub_out])
model.summary()

# 예제 5: 다중입력 다중출력 모델
input_1 = keras.Input(shape=(10, 10), name='input_1')
input_2 = keras.Input(shape=(10, 28), name='input_2')
hidden1 = layers.Dense(100, activation='relu')(input_2)
hidden2 = layers.Dense(10, activation='relu')(hidden1)
concat = layers.Concatenate()([input_1, hidden2])
output = layers.Dense(1, activation='sigmoid', name='main_output')(concat)
sub_out = layers.Dense(1, name='sum_output')(hidden2)

model = models.Model(inputs=[input_1, input_2], outputs=[output, sub_out])
model.summary()

utils.plot_model(model) # 모델 구조 시각화

utils.plot_model을 활용한 다중입력 다중출력 모델 구조 시각화


Subclassing API

  • 커스터마이징에 최적화된 방법
  • Model 클래스를 상속받아 사용하고 모델에 포함되는 기능 사용 가능
    • fit(): 모델 학습
    • evaluate(): 모델 평가
    • predict(): 모델 예측
    • save(): 모델 저장
    • load(): 모델 불러오기
    • call(): 메소드안에서 원하는 계산 가능
  • Functional API로 구현이 어려운 모델 구현 가능. 그러나 OOP에 익숙해야 함
# Subclassing API의 예시
class MyModel(models.Model):
  def __init__(self, units=30, activation='relu', **kwargs):
    super(MyModel, self).__init__(**kwargs)
    self.dense_layer1 = layers.Dense(300, activation=activation)
    self.dense_layer2 = layers.Dense(100, activation=activation)
    self.dense_layer3 = layers.Dense(units, activation=activation)
    self.output_layer = layers.Dense(10, activation='softmax')

  def call(self, inputs):
    x = self.dense_layer1(inputs)
    x = self.dense_layer2(x)
    x = self.dense_layer3(x)
    x = self.output_layer(x)
    return x

'AI Theory > key concept of AI' 카테고리의 다른 글

가중치 초기화와 배치 정규화  (0) 2023.07.25
모델 크기 조절과 규제  (0) 2023.07.25
텐서 표현과 연산  (0) 2023.07.24
[CV] GAN 과 cGAN  (0) 2023.07.18
[NLP] Text Summarization  (0) 2023.07.17