Tensorflow LSTM:根据之前的一系列

时间:2017-12-13 08:50:00

标签: python tensorflow lstm recurrent-neural-network tflearn

我的输入数据由10个样本组成,每个样本有200个时间步长,而每个时间步长由30个维度的向量描述。 另外,每个时间步骤包括三维矢量(一个热编码),其描述在该特定时间步骤采取的动作。话虽如此,我正在尝试构建一个模型,该模型可以在之前的所有操作中得到满足,然后预测下一步最好采取哪种操作。

我尝试使用tflearn和tensorflow,但到目前为止成功有限。

简单示例代码:

import numpy as np
import operator
import tflearn
from tflearn import regression
from tflearn.layers.core import input_data, dropout, fully_connected
from tflearn.layers.embedding_ops import embedding
from tflearn.layers.recurrent import bidirectional_rnn, BasicLSTMCell
from tflearn.data_utils import to_categorical, pad_sequences

SAMPLES = 10
TIME_STEPS = 200
DATA_DIMENSIONS = 30
LABEL_CLASSES = 3

x = []
y = []
# Generate fake data.
for i in range(SAMPLES):
    sequences = []
    outputs = []
    for i in range(TIME_STEPS):
        d = []
        for i in range(DATA_DIMENSIONS):
            d.append(1)
        sequences.append(d)
        outputs.append([0,0,1])
    x.append(sequences)
    y.append(outputs)
print("X1:", len(x), ", X2:", len(x[0]), ", X3:", len(x[0][0]))
print("Y1:", len(y), ", Y2:", len(y[0]), ", Y3:", len(y[0][0]))

# Define model
net = tflearn.input_data([None, TIME_STEPS, DATA_DIMENSIONS], name='input')
net = tflearn.lstm(net, 128, dropout=0.8, return_seq=True)
net = tflearn.fully_connected(net, LABEL_CLASSES, activation='softmax')
net = tflearn.regression(net, optimizer='adam', loss='categorical_crossentropy',  name='targets')
model = tflearn.DNN(net)

# Fit model.
model.fit({'input': x}, {'targets': y},
            n_epoch=1,
            snapshot_step=1000,
            show_metric=True, run_id='test', batch_size=32)

错误

  

ValueError:无法为Tensor提供形状值(10,200,3)   '目标/ Y:0',其形状为'(?,3)'

据我了解,input_data应该是正确的。但是,输出数据显然是错误的,至少Tensorflow会抛出错误。这可能是因为我的模型每个样本需要一个标签,而不是每个时间步长一个标签。

我是否可以通过LSTM实现目标,如果是,我该如何设置我的模型?

谢谢, 罗伯特

1 个答案:

答案 0 :(得分:1)

正如错误所示,目标张量的预期大小与您实际为其提供的数据之间存在形状不匹配。让我们分解吧。

根据我的理解,您已经为序列的每个时间步标记了操作。这意味着您提供的标签应具有(10, 200, 3)形状。这似乎是错误消息的情况。好。

所以我们现在知道错误来自网络生成的内容。

=================

输入数据 - > (10, 200, 30)

LSTM - > (10, 128)(因为return_seq=False

完全连接 - > (10, 3)

=================

因此,这解释了错误消息的第二部分,您的网络确实生成了一个形状为(10, 3)的输出,该输出与您的一个数据不匹配。

我认为你错过了LSTM的return_seq论点。与RNN实现的情况一样,您有一个参数,告诉您是否希望图层返回整个序列的输出,或仅返回最后一个时间步。默认情况下,这是第二个选项,这就是为什么你没有获得具有预期形状的输出。使用return_seq=True