2017-12-13 25 views
0

私の入力データは10サンプルで構成され、各サンプルは200タイムステップを持ち、各タイムステップは30ディメンションのベクトルで表されます。 さらに、各タイムステップは、その特定のタイムステップで実行されたアクションを記述する3次元ベクトル(1つのホットエンコーディング)から成ります。それが言われて、私は以前のすべてのアクションをフィードし、次に取るのが最善のアクションを予測するモデルを構築しようとしています。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はエラーを投げます。これはおそらく、私のモデルでは、1つのタイムステップにつき1つのラベルではなく、1つのサンプルあたり1つのラベルが必要なためです。

私はLSTMで目標を達成することすらできますか?もしそうなら、私は自分のモデルをどのように設定する必要がありますか?エラーが示すように

おかげで、 ロバート

+0

3次元行動ベクトルにはどのような種類のデータが含まれていますか?カテゴリまたは連続? – Anis

+0

@Anis 3次元アクションベクトルは、[1,0,0] =アクション1、[0,1,0] =アクション2、[0,0,1] =アクション3の3つのホットエンコーディングにあります。私は定義する。私はtflearnがたくさんの場面の後ろにいると思う。 –

答えて

1

は、あなたの目標テンソルの予想サイズ、そしてあなたが実際にそれを提供するデータの1つとの間の形状の不一致があります。私たちはそれを打破しましょう。

私が理解していることから、シーケンスのタイムステップごとにアクションをラベル付けしました。これは、指定したラベルの形状が(10, 200, 3)であることを意味します。これは、エラーメッセージの場合のようです。良い。

ここで、エラーはネットワークが生成するものであることがわかりました。

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

入力データ - >(10, 200, 30)

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

FullyConnected(return_seq=Falseため) 。エラーメッセージの2番目の部分を説明し

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

ので、あなたのネットワークが実際のいずれかのミスマッチ形状(10, 3)との出力を生成しますあなたのデータ。

私はあなたがLSTMのreturn_seq引数を見逃したと思います。通常、RNN実装の場合と同様に、シーケンス全体の出力を返すか、最後のタイムステップの出力のみを返すかを指定するパラメータがあります。ここではデフォルトで2番目のオプションです。そのため、予想される形状の出力が得られないのです。 return_seq=Trueを使用してください。

+0

Anisさん、ありがとう、これは素晴らしいスタートですが、まだエラーが発生します: "net = tflearn.fully_connected(net、label_dimensions、activation = 'softmax') fully_connected:assert len(input_shape)> 1、"着信テンソルの形状は必須です少なくとも2-Dでなければなりません " AssertionError:到着するテンソルの形状は少なくとも2-Dでなければなりません" –

+0

コード全体を表示できますか? 'return_seq = True'を追加すると、出力が2-Dから1-Dになる可能性があります。 – Anis

+0

元の投稿のコードを更新しました。どうぞご覧ください –

関連する問題