2

を持っている必要があります。私は、私はすべてのエポックで10のタイムスタンプと私は今だけのために一つの配列を取っているデータX、ので、私のバッチサイズ= 1 を持っている1から10分類:形状(1、10、5)私はtensorflowでシンプルLSTMを設計しようとしていますランク2

にクラスにデータの順序を分類したいです新しいシーケンスが生成されます。例えば、Xがthis-

X [[ 2.52413028 2.49449348 2.46520466 2.43625973 2.40765466 2.37938545 
    2.35144815 2.32383888 2.29655379 2.26958905]] 

などnumpyのアレイはLSTM入力に適するようにすることである、私は、最初のテンソルに変換した後(BATCH_SIZE、sequence_lenght、入力寸法)を整形 -

X= np.array([amplitude * np.exp(-t/tau)]) 
print 'X', X 

#Sorting out the input 
train_input = X 
train_input = tf.convert_to_tensor(train_input) 
train_input = tf.reshape(train_input,[1,10,1]) 
print 'ti', train_input 

出力のために私は10

#------------sorting out the output 
train_output= [int(math.ceil(tau/resolution))] 
train_output= one_hot(train_output, num_labels=10) 
print 'label', train_output 

train_output = tf.convert_to_tensor(train_output) 

>>label [[ 0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]] 

1のクラスの範囲内でワンホットエンコードされたラベルを生成していますそして、私は、tensorflowグラフのプレースホルダを作成しLSTM細胞を作製し、重量およびBを与えましたias-

data = tf.placeholder(tf.float32, shape= [batch_size,len(t),1]) 
target = tf.placeholder(tf.float32, shape = [batch_size, num_classes]) 

cell = tf.nn.rnn_cell.LSTMCell(num_hidden) 
output, state = rnn.dynamic_rnn(cell, data, dtype=tf.float32) 

weight = tf.Variable(tf.random_normal([batch_size, num_classes, 1])), 
bias = tf.Variable(tf.random_normal([num_classes])) 

#training 
prediction = tf.nn.softmax(tf.matmul(output,weight) + bias) 
cross_entropy = -tf.reduce_sum(target * tf.log(prediction)) 
optimizer = tf.train.AdamOptimizer() 
minimize = optimizer.minimize(cross_entropy) 

私はこれまでのコードを書いており、トレーニングステップでエラーが発生しました。それは入力された図形と関係がありますか?ここでトレースバックが

トレースバック(最新の呼び出しの最後)---である:あなたのwは次元batch_size x num_classes x 1を有しているあなたは、乗算をしたいしかし

あなたのコードを見てみると
File "/home/raisa/PycharmProjects/RNN_test1/test3.py", line 66, in <module> 
prediction = tf.nn.softmax(tf.matmul(output,weight) + bias) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/math_ops.py", line 1036, in matmul 
name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_math_ops.py", line 911, in _mat_mul 
transpose_b=transpose_b, name=name) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/op_def_library.py", line 655, in apply_op 
op_def=op_def) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2156, in create_op 
set_shapes_for_outputs(ret) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1612, in set_shapes_for_outputs 
shapes = shape_func(op) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/common_shapes.py", line 81, in matmul_shape 
a_shape = op.inputs[0].get_shape().with_rank(2) 
    File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 625, in with_rank 
raise ValueError("Shape %s must have rank %d" % (self, rank)) 
ValueError: Shape (1, 10, 5) must have rank 2 

答えて

2

、あなたのRNNの出力はbatch_size x 1 x num_hiddenの次元を持っている必要がありますこれら二つのbatcH_size x num_classesを可能にします。

あなたはoutput = tf.reshape(output, [batch_size, num_hidden])weight = tf.Variable(tf.random_normal([num_hidden, num_classes]))を試してみて、私はそれが行く方法を知っているさせることができますか?

+0

あなたの応答に感謝します。私はまだRNN出力の形状がどうあるべきか非常に分かりません。 – zerogravty

+0

'ValueError:寸法10と5は互換性がありません ' – zerogravty

+0

今、RNN出力は形状を持っています。 'テンソル( "Reshape_1:0"、形状=(5、10)、DTYPE =のfloat32)から:)、形状=(2 ' しかし、重み行列は 'テンソル( "0形" の形状を有しています、dtype = int32) ' – zerogravty

1

TF> = 1.0を使用している場合は、tf.contrib.rnnライブラリとOutputProjectionWrapperを利用して、完全に接続されたレイヤーをRNNの出力に追加できます。私はあなたのpredictionオペアンプを使用して、手動でクロスエントロピーを計算するのではなく、softmax_cross_entropy_with_logitsを使用してい

# Network definition. 
cell = tf.contrib.rnn.LSTMCell(num_hidden) 
cell = tf.contrib.rnn.OutputProjectionWrapper(cell, num_classes) # adds an output FC layer for you 
output, state = tf.nn.dynamic_rnn(cell, data, dtype=tf.float32) 

# Training. 
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=targets) 
cross_entropy = tf.reduce_sum(cross_entropy) 
optimizer = tf.train.AdamOptimizer() 
minimize = optimizer.minimize(cross_entropy) 

注:のようなもの。より効率的で堅牢であると考えられています。

OutputProjectionWrapperは基本的に同じことをしますが、頭痛を緩和するのに役立ちます。

関連する問題