首页 文章

Keras RNN回归输入尺寸和架构

提问于
浏览
3

我最近在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),但仍未取得任何成功 . 我不是在寻找一个最佳的网络,只是训练的东西,然后我可以从那里拿走它 . 我的输入数据不是时间序列,但是光谱的一个部分和前一部分之间存在关系,所以有一种方法可以将每个光谱构建成一个2D阵列,这将允许RNN从中学习恒星参数光谱?

1 回答

  • 0

    首先你设置

    train_X.shape = (50000, n, 1)
    

    然后你写

    input_shape = (None, 1, n)
    

    你为什么不试试

    input_shape = (None, n, 1) ?
    

    对于您的RNN来说,接收一个 n 次序列序列和每个时间步长1值比反过来更有意义 .

    有帮助吗? :)

    编辑:

    好了,重新阅读之后,我的问题就是我的2点:LSTM不是个好主意 .

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

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

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

    你尝试过一个完全连接的网络吗?!我相信这会更有效率 .

相关问题