我一直在用 Keras 框架使用递归神经网络实现,在构建模型时遇到了一些问题。
凯拉斯 2.2.4
张量流 1.14.0
我的模型仅包含三层:嵌入层、循环层和密集层。它目前看起来像这样:
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim= EMBEDDING_DIM, input_length= W_SIZE))
if MODEL == 'GRU':
model.add(CuDNNGRU(NUM_UNITS))
if MODEL == 'RNN':
model.add(SimpleRNN(NUM_UNITS))
if MODEL == 'LSTM':
model.add(CuDNNLSTM(NUM_UNITS))
model.add(Dense(vocab_size, activation='softmax'))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])
我试图做的是将return_state=True
添加到循环层,以便在使用model.predict()
函数时获取这些状态,但是当我添加它时,我收到以下错误:
TypeError: All layers in a Sequential model should have a single output tensor. For multi-output layers, use the functional API.
我尝试在密集层周围使用 TimeDistributed 包装器层,但它没有改变任何东西。
提前感谢!
顺序 API 专为像链条一样的直接模型而设计。也就是说,一层连接到下一层的输出,依此类推。
因此,如果你想要输出多个输出,你需要 Keras Functional API。
from tensorflow.keras import layers, models
inp = layers.Input(shape=(n_timesteps,))
out = layers.Embedding(input_dim=vocab_size, output_dim= EMBEDDING_DIM, input_length= n_timesteps)(inp)
if MODEL == 'GRU':
out, state = layers.CuDNNGRU(NUM_UNITS, return_state=True)(out)
if MODEL == 'RNN':
out, state = layers.SimpleRNN(NUM_UNITS, return_state=True)(out)
if MODEL == 'LSTM':
out, state = layers.CuDNNLSTM(NUM_UNITS, return_state=True)(out)
out = layers.Dense(vocab_size, activation='softmax')(out)
model = models.Model(inputs=inp, outputs=[out, state])
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['acc'])
model.summary()