단순한 상태 유지 없는 사용자 지정 작업에 대해서는 layers.core.Lambda
계층을 그냥 쓰는 것이 아마 더 좋을 것입니다. 그러나 훈련 가능한 가중치가 있는 사용자 지정 작업에 대해서는 자신만의 계층을 직접 구현해야만 합니다.
현재 Keras 2.0에 맞춘(만약 구 버전을 가지고 있다면 업그레이드 해 주세요) Keras 계층의 골격이 여기 있습니다. 구현해야 할 메소드는 딱 세개 밖에 없습니다:
build(input_shape)
: 가중치를 정의합니다. 이 메소드에서는 self.built = True
를 반드시 설정하여야 하며 이는super([Layer], self).build()
를 호출하여 수행할 수 있습니다.call(x)
: 계층의 로직이 있는 곳입니다. 계층이 마스킹을 지원하지 않기를 원한다면, call
로 전달되는 첫번 째 인자, 즉 입력 텐서만 신경 쓰면 됩니다.compute_output_shape(input_shape)
: 계층이 입력 텐서의 형태를 변경한다면, 여기에 형태 변환 로직을 명시해야 합니다. 이것은 Keras로 하여금 자동으로 형태를 추론할 수 있도록 합니다.from keras import backend as K
from keras.engine.topology import Layer
import numpy as np
class MyLayer(Layer):
def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)
def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this somewhere!
def call(self, x):
return K.dot(x, self.kernel)
def compute_output_shape(self, input_shape):
return (input_shape[0], self.output_dim)
구현 방법에 대해서는 어떤 것이라도 기존의 Keras 계층이 좋은 예제가 될 수 있을 것입니다. 소스 코드를 읽는 것을 절대 망설이지 마세요!
이 문서는 Keras의 Writing your own Keras layers을 번역한 것입니다.