AI/TensorFlow & Keras

[Keras] Keras 기반 신경망 구축 방법

#자유의날개 2022. 4. 27. 16:35
반응형

신경망을 구축하기 위해 Keras에서 제공하는 방법 세 가지에 대해 정리했습니다.

1. Sequential API


매우 간단하지만 단일 입력, 단일 출력 레이어 스택으로 제한됨

  • Sequential 안에 layer 목록을 전달하는 방법
model = keras.Sequential(
    [
        layers.Dense(2, activation="relu", name="layer1"),
        layers.Dense(3, activation="relu", name="layer2"),
        layers.Dense(4, name="layer3"),
    ]
)

x = tf.ones((3, 3))
y = model(x)
  • layer들을 직접 연결하는 방법
layer1 = layers.Dense(2, activation="relu", name="layer1")
layer2 = layers.Dense(3, activation="relu", name="layer2")
layer3 = layers.Dense(4, name="layer3")

x = tf.ones((3, 3))
y = layer3(layer2(layer1(x)))
  • add() 를 통해 점진적으로 연결하는 방법
model = keras.Sequential(name="my_sequential")
model.add(layers.Dense(2, activation="relu", name="layer1"))
model.add(layers.Dense(3, activation="relu", name="layer2"))
model.add(layers.Dense(4, name="layer3"))

2. Functional API


다중 입력, 다중 출력, 레이어 공유, 유향 비순환 그래프(DAG) 등 처리 가능

  • x 출력으로 layer를 전달하는 방법
inputs = keras.Input(shape=(32, 32, 3))
x = layers.Dense(2, activation="relu", name="layer1")(inputs)
x = layers.Dense(3, activation="relu", name="layer2")(x)
x = layers.Dense(4, name="layer3")(x)
outputs = layers.Dense(10)(x)

model = keras.Model(inputs=inputs, outputs=outputs, name="mnist_model")​
  • 복잡한 layer 구성 가능
inputs = keras.Input(shape=(32, 32, 3), name="img")
x = layers.Conv2D(32, 3, activation="relu")(inputs)
x = layers.Conv2D(64, 3, activation="relu")(x)
block_1_output = layers.MaxPooling2D(3)(x)

x = layers.Conv2D(64, 3, activation="relu", padding="same")(block_1_output)
x = layers.Conv2D(64, 3, activation="relu", padding="same")(x)
block_2_output = layers.add([x, block_1_output])

x = layers.Conv2D(64, 3, activation="relu", padding="same")(block_2_output)
x = layers.Conv2D(64, 3, activation="relu", padding="same")(x)
block_3_output = layers.add([x, block_2_output])

x = layers.Conv2D(64, 3, activation="relu")(block_3_output)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(256, activation="relu")(x)
x = layers.Dropout(0.5)(x)
outputs = layers.Dense(10)(x)

model = keras.Model(inputs, outputs, name="resnet")

3. Model Subclassing API


표준적이고 잘 알려진 신경망을 구성하는 대신 자신만의 특수한 신경망을 만들 때 유용함

복잡도 측면에서는 더 높은 비용이 듬

  • 서브클래싱을 하고 아래와 같은 method 구성
  1. __init__() : 선택적으로 이 신경망에서 사용할 모든 하위 layer를 정의하는 데 사용
  2. build() : layer의 가중치를 생성할 때 사용
  3. call() : 순방향 전달을 정의, layer가 호출되고 함수 형식으로 체인되는 곳
class Linear(keras.layers.Layer):
    def __init__(self, units=32):
        super(Linear, self).__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer="random_normal",
            trainable=True,
        )
        self.b = self.add_weight(
            shape=(self.units,), initializer="random_normal", trainable=True
        )

    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b
반응형

'AI > TensorFlow & Keras' 카테고리의 다른 글

[Keras] Keras Applications 사용 방법  (0) 2022.04.29
Model Trainer 구성 요소  (1) 2022.04.26