Keras RNN回归输入尺寸和架构

时间:2017-03-10 00:24:00

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

我最近在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学习恒星的2D数组来自光谱的参数?

1 个答案:

答案 0 :(得分: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)对于LSTM来说,7000次步长太过分了。当它训练时,在反向传播步骤中,LSTM被展开并且信息将必须经过“7000层”(实际上不是7000层,因为它们具有相同的权重)。训练非常困难。我会将LSTM限制为最大100步(根据我的经验)。

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

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