NeuroWhAI의 잡블로그

[Keras] 레이어 직접 만들기 본문

개발 및 공부/라이브러리&프레임워크

[Keras] 레이어 직접 만들기

NeuroWhAI 2018. 4. 8. 10:29


※ 이 글은 '코딩셰프의 3분 딥러닝 케라스맛'이라는 책을 보고 실습한걸 기록한 글입니다.


케라스의 Layer 클래스를 상속받아서 새로운 레이어를 직접 만들어 써보는 예제입니다.
간단하게 Dense와 비슷한 레이어를 만들었습니다.
공식 문서에도 비슷한 예제가 소개되어 있습니다.

코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from keras import backend as K
from keras.engine.topology import Layer
from keras import initializers
from keras import models
import numpy as np
 
class SFC(Layer):
  def __init__(self, n_units, **kwargs):
    self.n_units = n_units
    super().__init__(**kwargs)
    
  def build(self, inshape):
    self.w = self.add_weight("w", (inshape[1], self.n_units),
                            initializer=initializers.get('glorot_uniform'))
    self.b = self.add_weight("b", (self.n_units,),
                            initializer=initializers.get('zeros'))
    super().build(inshape)
    
  def call(self, x):
    return K.dot(x, self.w) + self.b
  
  def compute_output_shape(self, inshape):
    return (inshape[0], self.n_units)
  
= np.array([01234])
= x * 2 + 1
 
model = models.Sequential()
model.add(SFC(1, input_shape=(1,)))
model.compile('SGD''mse')
 
model.fit(x[:2], y[:2], epochs=1000, verbose=0)
print('Target:', y[2:])
print('Predictions:', model.predict(x[2:]).flatten())
cs

결과:
Target: [5 7 9]
Predictions: [4.957632 6.9269743 8.896317 ]


keras.engine.topology.Layer를 상속받아 새로운 레이어 클래스를 만들 수 있습니다.
주로 구현해야할 메소드는 build, call, compute_output_shape입니다.
이름에서 알 수 있듯이 build는 레이어를 초기화하며
call은 입력을 처리해서 결과를 반환하며
compute_output_shape은 입력 모양이 주어졌을때 출력 모양을 알려주는 역할을 합니다.

build 메소드에서 add_weight 메소드를 사용해 가중치를 만들어주고 있습니다.
첫번째 파라미터는 이름, 두번째는 모양, 세번째는 초기화 방법입니다.
inshape은 입력의 모양인데 0번째는 배치 크기를 의미합니다.
inshape의 1번째는 한 배치당 입력의 크기가 됩니다.
두 행렬의 곱 AxB가 성립하려면 A의 열과 B의 행 크기가 같아야 하므로 저렇게 되어있습니다.
초기화 방법 중 하나인 glorot_uniform은 [-limit, limit]의 범위의 정규분포로 초기화 하는데
이때 limit은 sqrt(6 / (fan_in, fan_out))이라고 합니다.
무슨 의미인지는 뭐 수학적인거니까 저도 모릅니다 ...

call 메소드에서는 입력 데이터 x를 가중치 w와 곱한뒤 편향 b를 더해서 반환하고 있습니다.
전형적인 선형 함수의 모습입니다.

compute_output_shape에서는 입력 모양인 inshape를 받아서 출력 모양을 계산해 반환하고 있습니다.
(a, b) * (b, c) 이렇게 행렬을 곱하면 (a, c) 모양이 되니까 저렇게 되어있습니다.

나머진 이렇게 만든 레이어를 직접 모델에 넣어 써보는 부분입니다.


끝!




Comments