以下是使用Elman循环神经网络和Neurolab Python库的一个示例:
import neurolab as nl
import numpy as np
# Create train samples
i1 = np.sin(np.arange(0, 20))
i2 = np.sin(np.arange(0, 20)) * 2
t1 = np.ones([1, 20])
t2 = np.ones([1, 20]) * 2
input = np.array([i1, i2, i1, i2]).reshape(20 * 4, 1)
target = np.array([t1, t2, t1, t2]).reshape(20 * 4, 1)
# Create network with 2 layers
net = nl.net.newelm([[-2, 2]], [10, 1], [nl.trans.TanSig(), nl.trans.PureLin()])
# Set initialized functions and init
net.layers[0].initf = nl.init.InitRand([-0.1, 0.1], 'wb')
net.layers[1].initf= nl.init.InitRand([-0.1, 0.1], 'wb')
net.init()
# Train network
error = net.train(input, target, epochs=500, show=100, goal=0.01)
# Simulate network
output = net.sim(input)
# Plot result
import pylab as pl
pl.subplot(211)
pl.plot(error)
pl.xlabel('Epoch number')
pl.ylabel('Train error (default MSE)')
pl.subplot(212)
pl.plot(target.reshape(80))
pl.plot(output.reshape(80))
pl.legend(['train target', 'net output'])
pl.show()
在这个例子中,它正在合并两个单位长度的输入,并且也在合并两个单位长度的输出。之后,它使用这些合并的数组来训练网络。
首先,它似乎不像我从这里得到的模式。 我的主要问题是:
我必须训练具有任意长度的输入和输出的网络,例如:
- 任意长度的输入到固定长度的输出
- 固定长度的输入到任意长度的输出
- 任意长度的输入到任意长度的输出
我知道 Neurolab 很容易使用,因为它有很多 优秀的特性。尤其是它非常符合 Pythonic 的风格。因此,我坚持使用 Neurolab Library 来解决我的问题。但是如果你建议我使用另一个像 Neurolab 一样拥有更好 LSTM 功能的库,我会接受的。
最终,我怎么能够为任意长度的输入和输出重新排列这个例子呢?
我对 RNN 和 LSTM 没有最好的理解,请解释一下。