我已经用以下代码在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()
不会引发错误。知道为什么吗?
答案 0 :(得分:1)
假设您实际上是在训练模型(不包括该代码),则问题在于您正在向其输入形状为(1,)
的目标输出,而SimpleRNN
则期望形状为{{1的输入}}。您可以在此处查找文档:https://keras.io/layers/recurrent/
文档清楚地指出(10,)
的输出等于SimpleRNN
,即units
。每个单元产生一个输出。
第二个示例确实起作用,因为您添加了10
层,可将输出大小减小为Dense
。现在,该模型可以接受您的训练目标输出,并且可以通过网络对其进行反向支持。