Keras中序列到序列模型中的异常

Keras中序列到序列模型中的异常,keras,keras-layer,keras-2,sequence-to-sequence,Keras,Keras Layer,Keras 2,Sequence To Sequence,我正在尝试使用LSTM和稠密神经网络在Keras中建立一个序列到序列模型。编码器对输入进行编码,然后将编码状态和输入串联并输入解码器,解码器是一个lstm+密集神经网络,可及时输出分类标签。下面是我的代码 from keras.utils import to_categorical from keras.layers import Embedding, Bidirectional, GRU, Dense, TimeDistributed, LSTM, Input, Lambda from ker

我正在尝试使用LSTM和稠密神经网络在Keras中建立一个序列到序列模型。编码器对输入进行编码,然后将编码状态和输入串联并输入解码器,解码器是一个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,:]
),而没有将其包装在Lambda层中。在Keras模型中执行的每个操作都必须在一个层中。您可以通过将for循环中的第一行代码替换为以下代码来修复此问题:

slice = Lambda(lambda x: x[:, 1, :])(encoder_inputs)
new_input = keras.layers.concatenate(
    [input_state, keras.layers.RepeatVector(1)(slice)], 
    axis = -1)

问题是您正在切片张量(
encoder_inputs[:,1,:]
),而没有将其包装在Lambda层中。在Keras模型中执行的每个操作都必须在一个层中。您可以通过将for循环中的第一行代码替换为以下代码来修复此问题:

slice = Lambda(lambda x: x[:, 1, :])(encoder_inputs)
new_input = keras.layers.concatenate(
    [input_state, keras.layers.RepeatVector(1)(slice)], 
    axis = -1)