Функциональный API Keras: LTSM возвращает двумерный массив

Я стекаю, и мне нужна мудрость stackoverflow.

У меня есть нейронная сеть с двумя входами, реализованная в Keras с использованием Функционального API, входные формы:

X.shape, X_size.shape, y.shape

((123, 9), (123, 2), (123, 9, 10))

Итак, моя проблема в том, что я хочу, чтобы форма вывода из LSTM имела трехмерную форму, чтобы использовать мой тензор y. Я знаю, что могу преобразовать мою y в двумерную форму, но я хочу использовать ее как трехмерный массив.

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

# first input 

list_input = Input(shape=(None,), dtype='int32', name='li')
embedded_list = layers.Embedding(100,90)(list_input)
encoded_list = layers.LSTM(4,  name = "lstm1")(embedded_list)

# second input 
size_input = Input(shape=(None,), dtype='int32', name='si')
embedded_size = layers.Embedding(100,10)(size_input)
encoded_size = layers.LSTM(4, name = "lstm2")(embedded_size)

# concatenate
concatenated = layers.concatenate([encoded_size, encoded_list], axis=-1)

answer = layers.Dense(90, activation='sigmoid', name = 'outpuy_layer')(concatenated)


model = Model([list_input, size_input], answer)
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=[f1])

Краткое описание модели:

____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
si (InputLayer)                  (None, None)          0                                            
____________________________________________________________________________________________________
li (InputLayer)                  (None, None)          0                                            
____________________________________________________________________________________________________
embedding_16 (Embedding)         (None, None, 10)      1000        si[0][0]                         
____________________________________________________________________________________________________
embedding_15 (Embedding)         (None, None, 90)      9000        li[0][0]                         
____________________________________________________________________________________________________
lstm2 (LSTM)                     (None, 4)             240         embedding_16[0][0]               
____________________________________________________________________________________________________
lstm1 (LSTM)                     (None, 4)             1520        embedding_15[0][0]               
____________________________________________________________________________________________________
concatenate_8 (Concatenate)      (None, 8)             0           lstm2[0][0]                      
                                                                   lstm1[0][0]                      
____________________________________________________________________________________________________
outpuy_layer (Dense)             (None, 90)            810         concatenate_8[0][0]              
====================================================================================================
Total params: 12,570
Trainable params: 12,570
Non-trainable params: 0

Еще раз вопрос:

Как получить форму вывода из таких LSTM, как (None, None, None / 10)?


person Paddy    schedule 08.08.2017    source источник


Ответы (1)


Keras игнорирует каждый вывод временного шага, кроме последнего по умолчанию, который создает 2D-массив. Чтобы получить трехмерный массив (то есть вы получаете результат каждого временного шага), создайте экземпляр слоя с return_sequences, установленным на True. В вашем случае например:

encoded_list = layers.LSTM(4,  name = "lstm1", return_sequences=True)(embedded_list)
person Mach_Zero    schedule 09.08.2017