2017-10-09 1 views
1

最初の引数のラベルをtf.nn.ctc_lossに再構成したいと思います。tf.SparseTensorとtf.nn.ctc_loss

ラベルはテンソルshape=[batch_size x max_time]labelsに格納され、第二次元がゼロでパディングされているので、ラベルの真の長さは、他のテンソルshape=[batch_size]labels_lengthに格納されています。

labels引数がtf.nn.ctc_lossのように見えるのは不明です。私はそれがSparseTensorであるべきであることを読んでいます。 indicesvaluesdense_shapeの正しい形状と内容は何ですか?

答えて

2

私が正しく理解していれば、あなたの現在の入力labelsは次のようになります。私たちはbatch_size=4max_time=5、およびlabels_length=[5,4,3,2]を持って

[[4, 3, 1, 2, 5], 
[2, 3, 4, 1, 0], 
[1, 2, 3, 0, 0], 
[5, 4, 0, 0, 0]] 

します。

この場合、hereと同じ方法でSparseTensorに変換することができます。したがって、常にゼロを埋め込む限り、labeles_lengthを使用する必要はありません。

import tensorflow as tf 
labels = tf.Variable([[4, 3, 1, 2, 5], 
         [2, 3, 4, 1, 0], 
         [1, 2, 3, 0, 0], 
         [5, 4, 0, 0, 0]], tf.int32) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    idx = tf.where(tf.not_equal(labels, 0)) 
    sparse = tf.SparseTensor(idx, tf.gather_nd(labels, idx), labels.get_shape()) 
    s = sess.run(sparse) 
    print s.indices 
    print s.values 
    print s.dense_shape 

> [[0 0] 
    [0 1] 
    [0 2] 
    [0 3] 
    [0 4] 
    [1 0] 
    [1 1] 
    [1 2] 
    [1 3] 
    [2 0] 
    [2 1] 
    [2 2] 
    [3 0] 
    [3 1]] 
> [4 3 1 2 5 2 3 4 1 1 2 3 5 4] 
> [4 5] 

より良いスパーステンソルを理解するために(実際にはテンソルが、3つのテンソルのラッパーではありません)、documentationを参照してください。

+0

グラフ作成中にラベルテンソルの形状を推測できない場合は、特定のケースの回答を更新してください。例えばValueError:部分的に既知のTensorShapeをTensorに変換できません: – George

+0

また、あなたのソリューションは[ctc_labels_dense_to_sparse](https ://github.com/tensorflow/tensorflow/blob/r1.3/tensorflow/contrib/keras/python/keras/backend.py#L3836)ここで掲示した後に見つけたKerasから、インデックスを計算する1行だけです。私の場合の結果は、2つのソリューションと同じに見えます。 – George

+1

テンソルの形状が動的な場合は、labels.get_shape()の代わりに 'tf.shape(labels、out_type = tf.int32)を使用します。または、より一般的な 'get_shape' [ここ](https://github.com/vahidk/EffectiveTensorflow#get-shape-)のスニペットがあります。 – greeness

関連する問題