计算序列和 - 循环网络

Computing sum of sequence - Recurrent network

我一直在尝试实现一个循环网络来计算一系列数字的总和。我打算尝试让它接受可变长度序列,但一开始输入长度固定为 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 或其他),对于任何输入它都是相同的。

我假设可以使用循环神经网络,使用线性激活来解决这个问题。

为什么网络会收敛到一个"fixed"值?

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)

使用 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)