딥러닝_케라스 API_1. 핵심 케라스 API

주지윤·2022년 12월 1일
0

딥러닝

목록 보기
8/21
post-custom-banner

핵심 케라스 API 이해

1. Keras의 layers.Dense 클래스 구현

mnist구현 비교

import keras
  
class SimpleDense(keras.layers.Layer):
    def __init__(self, units, activation=None):
        super().__init__()
        self.units = units
        self.activation = activation
  
    def build(self, input_shape):
        input_dim = input_shape[-1]
        self.W = self.add_weight(shape=(input_dim, self.units),
                                 initializer="random_normal")
        self.b = self.add_weight(shape=(self.units,),
                                 initializer="zeros")
  
    def call(self, inputs):
        outputs = tf.matmul(inputs, self.W) + self.b
        if self.activation is not None:
            outputs = self.activation(outputs)
        return outputs

🔸 함수 내용 비교

  • input_shape == w_shape
  • add_weight(): 가중치를 간편하게 만드는 메서드
    • self.W = tf.Variable(tf.random.uniform(w_shape))

🔸 자동 크기 추론(층 만들기)

  • mnist

  • SimpleDense

input_tensor = tf.ones(shape=(2, 784))

my_dense = SimpleDense(units=32, activation=tf.nn.relu)
output_tensor = my_dense(input_tensor)
print(output_tensor.shape)

(2, 32)


🔸 __call__() 메서드: build, call 함수

  • build() 메서드

    • 상태 성성을 위한 메서드
    • 입력크기를 매개변수로 받음
    • 층이 호출될 때 자동으로 호출 = 자동 크기 추론
      : 별도의 call메서드에서 계산을 정의한 이유

  • call() 메서드

    • 계산을 따로 정의: 정방향 패스 계산

  • 기본 layer클래스의 __call__() 메서드

def __call__(self, inputs):
	if not self.built:
    	self.build(inputs.shape)
        self.built = True
    return self.call(inputs)

  • __call__() 메서드에서는 자동크기추론 외에 즉시 실행과 그래프 실행사이 전환, 입력마스킹 처리하는 등 더 많은 작업을 관리( 후에 내용 추가 )



2. layer에서 model로

🔸 케라스에서 모델을 만드는 방법

  • Sequential 모델: 단순히 층을 쌓은 것이고 하나의 입력을 하나의 출력에 매핑한다.
  • 함수형 API: 그래프 같은 모델, 사용성과 유연성 적절
  • Model 서브클래싱: 모든 것을 밑바닥부터 만들 수 있는 저수준 방법

🔸 많이 사용되는 네트워크 종류: 함수형 API, Model 서브클래싱으로 주로 만든다.

  • 2개의 가지(two_branch)를 가진 네트워크
  • 멀티헤드 네트워크
  • 잔차연결



3. model.compile/fit: 학습 과정 설정

1) compile()

🔸 예시

model.compile(optimizer = 'rmsprop',
              loss = 'binary_crossentropy',
              metrics='acc')

각각의 옵션에 맞는 함수를 사용하여야하며, 그 내용에 대해서는 간단하게는 신경망 모델의 함수알기에서 설명, 그 외 자세한 내용은 https://keras.io/guides/에서 확인


🔸 설명
1. optimizer:

  • 손실함수 기반 네트워크가 어떻게 업데이트 될 지 결정
  • 특정 종류의 확률적 경사 하강법(SGD)구현

2. loss(loss_function): (= objective function, cost function)

  • 훈련과정에서 최소화 할 값, 작업 성공의 척도

3. metrics: 측정지표

  • 훈련과 검증과정에서 모니터링할 성공의 척도


2) fit()

  • 훈련루프를 구현
history = model.fit(
    inputs,
    targets,
    epochs=5,
    batch_size=128
)

inputs: 입력 샘플(데이터, 텐서)
targets: 훈련 타깃
epochs: 훈련루프를 몇 번 돌릴 것 인가
batch_size: n개의 샘플 배치로 이 데이터를 순회

  • ex: 60000개의 데이터셋을 가진 mnist를 128개의 미니배치데이터로 나누면 469개씩 훈련하게 되는데, 이는 하나의 미니 배치 데이터를 훈련할 때 마다 가중치가 업데이트 되므로 epochs를 5로 하게 되면, 총 2345번의 업데이트를 하게 된다.



4. 검증데이터 활용: 손실과 측정지표 모니터링

  • 테스트 데이터를 아예 새로운 데이터로 인식 시키기 위해서 (실제 새로운 데이터에서 어떻게 동작하는지 예상하기 위해) 훈련데이터를 다시 훈련과 검증데이터로 나눈다.
  • 검증데이터로 손실과 측정지표를 모니터링하여 모델의 학습이 새로운 데이터에 유용한 지 확인한다.
  • evaluate(): 훈련이 끝난 후 검증손실과 측정 지표를 계산


5. 추론하기

prediction = model.predict(new_inputs, batch_size = 128)
  • 완전히 새로운 데이터에 적용하여 예측해 본다.
  • 각 입력 샘플에 대한 모델의 예측을 나타내는 스칼라 점수를 리스트로 반환
  • 각각의 리스트에서 가장 높은 값이 최종 추론한 값이 된다.
    ex: mnist에서 최종 outputs을 10으로 설정(0~9)하였다면, 각각의 이미지마다 10개의 스칼라점수를 반환하는데 이 10개의 스칼라값 중 가장 높은 값을 가지는 스칼라점수가 그 이미지의 최종 추론 값이다.
post-custom-banner

0개의 댓글