1

Ich habe versucht, ein wiederkehrendes Netzwerk zu implementieren, um die Summe einer Folge von Zahlen zu berechnen. Ich plane, um zu versuchen, es mit variabler Länge Sequenzen zu machen akzeptieren, aber die Eingabelänge festgelegt ist damit beginnen bei 5.Berechnung der Sequenzsumme - Wiederholtes Netzwerk

Beispiel:

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

Das Problem, das ich begegnet bin, ist, dass, sobald sie konvergiert, oder zumindest der Verlust stabilisiert sich, für jede Eingabe, die ich ihm gebe, gibt es die gleiche Ausgabe.

Beispiel

[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 

Bisher habe ich verschiedene Schichtgrößen versucht, verschiedene Aktivierungsfunktionen und Lernrate. Aber alle führen zu ähnlichem Verhalten. Selbst wenn sich die Werte, die sie als Ausgabe geben, ändern (also statt 134. kann es -12 oder was auch immer sein), ist es für jeden Eingang dasselbe.

Ich nehme an, dass es möglich ist, dieses Problem mit einem rekurrenten neuronalen Netzwerk zu lösen, das lineare Aktivierungen verwendet.

Warum konvergiert das Netzwerk zu einem "festen" Wert?

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 Vielen Dank für bearbeiten. Erste gepostete Frage auf crossvalidated, wo TFLearn nicht ein Tag war, also habe ich es in Titel geschrieben. – ericwenn

Antwort

1

eine simple_rnn statt LSTM Layer das Problem gelöst. Auch ich endete mit nur einem Knoten in der wiederkehrenden Schicht. Da es einen Eingang und einen Ausgang gibt, war dies sinnvoll.

Der Code sieht nun wie folgt:

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)