📌 이 글은 권철민님의 딥러닝 CNN 완벽 가이드를 바탕으로 정리한 내용입니다.


목차

  1. Sequential Model
  2. Sequential Model vs Functional API
  3. Functional API
  4. Functional API의 개요
  5. 연속적으로 이어지는 Function의 예
  6. Functional API의 필요성
  7. Keras Functional API 적용
  8. Keras Functional API 사용 예

Sequential Model

# Sequential Model을 이용하여 Keras 모델 생성 
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.models import Sequential

INPUT_SIZE = 28

model = Sequential([
    Flatten(input_shape=(INPUT_SIZE, INPUT_SIZE)),
    Dense(100, activation='relu'),
    Dense(30, activation='relu'),
    Dense(10, activation='softmax')
])

model.summary()

model1 = Sequential()
model1.add(Flatten(input_shape=(INPUT_SIZE, INPUT_SIZE)))
model1.add(Dense(100, activation='relu'))
model1.add(Dense(30, activation='relu'))
model1.add(Dense(10, activation='softmax'))

model1.summary()

Sequential 로 만들어지는 모델은 다양한 유형의 모델이 안 만들어진다.

물론 쉽게 모델을 만들 수는 있지만 케라스 모델의 핵심은 Functional API이다.


Sequential vs Functional API

일반적으로 Sequential 사용하여 모델을 만들면 쉽게 만들 수 있다.

그러나 케라스의 핵심은 Functional API이다. 쉽다고 Sequential로 계속 만들면 안된다.

처음부터 Functional API로 모델을 생성하고 간단한 모델을 만들 때만 Sequential을 이용하자.


Fucntional API

from tensorflow.keras.layers import Input, Flatten, Dense
from tensorflow.keras.models import Model

input_tensor = Input(shape=(INPUT_SIZE, INPUT_SIZE))
x = Flatten()(input_tensor)
x = Dense(100, activation='relu')(x)
x = Dense(30, activation='relu')(x)
output = Dense(10, activation='softmax')(x)

model = Model(inputs=input_tensor, outputs=output)

model.summary()

Functional API를 만들 때에는 Input을 반드시 명시해주어야 한다.

왜냐면 모델을 만들때 Input이 뭐냐고 인자에 물어보기 때문이다.

 

 

model = Model(inputs=input_tensor, outputs=output)

Input이 뭡니까 라고 들어오면, 그러면 나는 출력을 output으로 시켜주겠습니다 라고 output 인자까지 넣어준다.

그래서 모델이라는 것을 만든다.

 

input_tensor = Input(shape=(INPUT_SIZE, INPUT_SIZE))
x = Flatten()(input_tensor)
x = Dense(100, activation='relu')(x)
x = Dense(30, activation='relu')(x)
output = Dense(10, activation='softmax')(x)

이렇게 Input tensor 을 만들고,

그 다음에 우리가 사용하고자 하는 Layer를 만든다.

 

나는 2차원을 깔아 뭉개고 싶어요 하면 Flatten 객체를 만들어준다.

그런데 객체 뒤에 또 입력 인자가 들어간다. 

Flatten()(input_tensor) 이렇게.

 

이게 가장 큰 차이이다.

 

그러려거니 하면 안되고 정확히 알고 가자.

레이어를 구성하는 주요인자Flatten( 여기 ) 에 넣고,

레이어의 입력이 되는 데이터Flatten()( 여기 ) 에 넣는다.

 

Flatten()은 입력을 뭉개고

Dense에서는 앞에서 나온 output을 다시 인자로 넣는다.

다시 Dense로 앞에서 나온 output을 다시 인자로 넣는다.


Functional API 개요

객체를 호출하든, 함수를 호출하든 입력이 있고 출력이 있다.

그렇다면 Functional API는 객체인가 함수인가?

 

 

앞에는 생성자 파라미터 (param1, param2)가 존재하고,

그 뒤에 (data) 를 입력을 받는다.

그리고 output 을 뽑아내는 구조이다.


연속적으로 이어지는 Function 작용의 예

func1()은 리턴값(retrun a+b)이 output이 되고,

그 output이 다시 input이 되어 다시 output을 만드는 구조이다.

G의 인자 값을 F의 output 값으로 쓴다.

G의 input = F 의 output

H의 input = G의 output

 

입력 값이 있고, 또 다른 인자가 필요한 구조이다.

 


Functional API의 필요성

 

첫번째 layer = [w1 → weighted Sum (w1*x) → Activation function → output1]

두번째 layer = [w2 → weighted Sum (w2*output1) → Activation function → output2]

 

위처럼 Layer를 잇는 것을 Chain logic 이라고도 한다.


Keras Functional API 적용

Conv2D의 경우, 주요 파라미터를 먼저 넣고 그 다음에 입력 데이터 값을 집어 넣는다.

 

input_tensor = Input(shape=(224, 224, 3)
conv_out_01 = Conv2D(filter=32, kernel_size=3)(input_tensor) 
conv_out_02 = Conv2D(filter=64, kernel_size=3)(conv_out_01)

이런 로직으로 모델을 만든다.


Keras Functional API 사용 예

input_tensor = Input(shape=(32, 32, 3))
x = Conv2D(filters=32, kernel_size=(3, 3), padding='valid')(input_tensor)
x = ReLU()(x)
x = Conv2D(filters=64, kernel_size=(3, 3), padding='valid', activation='relu')(x) 
x = MaxPooling2D(pool_size=(2, 2))(x)
  1. input tensor를 반드시 만들어야 한다.
  2. 그 다음 내가 적용하려는 연산의 layer를 만들어 준다. 그 layer는 반드시 처리해야할 데이터를 입력 받는다.
  3. Activation 적용
  4. Activation의 output이 다음 layer의 input으로 들어간다.
  5. MaxPooling

 

Sequential 은 좀더 쉽게 쓰여질 뿐이다.

'🖼 Computer Vision > CNN' 카테고리의 다른 글

CNN - Fashion_MNIST 분석  (0) 2022.02.12
Fashion_mnist 예측 모델 구현하기  (0) 2022.01.27
CNN - Image Array  (0) 2022.01.20
CNN - Training Epoch, Batch Size, Learning Rate  (0) 2022.01.20
CNN - Optimizer  (0) 2022.01.20
복사했습니다!