【问题标题】:How do I know the correct format for my input data into my keras RNN?我如何知道输入数据到我的 keras RNN 的正确格式?
【发布时间】:2019-01-09 21:34:58
【问题描述】:

我正在尝试构建一个 Elman 简单 RNN,如 here 所述。

我使用 Keras 构建了我的模型,如下所示:

model = keras.Sequential()
model.add(keras.layers.SimpleRNN(7,activation =None,use_bias=True,input_shape=
                             [x_train.shape[0],x_train.shape[1]]))
model.add(keras.layers.Dense(7,activation = tf.nn.sigmoid))

model.summary()
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_2 (SimpleRNN)     (None, 7)                 105       
_________________________________________________________________
dense_2 (Dense)              (None, 7)                 56        
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________

我的训练数据目前的形状是 (15000, 7, 7)。也就是说,15000 个长度为 7 的热编码实例,编码七个字母之一。例如[0,0,0,1,0,0,0],[0,0,0,0,1,0,0] 等等。

数据的标签格式相同,因为每个字母都预测序列中的下一个字母,即[0,1,0,0,0,0,0] 具有标签[0,0,1,0,0,0,0]

所以,训练数据(x_train) 和训练标签(y_train) 都被塑造成(15000,7,7)

我的验证数据 x_val 和 y_val 的形状为 (10000,7,7)。即相同的形状,但实例更少。

所以当我运行我的模型时:

history = model.fit(x_train,
         y_train,
         epochs = 40,
         batch_size=512,
         validation_data = (x_val,y_val))

我得到错误:

ValueError: Error when checking input: expected simple_rnn_7_input to have shape (15000, 7) but got array with shape (7, 7)

显然我的输入数据格式不正确,无法输入到 Keras RNN,但我想不出如何为其提供正确的输入。

谁能告诉我解决方案?

【问题讨论】:

  • 一个 RNN 接受 3-D 输入。第一个是批量大小(示例数 = 165k),第二个是与时间相关的轴(看起来你缺少),第三个是每个给定时间的向量(=7)。如果是句子,时间将等于句子中的单词数或字母数
  • 感谢@GergesDib。请看我编辑的帖子。我对其进行了更改,使输入为 3D,并得到类似但不相同的错误。
  • 制作input_shape = x_train.shape[1:]
  • 现在我得到ValueError: Error when checking target: expected dense_8 to have 2 dimensions, but got array with shape (15000, 7, 7) - - 突然它需要二维输入?我尝试添加一个什么也没做的展平层
  • 很奇怪。要尝试的一件事是重新启动您的 python 会话。看起来您正在使用笔记本或交互式会话?

标签: python tensorflow machine-learning keras recurrent-neural-network


【解决方案1】:
  1. SimpleRNN 层需要维度 (seq_length, input_dim) 的输入,在您的情况下为 (7,7)。
  2. 另外,如果你想在每个时间步输出,你需要使用return_sequence=True,默认是false。这样您就可以在时间步长上比较输出。

所以模型架构会是这样的:

model.add(keras.layers.SimpleRNN(7, activation='tanh', 
                       return_sequences=True, 
                        input_shape=[7,7]))
model.add(keras.layers.Dense(7))
model.summary()

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_12 (SimpleRNN)    (None, 7, 7)              105       
_________________________________________________________________
dense_2 (Dense)              (None, 7, 7)              56        
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________

现在在训练时,它需要数据 input and output(num_samples, seq_length, input_dims),即两者的 (15000, 7, 7)

model.compile(loss='categorical_crossentropy', optimizer='adam')# define any loss, you want
model.fit(x_train, y_train, epochs=2)

【讨论】:

  • 在这里,如果这个答案解决了你的问题,请点赞并接受。
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 2017-11-26
  • 2019-07-16
  • 1970-01-01
  • 2016-07-11
相关资源
最近更新 更多