3

我最近在Keras中建立了一個CNN(Tensorflow作爲後端),它將恆星光譜作爲輸入並預測三個恆星參數作爲輸出:溫度,表面重力和金屬性。我現在正在嘗試創建一個RNN來做相同的事情,以便比較兩個模型。Keras RNN迴歸輸入尺寸和結構

通過搜索示例和論壇後,我還沒有遇到很多與我的項目相似的應用程序。我嘗試過實施一個簡單的RNN,看看我能否拿出明智的結果,但目前還沒有運氣:網絡似乎根本沒有學習。

我真的可以使用一些指導讓我開始。具體而言: RNN是否適合這類問題? 模型的正確輸入形狀是什麼?我知道這取決於網絡的體系結構,所以我想我的下一個問題是:什麼是一個簡單的體系結構,能夠計算迴歸預測?

我的輸入數據是這樣的,我有m = 50,000個光譜,每個有n = 7000個數據點,而L = 3個輸出標籤,我試圖學習。我也有相同的測試集和交叉驗證集。 當我的輸入數據構造爲(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從中學習恆星參數光譜?

回答

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步(根據我的經驗)。

否則,您輸入的形狀是正確的:)

你試過了深刻的完全連接的網絡?我相信這樣會更有效率。

+0

對不起,這是一個錯字。你是對的,輸入是有意義的(None,n,1) – Starnetter

+0

所以它仍然不起作用? –

+0

什麼是錯誤信息? @Starnetter? –