1

このガイドに基づいてLSTM RNNを構築しようとしています: http://monik.in/a-noobs-guide-to-implementing-rnn-lstm-using-tensorflow/ 私の入力は、89102 * 39(89102行、39個の機能)のサイズのndarrayです。データには3つのラベルがあります - 0,1,2 プレースホルダの定義に問題があるようですが、それが何であるか分かりません。テンソルフローのnd配列入力のプレースホルダ定義

私のコードは次のとおりです。

data = tf.placeholder(tf.float32, [None, 1000, 39]) 
    target = tf.placeholder(tf.float32, [None, 3]) 
    cell = tf.nn.rnn_cell.LSTMCell(self.num_hidden) 

    val, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32) 
    val = tf.transpose(val, [1, 0, 2]) 
    last = tf.gather(val, int(val.get_shape()[0]) - 1) 


    weight = tf.Variable(tf.truncated_normal([self.num_hidden, int(target.get_shape()[1])])) 
    bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]])) 

    prediction = tf.nn.softmax(tf.matmul(last, weight) + bias) 

    cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction, 1e-10, 1.0))) 

    optimizer = tf.train.AdamOptimizer() 
    minimize = optimizer.minimize(cross_entropy) 

    mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1)) 
    error = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 


    init_op = tf.initialize_all_variables() 
    sess = tf.Session() 
    sess.run(init_op) 
    batch_size = 1000 
    no_of_batches = int(len(train_input)/batch_size) 
    epoch = 5000 
    for i in range(epoch): 
     ptr = 0 
     for j in range(no_of_batches): 
      inp, out = train_input[ptr:ptr + batch_size], train_output[ptr:ptr + batch_size] 
      ptr += batch_size 
      sess.run(minimize, {data: inp, target: out}) 
     print("Epoch - ", str(i)) 

そして、私は次のようなエラーになっています:

File , line 133, in execute_graph 
sess.run(minimize, {data: inp, target: out}) 

    File "/usr/local/lib/python3.5/dist- 
packages/tensorflow/python/client/session.py", line 789, in run 
    run_metadata_ptr) 

    File "/usr/local/lib/python3.5/dist-packages/tensorflow/python/client/session.py", line 975, in _run 
    % (np_val.shape, subfeed_t.name, str(subfeed_t.get_shape()))) 

ValueError: Cannot feed value of shape (1000, 39) for Tensor 'Placeholder:0', which has shape '(1000, 89102, 39)' 

問題を引き起こしている可能性がありますどのような任意のアイデア?

答えて

1

としてはhereを示し、dynamic_rnn機能は、プレースホルダの形状はこれがあることを意味

data = tf.placeholder(tf.float32, [None, 20,1]) 

だった、あなたが提供されたリンクでは形状

[batch_size, truncated_backprop_length, input_size]

の一括入力を取り、それらtruncated_backprop_length=20input_size=1を選択しました。
彼らのデータは、以下の3D配列だった:あなたのコードに基づいて

[ 
array([[0],[0],[1],[0],[0],[1],[0],[1],[1],[0],[0],[0],[1],[1],[1],[1],[1],[1],[0],[0]]), 
array([[1],[1],[0],[0],[0],[0],[1],[1],[1],[1],[1],[0],[0],[1],[0],[0],[0],[1],[0],[1]]), 
..... 
] 

train_input2D配列ではなく3D配列であるようです。したがって、配列を3D配列に変換する必要があります。これを行うには、truncated_backprop_lengthinput_sizeに使用するパラメータを決定する必要があります。その後、適切に dataを定義する必要があります。

あなたはtruncated_backprop_lengthinput_sizeはそれぞれ39と1になりたい場合は、あなたが

import numpy as np 
train_input=np.reshape(train_input,(len(train_input),39,1)) 
data = tf.placeholder(tf.float32, [None, 39,1]) 

を行うことができます例えば、私は上記の説明によると、あなたのコードを変更し、私は生産いくつかのランダムなデータでそれを実行します。エラーを投げることなく実行されます。以下のコードを参照してください。

import tensorflow as tf 
import numpy as np 
num_hidden=5 
train_input=np.random.rand(89102,39) 
train_input=np.reshape(train_input,(len(train_input),39,1)) 
train_output=np.random.rand(89102,3) 

data = tf.placeholder(tf.float32, [None, 39, 1]) 
target = tf.placeholder(tf.float32, [None, 3]) 
cell = tf.nn.rnn_cell.LSTMCell(num_hidden) 

val, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32) 
val = tf.transpose(val, [1, 0, 2]) 
last = tf.gather(val, int(val.get_shape()[0]) - 1) 


weight = tf.Variable(tf.truncated_normal([num_hidden, int(target.get_shape()[1])])) 
bias = tf.Variable(tf.constant(0.1, shape=[target.get_shape()[1]])) 

prediction = tf.nn.softmax(tf.matmul(last, weight) + bias) 

cross_entropy = -tf.reduce_sum(target * tf.log(tf.clip_by_value(prediction, 1e-10, 1.0))) 

optimizer = tf.train.AdamOptimizer() 
minimize = optimizer.minimize(cross_entropy) 

mistakes = tf.not_equal(tf.argmax(target, 1), tf.argmax(prediction, 1)) 
error = tf.reduce_mean(tf.cast(mistakes, tf.float32)) 


init_op = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init_op) 
batch_size = 1000 
no_of_batches = int(len(train_input)/batch_size) 
epoch = 5000 
for i in range(epoch): 
    ptr = 0 
    for j in range(no_of_batches): 
     inp, out = train_input[ptr:ptr + batch_size], train_output[ptr:ptr + batch_size] 
     ptr += batch_size 
     sess.run(minimize, {data: inp, target: out}) 
    print("Epoch - ", str(i)) 
+0

Iは、2Dプレースホルダ(tf.placeholder(tf.float32、[1000、39])を使用しようとすると、私はエラー得た: とValueError:形状(39、1000)しなければなりません少なくとも3ランクを持っている 私はデータを3Dに変換することを提案しますか? 私はtfで新しいので、新人ミスがあるかもしれません.... – oren

+0

@Oren –

+0

あなたの提案に応じてコードを変更しようとしましたが、まだエラーがあります: ValueError:Tensor 'Placeholder_1:0'、whiの形状値(1000)を送りません私は2Dにそれを再構築しようとしたように、CH形状をしている「(?、3)」 私はこのエラーを推測は、トレーニングベクターをいうが、それは働いていませんでした: train_output = np.reshape(train_output、(LEN(train_output )、1)) この問題の修正方法に関するご意見はありますか? – oren

関連する問題