我正在尝试准备一个模型来预测给定数组中的前两个数字。因此,输入数据集就像这样 -
[1 2 3 5]
[4 8 5 9]
[10 2 3 15]
输出将是 -
[1 2]
[4 8]
[10 2]
因此,RNN的架构如下所示(摘自here)
因此,它应该是一个多对多网络。 (类似于第四张图片)
问题 - 那么,我如何使用Keras创建这种类型的模型?
我的发现 -
我尝试过这样的事情 -
n_samples = 10000
input = np.random.randint(5,10, (n_samples,5))
output = input[...,0:2]
rinp = input.reshape(n_samples,1,5)
model = Sequential()
model.add(LSTM(10, input_shape=(1,5)))
model.add(Dense(2))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(rinp, output, epochs=1000, batch_size=500, verbose=1)
但正如你所看到的,这甚至都不是很接近。这就像一个MLP。它不使用任何时间步骤。因为,输入形状是 - (n_samples,1,5)
。所以,只有一个时间步骤。
所以,我的实现是错误的。
我已经看到here中的一对一,多对一和多对多示例的一些示例。
在“多对多”示例中,作者使用了以下代码段。
length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length, 1)
# define LSTM configuration
n_neurons = length
n_batch = 1
n_epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:,0]:
print('%.1f' % value)
这不是我想要实现的目标。
关于我正在尝试实现的架构的任何示例都将非常有用。
答案 0 :(得分:0)
看起来您正在尝试基于绘图构建序列到序列(seq2seq)模型。有一个非常好的tutorial online让你入门。您可以预测长度为2的固定长度令牌,而不是预测句子。这种架构和变体通常用于机器翻译。根据您的数据,我猜你正试图在循环网络中试验长期依赖的问题;否则,将seq2seq用于任何实际目的是没有意义的。