simpleRNN输入/输出形状

时间:2019-05-01 11:07:49

标签: keras recurrent-neural-network

我已经用以下代码在keras中定义了一个simpleRNN:

# define RNN architecture
from keras.layers import Input
from keras.models import Model
from keras.layers import SimpleRNN
from keras.models import Sequential

model = Sequential()
model.add(SimpleRNN(units = 10,
                    return_sequences=False, 
                    unroll=True,
                    input_shape=(6, 2)))

model.compile(loss='mse',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.summary()

然后我将其输入具有形状(batch_size,6,2)的输入数据,即6个时间步长,每个步长都具有两个特征。因此,我希望有6个simpleRNN单元。

启动培训时,出现以下错误消息:

Error when checking target: expected simple_rnn_2 to have shape (10,) but got array with shape (1,)

我不明白为什么。

RNN(我的理解)的要点是,如果它不是第一个RNN单元格和新的时间步输入,则由前一个RNN单元提供输入。

因此,在这种情况下,我希望第二个RNN单元由第一个RNN单元馈送一个形状为(10,)的矢量,因为units =10。为什么会得到一个(1,)大小的矢量?

奇怪的是,只要在模型中添加一个Dense层,就可以解决问题。因此,以下架构:

# define RNN architecture
from keras.layers import Input
from keras.models import Model
from keras.layers import SimpleRNN, Dense
from keras.models import Sequential

model = Sequential()
model.add(SimpleRNN(units = 10,
                    return_sequences=False, 
                    unroll=False,
                    input_shape=(6, 2)))
model.add(Dense(1, activation='relu'))
model.compile(loss='mse',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.summary()

不会引发错误。知道为什么吗?

1 个答案:

答案 0 :(得分:1)

假设您实际上是在训练模型(不包括该代码),则问题在于您正在向其输入形状为(1,)的目标输出,而SimpleRNN则期望形状为{{1的输入}}。您可以在此处查找文档:https://keras.io/layers/recurrent/

文档清楚地指出(10,)的输出等于SimpleRNN,即units。每个单元产生一个输出。

第二个示例确实起作用,因为您添加了10层,可将输出大小减小为Dense。现在,该模型可以接受您的训练目标输出,并且可以通过网络对其进行反向支持。