1

我一直在試圖實現一個經常性網絡來計算一系列數字的總和。我打算試圖使它接受可變長度的序列,但可以開始輸入長度固定爲5計算序列總數 - 經常性網絡

實施例:

[1,2,3,4,5] = 15 

我遇到的問題是,一旦它收斂,或至少損失穩定下來,對於我給它的任何輸入,它給出相同的輸出。

[3,4,5,1,1] = 134.59681 
[400,1,1,1,1] = 134.59681 
[32,42,55,1,1] = 134.59681 
[100,1,2,1,1] = 134.59681 

到目前爲止,我已經嘗試了不同的層的大小,不同的激活功能和學習速率。但它們都會導致類似的行爲。即使他們給出的值作爲輸出改變(所以不是134,它可能是-12或其他),對於任何輸入都是相同的。

我假設使用線性激活可以用循環神經網絡來解決這個問題。

爲什麼網絡收斂到「固定」值?

sample_size = 512 
X = np.random.randint(1, 50, size=(sample_size, 5)) 
Y = [[np.sum(x)] for x in X] 
X = np.reshape(X, (-1, 5, 1)) 

net = tflearn.input_data(shape=[None, 5, 1]) 
net = tflearn.lstm(net, 32, dropout=0.9) 
net = tflearn.fully_connected(net, 1, activation='linear') 

regression = tflearn.regression(net, optimizer='adam', loss='mean_square', learning_rate=1.) 

m = tflearn.DNN(regression, tensorboard_dir='tnsbrd-logs/') 
m.fit(X, Y, n_epoch=2000, show_metric=True, snapshot_epoch=False) 
+0

@ dandan78感謝編輯。首先發布了關於交叉驗證的問題,TFLearn不是一個標籤,所以我把它放在標題中。 – ericwenn

回答

1

使用simple_rnn而不是lstm層解決了這個問題。 另外我最終只在復發層使用了一個節點。由於有一個輸入和一個輸出,這是有道理的。

代碼看起來像現在這樣:

sample_size = 64 
max_len = 5 

X = np.random.randint(1, 50, size=(sample_size, max_len)) + 0.0 
Y = [[np.sum(x)] for x in X] 
X = np.reshape(X, (-1, max_len, 1)) 


net = tflearn.input_data(shape=[None, max_len, 1]) 
net = tflearn.simple_rnn(net, 1, activation='linear', weights_init='normal') 

regression = tflearn.regression(net, optimizer='adagrad', loss='mean_square', learning_rate=.06, metric='R2',) 

m = tflearn.DNN(regression, tensorboard_dir='tnsbrd-logs/') 
m.fit(X, Y, n_epoch=10000, show_metric=True, snapshot_epoch=False)