신경망 모델이나 최적화 방법을 주어진 문제에 맞게 변형할 경우 필요한 고급 기능
- Lambda Layer
- 백엔드(K) 함수
- 개별 엔진 직접 호출 함수
[Lambda 계층]
- 케라스 패키지에서 제공하지 않는 새로운 인공신경망 기능을 추가 하는 법
- 구현 2가지 방법
- 케라스 Lambda 계층과 파이썬 lambda를 이용하는 방법
- lambda를 이용하기 복잡할 때 함수를 만들어서, kshape 은 출력 벡터의 크기를 정의. 함수로 람다 계층을 처리 할 때 함수 내부에서 입력 벡터의 모양을 변경하는 경우 사용. 여기서는 입력 벡터와 같은 출력 벡터가 나간다고 가정함. 만약 출력 벡터가 입력 벡터에 비해 두 배로 커지는 경우는 input_shape[1] *= 2 처럼 처리.
- input_shape[0] 은 batch size
1 2 3 4 5 6 7 8 |
from keras.layers import Lambda, Input from keras.models import Model x = Input((1,)) y = Lambda(lambda v : v + 1) (x) m = Model(x, y) yp = m.predict_on_batch([1, 2, 3]) print(yp) |
1 2 3 4 5 6 7 8 9 |
def kproc(x): return x ** 2 + 2 * x + 1 def kshape(input_shape): return input_shape x = Input((1,)) y = Lambda(kproc, kshape)(x) m = Model(x, y) |
[백엔드 함수 활용]
- 케라스 백엔드 함수들을 사용하면 다른 엔진의 함수들을 같은 이름과 방법으로 접근해 사용 할 수 있음
- 예시, 백엔드 함수들을 이용하여 Lambda 계층 만들기
- 케라스에서, 모델을 구성 시 일반적으로 x[배치 크기, 피쳐 크기]일 때 input_shape=(피쳐 크기,)라고만 입력하면 되지만 Lambda를 활용한 계층 내부 함수들은 배치 크기와 피쳐 크기를 모두 처리해야함.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
from keras import backend as K def kproc_concat(x): m = K.mean(x, axis=1, keepdims=True) d1 = K.abs(x - m) d2 = K.square(x - m) return K.concatenate([x, d1, d2], axis=1) #출력이 입력 대비 3배로 늘어났음을 알리는 크기 정의함수 def kshape_concat(input_shape): output_shape = list(input_shape) output_shape[1] *= 3 return tuple(output_shape) x = Input((3,)) y = Lambda(kproc_concat, kshape_concat)(x) m = Model(x, y) |
- 예시, 백엔드 함수는 손실 함수를 만드는 데도 사용할 수 있음
1 2 |
def mean_squared_error(y_true, y_pred): return K.mean(K.square(y_pred - y_true), axis= - 1) |
[엔진 전용 함수 사용하기]
- 때로는 각 엔진에 특화된 기능을 만들 필요가 있음, 가령 구글 텐서플로
- 케라스의 백엔드 패키지가 개별 엔진이 제공하는 모든 함수를 제공하는 것은 아님. 이 경우 각 엔진의 함수를 직접 사용하여 문제를 해결 할 수 있음
1 2 3 4 5 6 7 |
import tensorflow as tf def kproc_concat(x): m = tf.reduce_mean(x, axis=1, keep_dims=True) d1 = tf.abs(x - m) d2 = tf.square(x - m) return tf.concat([x, d1, d2], axis=1) |
- 케라스 백엔드와 텐서플로 엔진의 함수 이름과 사용 방법에는 약간 차이가 있을 수 있음. 가령 K.concatenate() vs tf.concat()
- 케라스에서는 전용 함수를 호출할 때 추가 코딩 없이도 백엔드 함수처럼 바로 사용 할 수 있어 부담이 없음