了解SimpleRNN过程

时间:2017-11-13 19:47:07

标签: keras recurrent-neural-network

我使用Keras创建了以下SimpleRNN:

X = X.reshape((X.shape[0], X.shape[1], 1))
tr_X, ts_X, tr_y, ts_y = train_test_split(X, y, train_size=.8)
batch_size = 1000

print('RNN model...')
model = Sequential()
model.add(SimpleRNN(64, activation='relu', batch_input_shape=(batch_size, X.shape[1], 1)))
model.add(Dense(1, activation='relu'))

print('Training...')
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print (model.summary())
print ('\n')

model.fit(tr_X, tr_y,
          batch_size=batch_size, epochs=1,
          shuffle=True, validation_data=(ts_X, ts_y))

对于模型摘要,我得到以下内容:

Layer (type)                 Output Shape              Param #   
=================================================================
simple_rnn_1 (SimpleRNN)     (1000, 64)                4224      
_________________________________________________________________
dense_1 (Dense)              (1000, 1)                 65        
=================================================================
Total params: 4,289
Trainable params: 4,289
Non-trainable params: 0
_________________________________________________________________

鉴于我有10,000个样本和64个特征的数据集。我的目标是通过使用此数据集训练分类模型(类标签是二进制0和1)。现在,我想了解这里发生了什么。如“输出形状”列中所示,simple_rnn_1具有(1000,64)。我将其解释为1000行(这是批处理)和64功能。假设上面的代码在逻辑上是正确的,我的问题是:

  1. RNN如何处理此矩阵(即(1000,64))?它输入了吗? 每一栏都有这样的数字?
  2. enter image description here

    1. SimpleRNN()units是否应始终等于要素数量?
    2. 谢谢

1 个答案:

答案 0 :(得分:1)

  1. 在代码中,您将batch_input_shape定义为具有形状:(b​​atch_size,X.shape [1],1)
    这意味着您将插入RNN,batch_size示例,每个示例包含X.shape [1] 时间戳(图像中的粉红色框的数量),每个时间戳为形状1(标量)。
    所以,是的,(1000,64,1)的输入形状将与您所说的完全相同 - 每列都将输入到RNN。

  2. 没有!单位将是你的输出暗淡。通常更多单位意味着更复杂的网络(就像在常规神经网络中一样) - >更多要学习的参数 单位将是RNN内部状态的形状。 (因此,在您的示例中,如果您声明units = 2000,则输出将为(1000,2000)。)