Как реализовать пользовательский слой с несколькими выходами в Keras?
Как указано в заголовке, мне было интересно, как сделать так, чтобы пользовательский слой возвращал несколько тензоров: out1, out2,...outn?
Я старался
keras.backend.concatenate([out1, out2], axis = 1)
Но это работает только для тензоров, имеющих одинаковую длину, и это должно быть другое решение, а не конкатенация два на два тензора каждый раз, не так ли?
1 ответ
В call
Метод вашего слоя, где вы выполняете вычисления слоя, вы можете вернуть список тензоров:
def call(self, inputTensor):
#calculations with inputTensor and the weights you defined in "build"
#inputTensor may be a single tensor or a list of tensors
#output can also be a single tensor or a list of tensors
return [output1,output2,output3]
Позаботьтесь о выходных формах:
def compute_output_shape(self,inputShape):
#calculate shapes from input shape
return [shape1,shape2,shape3]
Результатом использования слоя является список тензоров. Естественно, некоторые виды слоев keras принимают списки в качестве входных данных, другие нет.
Вы должны правильно управлять выходами, используя функциональный API Model
, Вы, вероятно, будете иметь проблемы с использованием Sequential
модель при наличии нескольких выходов.
Я проверил этот код на своей машине (Keras 2.0.8), и он отлично работает:
from keras.layers import *
from keras.models import *
import numpy as np
class Lay(Layer):
def init(self):
super(Lay,self).__init__()
def build(self,inputShape):
super(Lay,self).build(inputShape)
def call(self,x):
return [x[:,:1],x[:,-1:]]
def compute_output_shape(self,inputShape):
return [(None,1),(None,1)]
inp = Input((2,))
out = Lay()(inp)
print(type(out))
out = Concatenate()(out)
model = Model(inp,out)
model.summary()
data = np.array([[1,2],[3,4],[5,6]])
print(model.predict(data))
import keras
print(keras.__version__)