딥러닝 (Deep Learning)/tensorflow, keras

[tensorflow, keras] 딥러닝 기본 코드(2-1) 모델의 구성(Sequential, API함수, 서브클래싱)

DS지니 2021. 10. 14. 18:08
728x90
반응형
[youtube] Deep Learning Full Tutorial Course using TensorFlow and Keras - 이수안컴퓨터연구소 참고

 

🧡목차

딥러닝 구조 및 학습

 

2. 모델(Model)

1) 딥러닝모델을 구성하는 3가지 방법

- Sequential

- API함수

- 서브클래싱(Subclassing)

 


 

딥러닝 구조 및 학습

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

 

 

 

2. 모델(Model)

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

 

1) 딥러닝 모델을 구성하는 법 3가지

  1. Sequential()
  2. 함수형 API
  3. 서브클래싱(Subclassing)

 

1) 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 #모델을 이미지로 출력
# 방법1 - add
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() #input정보 없음
#방법2 - list
model = Sequential([Input(shape=(28,28), name='Input'),
                    Dense(300, activation='relu', name='Dense1'),
                    Dense(100, activation='relu', name='Dense2'),
                    Dense(10, activation='softmax', name='Output')])
model.summary()

# 모델 이미지 출력
plot_model(model)

 

 

 

2) 함수형 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='softmax')(x)

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

 

#좀 더 복잡한 모델 만들기 - 유닛합치기(concat)

from tensorflow.keras.layers import Concatenate

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

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

plot_model(model)

# 입력2개, 출력2개인 복잡한 모델 만들기

input_1 = Input(shape=(10, 10), name='input_1')
input_2 = Input(shape=(10, 28), name='input_2')
hidden1 = Dense(100, activation='relu')(input_2)
hidden2 = Dense(10, activation='relu')(hidden1)
concat = Concatenate()([input_1, hidden2])
output = Dense(1, activation='sigmoid', name='main_output')(concat)
sub_out = Dense(1, name='sum_output')(hidden2)

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

plot_model(model)

 

 

3) 서브클래싱(Subclassing)

  • 커스터마이징에 최적화된 방법
  • Model 클래스를 상속받아 Model이 포함하는 기능을 사용할 수 있음
    • fit(), evaluate(), predict()
    • save(), load()
  • 주로 call() 메소드안에서 원하는 계산 가능
    • for, if, 저수준 연산 등
  • 권장되는 방법은 아니지만 어떤 모델의 구현 코드를 참고할 때, 해석할 수 있어야함

 

class MyModel(Model):
  def __init__(self, units=30, activation='relu', **kwargs):
    super(MyModel, self).__init__(**kwargs)
    self.dense_layer1 = Dense(300, activation=activation)
    self.dense_layer2 = Dense(100, activation=activation)
    self.dense_layer3 = Dense(units, activation=activation)
    self.output_layer = Dense(10, activation='softmax')

  def call(self, inputs):
    x = self.dense_layer1(inputs)
    x = self.dense_layer2(x)
    x = self.desne_layer3(x)
    x = self.output_layer(x)
    return x
728x90
반응형