首页 > 解决方案 > 试图理解 keras SimpleRNN

问题描述

我有一个医学纵向数据,我正在对其进行研究。首先,我正在处理 4000 行样本,其中 3 个时间步长(3 列)的骨骼大小对应于在 3 个不同月份测量的骨骼大小。

我已经完成了基本模型。现在我想确定我对模型的理解是否正确。

model = Sequential()
model.add(layers.SimpleRNN(units=10, input_shape=(3,1),use_bias=True,bias_initializer='zeros',activation="relu",kernel_initializer="random_uniform"))
model.add(layers.Dense(1, activation="sigmoid")) 
model.compile(loss='binary_crossentropy', optimizer='sgd')
model.summary()


model.fit(trainX,train_op, epochs=100, batch_size=50, verbose=2)
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)

以下是我对这个模型的几个疑问:

  1. return_sequences是 False ,那么我不应该只得到 RNN 层的最后一个输出。为什么 RNN 层的输出是 shape(None, 10)?我认为它应该是 (sample size,1) 。

我下面提到的逻辑也有缺陷,但我需要解决它:

单位对应于输出单位。最初我的猜测是,因为有 3 个时间步长,所以必须有 3 个输出单位,但我很惊讶即使给定单位 = 128 或 10,1,模型也能正常工作。它是如何以及为什么会发生的?这个问题与上述问题一起让我更加困惑。

  1. input_shape 对应于 -[样本大小、时间步数、特征]。在这里,我在 3 个时间段内测量 1 个骨骼大小。当我说输入形状为 (sample size, 3,1) 时,我的理解是否正确?此外,我对 numpy 如何表示 3d 数组感到困惑。看来,要获得所需的尺寸,我需要输入 - #features,observations/sample_size, timesteps 。我是否必须根据 numpy 表示 3d 的方式来重塑我的输入,还是应该让它如此。?

此外,如果我在不同的时间范围内测量了不同的特征集或有不同的时间步长,我该如何构建模型?我如何与上述模型结合使用。

标签: pythontensorflowkerasrecurrent-neural-network

解决方案


  1. 是的,你得到了最后一个输出,它是一个 10 维向量,而不是一维向量,所以得到形状(samples, 10)是正确的。
  2. 单位数与时间步长无关,时间步数是神经元循环应用的次数,因此它与特征或单位的数量正交。
  3. 是的,您输入的形状应该是(samples, 3, 1)并且input_shape应该是(3, 1),所有这些在您的代码中都是正确的。我不确定你在说什么“numpy 如何表示 3d 数组”,形状很清晰,numpy 不会对输入形状做任何修改。

推荐阅读