Как реализовать пользовательский слой с несколькими выходами в 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__)
Другие вопросы по тегам