Python Tensorflow LSTM:根据之前的一系列动作预测下一个动作
我的输入数据由10个样本组成,每个样本有200个时间步,而每个时间步由30维向量描述。 此外,每个时间步由一个三维向量(一个热编码)组成,该向量描述在该特定时间步采取的动作。话虽如此,我正试图建立一个模型,在所有之前的行动中都能得到支持,然后预测下一步采取的行动最好 我试图通过tflearn和tensorflow来实现这一点,但迄今为止收效甚微 简单示例代码:Python Tensorflow LSTM:根据之前的一系列动作预测下一个动作,python,tensorflow,lstm,recurrent-neural-network,tflearn,Python,Tensorflow,Lstm,Recurrent Neural Network,Tflearn,我的输入数据由10个样本组成,每个样本有200个时间步,而每个时间步由30维向量描述。 此外,每个时间步由一个三维向量(一个热编码)组成,该向量描述在该特定时间步采取的动作。话虽如此,我正试图建立一个模型,在所有之前的行动中都能得到支持,然后预测下一步采取的行动最好 我试图通过tflearn和tensorflow来实现这一点,但迄今为止收效甚微 简单示例代码: import numpy as np import operator import tflearn from tflearn impor
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:无法为张量输入形状(10、200、3)的值
“目标/Y:0”,其形状为“(?,3)”
据我所知,输入的数据应该是正确的。然而,输出数据显然是错误的,至少Tensorflow抛出了一个错误。这可能是因为我的模型期望每个样本有一个标签,而不是每个时间步有一个标签
我甚至可以通过LSTM实现我的目标,如果可以,我必须如何设置我的模型
谢谢,
罗伯特正如错误所暗示的,目标张量的预期大小与实际提供的数据之间存在形状不匹配。让我们把它分解一下 据我所知,您已经为序列的每个时间步标记了action。这意味着您提供的标签应具有形状
(10200,3)
。这似乎是错误消息中的情况。好
所以我们现在知道错误来自于网络产生的
=================
输入数据->(10200,30)
LSTM->(10128)
(因为返回\u seq=False
)
完全连接->(10,3)
=================
因此,这就解释了错误消息的第二部分,您的网络确实生成了一个与您的数据不匹配的shape(10,3)
输出
我认为您错过了LSTM的
return\u seq
参数。与RNN实现通常的情况一样,您有一个参数告诉您是希望层返回整个序列的输出,还是仅返回最后一个时间步的输出。在这里,默认情况下这是第二个选项,这就是为什么您不能获得具有预期形状的输出。使用return\u seq=True
你的三维动作向量包含什么样的数据?分类的还是连续的?@Anis三维动作向量是一个热编码:[1,0,0]=动作1,[0,1,0]=动作2,[0,0,1]=动作3。这就是我定义的全部。我猜tflearn在幕后做了很多。谢谢你,阿尼斯,这是一个很好的开始,但仍然会导致一个错误:“net=tflearn.fully_connected(net,label_dimensions,activation='softmax')fully_connected:assert len(input_shape)>1,“传入的张量形状必须至少是2-D”assertioner错误:传入的张量形状必须至少是2-D你能告诉我全部代码吗?我看不出添加return\u seq=True
会如何导致输出从二维变为一维…我在原始帖子中更新了代码。请看一看