【问题标题】:Keras RNN Regression Input dimensions and architectureKeras RNN 回归输入维度和架构
【发布时间】:2017-03-10 00:23:59
【问题描述】:

我最近在 Keras 中构建了一个 CNN(以 Tensorflow 作为后端),它以恒星光谱作为输入并预测三个恒星参数作为输出:温度、表面重力和金属度。我现在正在尝试创建一个执行相同操作的 RNN,以便比较两个模型。

在搜索示例和论坛后,我没有遇到很多与我的项目足够相似的应用程序。我尝试实现一个简单的 RNN,看看我是否能得出合理的结果,但到目前为止还没有运气:网络似乎根本没有在学习。

我真的可以使用一些指导来帮助我入门。具体来说: RNN 是否适合此类问题? 模型的正确输入形状是什么?我知道这取决于网络的架构,所以我想我的下一个问题是:什么是能够计算回归预测的简单架构?

我的输入数据是这样的,我有 m=50,000 个光谱,每个光谱有 n=7000 个数据点,并且我正在尝试学习 L=3 个输出标签。我也有 n & L 维度相同的测试集和交叉验证集。 当我将输入数据构造为 (m,n,1) 并将输出目标构造为 (m,L) 并使用以下架构时,损失似乎并没有减少。

n=7000
L=3

## train_X.shape = (50000, n, 1)

## train_Y.shape = (50000, L)

## cv_X.shape = (10000, n, 1)

## cv_Y.shape = (10000, L)

batch_size=32

lstm_layers = [16, 32]

input_shape = (None, n, 1)



model = Sequential([
    InputLayer(batch_input_shape=input_shape),
    LSTM(lstm_layers[0],return_sequences=True, dropout_W=0.2, dropout_U=0.2),
    LSTM(lstm_layers[1], return_sequences=False),
    Dense(L),
    Activation('linear')
])

model.compile(loss='mean_squared_error',
          optimizer='adam',
          metrics=['accuracy'])





model.fit(train_X, train_Y, batch_size=batch_size, nb_epoch=20,
      validation_data=(cv_X, cv_Y), verbose=2)

我也尝试将输入形状更改为 (m, 1, n),但仍然没有成功。我不是在寻找一个最佳的网络,只是一些可以训练的东西,然后我可以从那里拿走它。我的输入数据不是时间序列的,但是频谱的一个部分和前一个部分之间存在关系,所以有没有一种方法可以将每个频谱构造成一个二维数组,让 RNN 从中学习恒星参数光谱?

【问题讨论】:

    标签: python tensorflow regression keras recurrent-neural-network


    【解决方案1】:

    首先你设置

    train_X.shape = (50000, n, 1)
    

    那你写

    input_shape = (None, 1, n)
    

    你为什么不试试

    input_shape = (None, n, 1) ?
    

    让您的 RNN 接收n 时间步长序列和每个时间步长 1 个值比其他方式更有意义。

    有帮助吗? :)

    **编辑:**

    好的,在重读这里之后,我为您的问题提供 2cents:LSTM 不是一个好主意。

    1) 因为没有“时间”信息,所以频谱信息中没有“方向”。例如,LSTM 擅长捕捉世界的变化状态。将频谱开头的信息与结尾的信息结合起来并不是最好的。它将从头开始“读取”,并且随着状态的更新,该信息将逐渐消失。您可以尝试使用双向 LSTM 来反驳“没有方向”的事实。但是,转到第二点。

    2) 7000 个时间步对于 LSTM 来说实在是太多了。当它训练时,在反向传播步骤中,LSTM 展开,信息将必须经过“7000 层”(实际上不是 7000 层,因为它们具有相同的权重)。这是非常非常难以训练的。我会将 LSTM 限制为最大 100 步(根据我的经验)。

    否则你的输入形状是正确的:)

    您是否尝试过深度全连接网络?!我相信这会更有效率。

    【讨论】:

    • 抱歉,打错了。不过你是对的,输入为 (None,n,1) 是有意义的
    • 没有错误信息;它只是没有收敛。训练损失保持相对恒定,交叉验证损失根本没有变化。
    • 没问题。我认为我的主要问题是 RNN 是否可以应用于此类问题?我的输入数据不在时间序列中,并且我没有预测序列中的下一个值。我正在输入数据示例(它们本身是一种序列),但我试图通过回归来预测输出值。输出可以从整个光谱(输入示例)中确定,但与输入数据不按顺序排列。我希望这有点清楚。
    • 抱歉,我是 Stackoverflow 的新手。非常感谢您的意见,这很有意义,我开始认为可能是这种情况。我尝试过 DNN 和 CNN。 CNN 似乎是最有效的,我只是想我会尝试一些新的来比较,但也许 RNN 不是要走的路。再次感谢!
    • 是的,我不认为他们是......证明你的网络不工作。 DNN 根本不工作吗?对我来说,理论上它似乎是最好的,因为每个输入都是固定的频率/lambda,这将使学习属性变得高效。不过,激活可能会发挥重要作用。顺便说一句,你的目标是二进制的吗?如果是,则使用 sigmoid 进行最后一次激活,使用 binary_crossentropy 作为损失。
    猜你喜欢
    • 2019-07-21
    • 2019-08-05
    • 2020-03-09
    • 1970-01-01
    • 2019-08-30
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多