我的输入数据由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实现目标,如果是,我该如何设置我的模型?
谢谢, 罗伯特
答案 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
。