본문 바로가기

Study/딥러닝

[keras] Lambda 계층

 케라스는 패키지에서 제공하지 않는 새로운 인공신경망의 기능을 추가하는 다양한 방법을 제공합니다. 가장 간단한 방법은 Lambda 클래스를 이용하는 겁니다. 이 클래스를 이용하면 새로운 계층을 파이썬의 lambda 함수처럼 간단하게 만들어 사용할 수 있고, Lambda 계층을 이용하면 인공신경망에 새로운 계층을 쉽게 만들 수 있습니다.

 

 Lambda 계층은 2가지 방법으로 구현할 수 있습니다. 첫 번째는 파이썬의 lambda 함수와 같이 사용하는 방법입니다. 두 번째는 Lambda 계층의 전용 함수를 만들어서 사용하는 방법입니다. 

 

1. 케라스 Lambda 계층과 파이썬 lambda를 이용하는 방법

 파이썬의 lambda 함수와 함께 사용하는 방법은 매우 간단합니다. 예를 들어 입력이 하나 들어오면 그 입력에 1을 더해서 출력하는 아주 단순한 인공 신경망을 만든다고 가정합시다.

 

먼저 케라스 서브패키지들을 불러옵니다.

from keras.layers import Lambda, Input
from keras.models import Model

 여기서 Lambda는 지금 다룰 Lambda 계층을 만드는 클래스입니다.

 이제 초간단 인공신경망을 하나 만들겠습니다.

 

x = Input((1,))
y = Lambda(lambda x: x+1)(x)
m = Model(x, y)

 첫 줄은 인공신경망의 입력 원소 수가 1개라는 의미입니다. 배치 단위로 여러 입력이 들어갈 수 있지만 각 입력의 길이는 1로 고정됩니다.

 두 번째 줄의 Lambda(lambda x:x+1)(x)가 바로 Lambda 계층을 사용한 예입니다. 입력값에 상수 1을 더해서 출력하겠다는 의미입니다. 벌써 새로운 인공신경망 계층을 만들었습니다.

 

이 초간단 모델에는 최적화할 가중치가 없으니 컴파일 없이 곧바로 수행하겠습니다.

yp = m.predict_on_batch([1,2,3])
print("np.array([1,2,3]) + 1:")
print(yp)

 수행에 predict_on_batch 멤버 함수를 사용했습니다. 이 함수는 입력 데이터를 전부 모델에 넣기 때문에 지금처럼 배치 기능을 사용하지 않거나 배치 방식을 사용자가 직접 만들 때 사용됩니다.

 

그 결과는 예쌍한 대로 입력인 [1,2,3]에 1이 더해진 형태로 나오게 됩니다.

np.array([1,2,3]) + 1:
[[ 2.]
[ 3.]
[ 4.]]

 

 

2. 케라스 Lambda 계층 전용 함수를 활용하는 방법

 이번에는 Lambda 전용 함수를 이용해보겠습니다. 파이썬 lambda 함수로 구현하기에는 복잡도가 높을 때 이 방법이 유용합니다. 함수 두 개를 만듭니다.

 

 첫 번째는 Lambda 처리 함수입니다.

def kproc(x):
    return x ** 2 + 2 * x + 1

이 Lambda 처리 함수는 입력 벡터를 처리해 출력 벡터로 내보냅니다. 여기서는 또 다른 쉬운 사례로 간단한 방정식을 계산하는 함수를 만들었습니다.

 

 두 번째 출력 벡터의 크기를 정의하는 함수를 따로 만듭니다. 함수로 Lambda() 계층을 처리할 때 함수 내부에서 입력ㅂ 벡터의 모양을 번경하는 경우도 있기 때문에 이 함수가 필요합니다.

def kshape(input_shape_):
    return input_shape

여기서는 입력 벡터와 같은 모양의 출력이 나간다고 가정했습니다. 만약 출력 벡터가 입력 벡터에 비해 두 배로 커지는 경우는 input_shape[1] *=2 처럼 처리해주어야 합니다. 여기서 input_shape[0]이 아니라 input_shape[1]을 두 배로 늘려준 데는 이유가 있습니다. input_shape[0]은 배치 크기 또는 전체 입력 크기를 나타내고 input_shape[1]이 각 입력의 크기를 나타내기 때문입니다.

 

 이제 Lambda()계층을 이용하는 모델을 만듭니다.

x = Input((1,))
y = Lambda(kproc, kshape)(x)
m = Model(x, y)

 출력하면 다음과 같이 각 입력에 대해 간단한 이차방정식을 계산한 결과가 나옵니다.

np.array([1,2,3])+ 1:
[[ 4.]
[ 9.]
[16.]]

'Study > 딥러닝' 카테고리의 다른 글

Face-similarity 정리  (0) 2021.04.18