Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow LSTM:根据之前的一系列动作预测下一个动作_Python_Tensorflow_Lstm_Recurrent Neural Network_Tflearn - Fatal编程技术网

Python Tensorflow LSTM:根据之前的一系列动作预测下一个动作

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

我的输入数据由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:无法为张量输入形状(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
会如何导致输出从二维变为一维…我在原始帖子中更新了代码。请看一看