试图了解keras SimpleRNN

时间:2019-12-21 16:18:53

标签: python tensorflow keras recurrent-neural-network

我有一个正在研究的医学纵向数据。 首先,我要处理3个时间步长(3列)的4000行样本,该样本的骨骼大小对应于在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层输出的形状为(None,10)?我认为应该是(sample size,1)。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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