[Tensorflow] 모델 구현하기 3

ehekaanldk·2024년 2월 4일

Tensorflow

목록 보기
6/6

sequential API

tf.keras.models.Sequential([]) 로 list의 형태로 layer 들을 넣어주고 compile , fit, evaluate 과정으로 모델을 생성하는 방법

# 예시
model = Sequential([
	Dense(5, actication='relu', input_shape=(4,)),
	Dense(10, activation='relu'),
	Dense(3, activation='softmax'),
])

model.summary()

model = tf.keras.Sequential()add() 함수를 사용해서 tensorflow가 미리 만들어준 Dense layer와 같은 layer를 넣어준다.

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(8))
model.add(tf.keras.layers.Dense(1))

model.compile(optimizer='sgd', loss='mse')
model.fit(x, y, batch_size=32, epochs=10)

functional API

배우지 않았음

input를 마치 함수처럼 사용해서 layer의 뒤에 붙여주고 x에 return을 넣어줌을써 연쇄적으로 반응하도록 한다. 모델을 만들면서 한번에 통과시킨다.

# 예시
inputs = Input(shape=(4,))

x = Dense(5, activation='relu')(input)
x = Dense(10, activation='relu')(x)
outputs = Dense(3, activation='softmax')(x)

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

model.summary()

model subclassing

model subclassing

# 예시
class ResnetIdentityBlock(tf.keras.Model):
  def __init__(self, kernel_size, filters):
    super(ResnetIdentityBlock, self).__init__(name='')
    filters1, filters2, filters3 = filters

    self.conv2a = tf.keras.layers.Conv2D(filters1, (1, 1))
    self.bn2a = tf.keras.layers.BatchNormalization()

    self.conv2b = tf.keras.layers.Conv2D(filters2, kernel_size, padding='same')
    self.bn2b = tf.keras.layers.BatchNormalization()

    self.conv2c = tf.keras.layers.Conv2D(filters3, (1, 1))
    self.bn2c = tf.keras.layers.BatchNormalization()

  def call(self, input_tensor, training=False):
    x = self.conv2a(input_tensor)
    x = self.bn2a(x, training=training)
    x = tf.nn.relu(x)

    x = self.conv2b(x)
    x = self.bn2b(x, training=training)
    x = tf.nn.relu(x)

    x = self.conv2c(x)
    x = self.bn2c(x, training=training)

    x += input_tensor
    return tf.nn.relu(x)

block = ResnetIdentityBlock(1, [1, 2, 3])

custom layer subclassing

add() 함수로 많이 늘어나는 모델을 inception model 을 통해 여러개의 모듈을 만들어 놓은 상태에서 custom layer를 만들고 add() 함수에 넣어줌으로써 가시성이 있게 만들어 줄 수 있다.

사용자 정의층을 만들어본다.

이전의 tf.keras.model 과 달리 class MyDenseLayer(tf.keras.layers.Layer): 로 만들어진다. custom layer를 만들 때, model subclassing을 통해서 만들고 model.add() 를 사용해서 작성한다.

class MyDenseLayer(tf.keras.layers.Layer):
  def __init__(self, num_outputs):
    super(MyDenseLayer, self).__init__()
    self.num_outputs = num_outputs

  def build(self, input_shape):
    self.kernel = self.add_weight("kernel",
                                  shape=[int(input_shape[-1]),
                                         self.num_outputs])

  def call(self, inputs):
    return tf.matmul(inputs, self.kernel)

layer = MyDenseLayer(10)

모델 내에 들어가는 layer 들이 custom layer 일 때 layer를 subclass으로 해준다. 모델의 내부에 sequential 로 custom layer 를 넣어준다.

tf.keras.models

  • model : tf.keras.model ⇒ fit. evaluate, predict 사용 가능하다. (모델 전체를 의미)
  • sequential : tf.keras.sequential

tf.keras.layers

  • layers ⇒ custom layer는 fit. evaluate, predict 사용 불가능하다.
  • Dense
  • Flatten
  • Conv2D

0개의 댓글