티스토리 뷰

반응형
[딥러닝] Tensorflow 에서 모델 생성하는 법

모델 생성 방법

Tensorflow에서는 딥러닝 모델을 만드는 방법이 아래와 같이 3가지가 있습니다.

  1. Sequential 모델
  1. Functional 모델
  1. Subclassing 모델

1, 2번은 기존 Keras를 사용하셨다면 이해하기 쉽고, 3번은 pytorch와 비슷한 방법입니다. 각각 어떻게 모델을 만드는지 알아보겠습니다.

Sequential 모델

가장 구현하기 쉬운 방법입니다. Sequential 모델을 생성하여 원하는 layer를 순차적으로 add하는 방식입니다. 다만 이 방법으로는 직관적인 모델을 빠르게 구현할 수 있지만, 구조가 조금 복잡해지면 구현하기 어려울 수 있다는 단점이 있습니다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# 혹시 이미 그려둔 그래프가 있다면 clear
keras.backend.clear_session()

# model에 순차적으로 레이어를 쌓는다
model = Sequential()

# model에 층층이 추가, 첫번째 layer는 input_shape를 명시할것!
model.add(Dense(64,input_shape=(1,)))
model.add(Dense(1))

# 컴파일
model.compile(loss='mse', optimizer='sgd')

# 학습
model.fit(x, y, epochs=10, verbose=1)

# 예측
pred = model.predict(x)

Functional 모델

두번째로 Functional 모델입니다. input layer부터 output layer까지 직접 forward 순서대로 함수 끝에 입력 변수를 넣어 줍니다. 최종적으로는 Model(inputs, outputs) 과 같이 입력 layer와 출력 layer를 지정해 줌으로써 모델을 만들 수 있습니다. 무난하게 자주 사용하는 방법입니다.

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

# 혹시 이미 그려둔 그래프가 있다면 clear
keras.backend.clear_session()

# input layer생성
inputs = Input(shape=(64,))

# 이후 layer에서는 이전 출력 변수를 넣어줌
hidden = Dense(64, activation='relu')(inputs)
outputs = Dense(10, activation='softmax')(hidden)

# Model객체에 input layer, output layer(마지막 layer)을 입력
model = Model(inputs, outputs)

# 컴파일 및 학습
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=200, verbose=1)

Subclassing 모델

마지막으로 Subclassing 모델입니다. pytorch와 구현 방식이 비슷하여 개인적으로 가장 선호하는 방법입니다. 직접 모델 클래스를 생성하고 Model 모듈을 상속 받습니다. 그리고 __init__함수에는 사용할 layer들을 작성하고, call함수에는 init에서 작성한 layer에 맞게 forward 해 줍니다.

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
keras.backend.clear_session()

# pytorch와 비슷한 방법
class MyModel(Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.dense1 = Dense(64, activation='relu')
        self.dense2 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.dense1(x)
        x = self.dense2(x)
        return x
    
    def summary(self):
        inputs = Input((1, 10))
        Model(inputs, self.call(inputs)).summary()

# input입력으로 모델 생성(build를 해야하며, input_shape를 넣어줌)
model = MyModel()
model.build(input_shape=(1,10)) # (1, feature)

# 모델 요약
model.summary()

# 컴파일 및 학습
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x, y, epochs=20, verbose=1, validation_split=0.2, shuffle=True, batch_size=4)

기타 팁

모델 시각화

위에서 생성한 모델에 대해 네트워크 구조를 시각화 할 수 있습니다.

from tensorflow.keras.utils import plot_model
plot_model(model, show_shapes=True)

모델 컴파일 방법

모델을 fit 함수로 학습하기 위해서는 compile을 해야 합니다. 아래는 원하는 loss와 optimizer를 사용해서 compile 하는 방법들의 예시입니다. tensorflow에서 기본으로 제공하는 'categorical_crossentropy', 'adam', 'accuracy'등 문자열로도 구현할 수 있고, 직접 모듈을 가져와서 사용할 수 있습니다.

단, fit 함수로 학습하지 않고 tf.GradientTape()로 직접 train loop로 학습할 때에는 아래 방법이 아니라, loss와 optimizer를 직접 작성해 주어야 합니다.

# target이 one-hot encoding인 경우
model.compile(loss='categorical_crossentropy')
model.compile(loss=keras.losses.categorical_crossentropy)

# target이 int형 레이블인 경우
model.compile(loss='sparse_categorical_crossentropy')
model.compile(loss=keras.losses.sparse_categorical_crossentropy)

# optimizer도 아래와 같이 문자, 함수 모두 가능
model.compile(optimizer='adam')
model.compile(optimizer=keras.optimizers.Adam())

# metrics는 배열 형태로 지정
model.compile(metrics=['accuracy'])

# 최종 sample
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday