私が正しく理解していれば、あなたの現在の入力labels
は次のようになります。私たちはbatch_size=4
、max_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を参照してください。
グラフ作成中にラベルテンソルの形状を推測できない場合は、特定のケースの回答を更新してください。例えばValueError:部分的に既知のTensorShapeをTensorに変換できません: – George
また、あなたのソリューションは[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
テンソルの形状が動的な場合は、labels.get_shape()の代わりに 'tf.shape(labels、out_type = tf.int32)を使用します。または、より一般的な 'get_shape' [ここ](https://github.com/vahidk/EffectiveTensorflow#get-shape-)のスニペットがあります。 – greeness