我最近在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 回答
首先你设置
然后你写
你为什么不试试
对于您的RNN来说,接收一个
n
次序列序列和每个时间步长1值比反过来更有意义 .有帮助吗? :)
编辑:
好了,重新阅读之后,我的问题就是我的2点:LSTM不是个好主意 .
1)因为没有“时间”信息,所以在频谱信息中没有“方向” . 例如,LSTM擅长捕捉世界变化的状态 . 将频谱开头的信息与最后的信息结合起来并不是最好的 . 它将从头开始“读取”,并且信息将随着状态的更新而消失 . 您可以尝试双向LSTM来对抗“没有方向”这一事实 . 但是,请转到第二点 .
2)7000时间步对于LSTM工作来说太过分了 . 当它训练时,在反向传播步骤中,LSTM被展开并且信息将必须经过“7000层”(实际上不是7000层,因为它们具有相同的权重) . 训练非常困难 . 我会将LSTM限制为最大100步(根据我的经验) .
否则你的输入形状是正确的:)
你尝试过一个完全连接的网络吗?!我相信这会更有效率 .