Исключение в модели Sequence-to-Sequence в Keras
Я пытаюсь построить последовательность для модели последовательности в Керасе, используя LSTM и плотную нейронную сеть. Кодер кодирует вход, кодированное состояние и входы затем соединяются и подаются в декодер, который представляет собой нейронную сеть с плотностью lstm +, которая выводит категориальные метки во времени. Вот как выглядит мой код
from keras.utils import to_categorical
from keras.layers import Embedding, Bidirectional, GRU, Dense, TimeDistributed, LSTM, Input, Lambda
from keras.models import Sequential, Model
import numpy as np
from keras import preprocessing
import keras
encoder_inputs_seq = Input(shape=(114,))
encoder_inputs = Embedding(input_dim= 1000 + 1, output_dim = 20)(encoder_inputs_seq)
x, state_h, state_c = LSTM(32, return_state=True)(encoder_inputs)
states = [state_h, state_c]
decoder_lstm = LSTM(32, return_sequences=True, return_state=True)
decoder_dense = Dense(9, activation='softmax')
all_outputs = []
input_state = keras.layers.RepeatVector(1)(state_h)
for i in range(5):
# Run the decoder on one timestep
new_input = keras.layers.concatenate([input_state, keras.layers.RepeatVector(1)(encoder_inputs[:, 1, :])], axis = -1)
outputs, state_h, state_c = decoder_lstm(new_input,
initial_state=states)
outputs = decoder_dense(outputs)
# Store the current prediction (we will concatenate all predictions later)
all_outputs.append(outputs)
# Reinject the outputs as inputs for the next loop iteration
# as well as update the states
states = [state_h, state_c]
input_state = keras.layers.RepeatVector(1)(state_h)
decoder_outputs = Lambda(lambda x: keras.layers.concatenate(x, axis=1))(all_outputs)
model = Model(encoder_inputs_seq, decoder_outputs)
model.summary()
Я сталкиваюсь со следующим исключением
AttributeError: 'NoneType' object has no attribute '_inbound_nodes'
Куда я здесь не так?
1 ответ
Проблема в том, что вы нарезаете тензор (encoder_inputs[:, 1, :]
без упаковки в лямбда-слой. Каждая операция, которую вы выполняете в модели Keras, должна быть в слое. Вы можете исправить это, заменив первую строку кода внутри цикла for следующим:
slice = Lambda(lambda x: x[:, 1, :])(encoder_inputs)
new_input = keras.layers.concatenate(
[input_state, keras.layers.RepeatVector(1)(slice)],
axis = -1)