2017-04-16 289 views
3

我對神經網絡相當陌生,我正在用LSTM做我自己的「Hello World」,而不是複製一些東西。我選擇了一個簡單的邏輯如下:LSTM訓練模式

輸入3個時步。第一個是1或0,另外2個是隨機數。預期輸出與輸入的第一個時間步相同。數據饋送看起來像:

_X0=[1,5,9] _Y0=[1] _X1=[0,5,9] _Y1=[0] ... 200 more records like this. 

這個簡單的(?)邏輯可以訓練100%的準確性。我進行了很多測試,我發現最有效的模型是3個LSTM圖層,每個圖層都有15個隱藏單元。這在22個時期後返回100%的準確度。但是我注意到了一些我很難理解的東西:在前12個時代,模型根本沒有任何進展,而是通過準確度(acc。停留0.5)來衡量,而且只有分類交叉測量的邊際進度(從0.69到0.65 )。然後從時代12到時代22,它的訓練速度非常快,精度爲1.0。問題是:爲什麼培訓會像這樣發生?爲什麼前12個時代沒有取得進展,爲什麼12到22年的效率更高?

這裏是我的全部代碼:

from keras.models import Sequential 
from keras.layers import Input, Dense, Dropout, LSTM 
from keras.models import Model 
import helper 
from keras.utils.np_utils import to_categorical 

x_,y_ = helper.rnn_csv_toXY("LSTM_hello.csv",3,"target") 
y_binary = to_categorical(y_) 

model = Sequential() 
model.add(LSTM(15, input_shape=(3,1),return_sequences=True)) 
model.add(LSTM(15,return_sequences=True)) 
model.add(LSTM(15, return_sequences=False)) 
model.add(Dense(2, activation='softmax', kernel_initializer='RandomUniform')) 

model.compile(optimizer='adam', 
       loss='categorical_crossentropy', 
       metrics=['acc']) 
model.fit(x_, y_binary, epochs=100) 
+0

您正在使用哪種版本的Keras?你可以發佈培訓日誌嗎? – nemo

+0

我使用Keras 2.0.3 – Manngo

回答

1

這是很難給出一個具體的答案,這個,因爲它取決於很多因素。訓練神經網絡時起作用的一個主要因素是您選擇的優化器的學習率。

在您的代碼中,您沒有設置特定的學習速率。 Adam在Keras 2.0.3中的默認學習率是0.001。亞當使用基於最初的學習率(0.001),和當前時間步驟中的動態學習率lr_t,定義爲

lr_t = lr * (sqrt(1. - beta_2**t)/(1. - beta_1**t)) . 

beta_2beta_1的值通常在0.9990.9它們的默認值分別向左。如果您繪製這種學習速度你得到的東西的圖片是這樣的:

Adam dynamic learning rate for epoch 1 to 22

這可能僅僅是因爲這是甜蜜點更新權在當地找一家(可能是一個全球性的)最低。過高的學習率通常不會影響它,只會「跳過」會降低誤差的區域,而較低的學習率會在誤差範圍內採取較小的步驟,並讓您找到誤差較低的區域。

我建議您使用一個優化程序,它可以減少假設,如隨機梯度下降(SGD),並且您可以使用較低的學習率來測試此假設。