2017-12-13 4 views
0

입력 데이터는 10 개의 샘플로 구성되며 각각의 시간 간격은 200 단계이며 각 시간 단계는 30 차원 벡터로 설명됩니다. 또한 각 시간 단계는 특정 시간 단계에서 수행 된 동작을 설명하는 3 차원 벡터 (하나의 핫 인코딩)로 구성됩니다. 그렇게 말하면서, 나는 이전의 모든 행동을 먹이로 한 다음, 어떤 행동이 다음에 취하는 것이 가장 좋은지를 예측하는 모델을 만들려고 노력하고 있습니다.Tensorflow LSTM : 일련의 이전 작업을 기반으로 다음 작업 예측

나는 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: Cannot feed value of shape (10, 200, 3) for Tensor 'targets/Y:0', which has shape '(?, 3)'

지금까지 내가 이해하는 한, input_data이 정확해야한다. 그러나 출력 데이터는 분명히 잘못되었습니다. 최소한 Tensorflow는 오류를 발생시킵니다. 그것은 아마도 내 모델이 시간 단계 당 하나의 레이블보다는 샘플 당 하나의 레이블을 기대하기 때문일 것입니다.

LSTM으로 목표를 달성 할 수 있습니까? 그렇다면 내 모델을 어떻게 설정해야합니까? 오류에서 알 수 있듯이

감사합니다, 로버트

+0

3 차원 동작 벡터에는 어떤 종류의 데이터가 들어 있습니까? 범주 형 또는 연속 형? – Anis

+0

@ 3 차원 작업 벡터가 하나의 핫 인코딩에 있음 : [1,0,0] = 동작 1, [0,1,0] = 동작 2, [0,0,1] = 동작 3. 나는 정의한다.나는 tflearn이 장면 뒤에서 많은 일을한다고 생각합니다. –

답변

1

, 당신의 목표 텐서의 예상 크기, 당신은 실제로 그것을 제공하는 데이터의 하나 사이에 형상 불일치가있다. 우리가 그것을 무너 뜨려 보자.

내가 알고있는 것으로부터, 당신은 당신의 시퀀스의 모든 타임 스텝에 대해 액션이라고 표시했습니다. 즉, 제공 한 레이블의 모양은 (10, 200, 3)이어야합니다. 이것은 오류 메시지의 경우 인 것 같습니다. 좋은.

이제 우리는 네트워크에서 생성되는 오류라는 것을 알게되었습니다.

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

입력 데이터 ->(10, 200, 30)

LSTM ->(10, 3) ->(10, 128)

FullyConnected (return_seq=False 때문에) .

는 =================

오류 메시지의 두 번째 부분을 설명 그래서, 당신의 네트워크는 실제로 중 하나와 일치하지 않는 모양 (10, 3)과 출력을 생성 귀하의 데이터.

return_seq LSTM 인수를 놓친 것 같습니다. 일반적으로 RNN 구현의 경우와 마찬가지로 레이어가 전체 시퀀스에 대한 출력을 반환할지 또는 마지막 타임 스텝에 대해서만 출력 할지를 지정하는 매개 변수가 있습니다. 여기서는 기본적으로 두 번째 옵션입니다. 따라서 예상되는 모양으로 출력되지 않습니다. return_seq=True을 사용하십시오.

+0

Anis 감사합니다,하지만 이것은 좋은 출발이지만 여전히 오류가 발생합니다 : "net = tflearn.fully_connected (net, label_dimensions, activation = 'softmax') fully_connected : assert len ​​(input_shape)> 1,"들어오는 텐서 모양은 최소한 2-D " AssertionError : 수신 Tensor 모양은 2-D 이상이어야합니다." –

+0

전체 코드를 보여줄 수 있습니까? 'return_seq = True'가 2-D에서 1-D로 바뀌는 원인을 어떻게 추가 할 수 있는지 보지 못했습니다 ... – Anis

+0

원래 게시물의 코드를 업데이트했습니다. 제발 봐봐 –