반응형
신경망을 구축하기 위해 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 구성
- __init__() : 선택적으로 이 신경망에서 사용할 모든 하위 layer를 정의하는 데 사용
- build() : layer의 가중치를 생성할 때 사용
- 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 |