python - 试图理解 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)
以下是我对这个模型的几个疑问:
- 这
return_sequences
是 False ,那么我不应该只得到 RNN 层的最后一个输出。为什么 RNN 层的输出是 shape(None, 10)?我认为它应该是 (sample size,1) 。
我下面提到的逻辑也有缺陷,但我需要解决它:
单位对应于输出单位。最初我的猜测是,因为有 3 个时间步长,所以必须有 3 个输出单位,但我很惊讶即使给定单位 = 128 或 10,1,模型也能正常工作。它是如何以及为什么会发生的?这个问题与上述问题一起让我更加困惑。
- input_shape 对应于 -[样本大小、时间步数、特征]。在这里,我在 3 个时间段内测量 1 个骨骼大小。当我说输入形状为 (sample size, 3,1) 时,我的理解是否正确?此外,我对 numpy 如何表示 3d 数组感到困惑。看来,要获得所需的尺寸,我需要输入 - #features,observations/sample_size, timesteps 。我是否必须根据 numpy 表示 3d 的方式来重塑我的输入,还是应该让它如此。?
此外,如果我在不同的时间范围内测量了不同的特征集或有不同的时间步长,我该如何构建模型?我如何与上述模型结合使用。
解决方案
- 是的,你得到了最后一个输出,它是一个 10 维向量,而不是一维向量,所以得到形状
(samples, 10)
是正确的。 - 单位数与时间步长无关,时间步数是神经元循环应用的次数,因此它与特征或单位的数量正交。
- 是的,您输入的形状应该是
(samples, 3, 1)
并且input_shape
应该是(3, 1)
,所有这些在您的代码中都是正确的。我不确定你在说什么“numpy 如何表示 3d 数组”,形状很清晰,numpy 不会对输入形状做任何修改。
推荐阅读
- android - 如何在没有 USB 的情况下将我们的手机作为模拟器添加到 Visual Studio 代码中以实现颤振
- azure-aks - AKS 仍然不支持垂直 pod 自动缩放吗?
- c++ - 如何从可能重复的捕获组中检索捕获的子字符串?
- python - ansible - 字典列表到列表字典
- python - 如何在 GUI 程序中使用按钮切换控制台
- opencart - Opencart 3.0.3.7 事件未捕获,无法正常工作
- reactjs - 基于响应数据时如何使用 SWR 重新获取
- scheme - 方案框和指针循环列表
- intranet - 内网站点在 chrome/chromium 中浏览网络文件
- javascript - CSS 文件无法在 Nodejs/Express Web 应用程序的第一次请求时加载。从第二个请求开始工作正常