我如何知道将数据输入到keras RNN中的正确格式?

时间:2019-01-09 21:34:58

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

我正在尝试构建here中所述的Elman简单RNN。

我已经使用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)。也就是说,长度为7的15000个实例为一种热编码,编码为七个字母之一。例如[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中,但是我不认为如何将其正确地输入。

有人可以建议我解决方案吗?

1 个答案:

答案 0 :(得分: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)