Как сделать, чтобы однострочный тензор с каждой строкой в ​​тензоре содержал более одного "1"?

Мне нужно построить однострочный тензор, в котором каждая строка тензора содержит два "1", и у меня есть тензор индекса, но как построить тензор? я знаю это onehot = tf.sparse_to_dense(index, tf.stack([batchsize,10]), 1.0, 0.0)что можно сделать, если batchsize=1, но если batchsize>1, что мне делать? Другими словами, как построить тензор:

[[ 0.  1.  0.  1.  0.  1.  0.  0.  0.  0.]
 [ 0.  0.  0.  1.  0.  1.  1.  0.  0.  0.]]

с этикеткой:

[[1,3,5]
 [3,5,6]]

2 ответа

import tensorflow as tf
sess = tf.InteractiveSession()
indices = [[1,3,5], [3,5,6]]
depth = 10
tmp_onehot_3D = tf.one_hot(indices, depth)
onehot_2D = tf.reduce_sum(tmp_onehot_3D, axis=1)
onehot_2D.eval()

Результат:

array([[0., 1., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)

Это не так кратко, как @Maosi Chen, но также предоставляет альтернативный подход. Суть состоит в том, чтобы преобразовать срезы в двумерный набор координат, затем сделать из них разреженный тензор и преобразовать его в плотный тензор.

import tensorflow as tf

slices = tf.constant([[1, 3, 5], [3, 5, 6]], dtype=tf.int64)
values = tf.ones_like(slices)

nrows = 2
ncols = 10

row_inds = tf.range(nrows, dtype=slices.dtype)

flattened_indices = tf.reshape(slices * nrows + row_inds[:, None], [-1])

twod_inds = tf.stack(
    [flattened_indices % nrows, flattened_indices // nrows], axis=1)

one_hot_sparse = tf.SparseTensor(
    twod_inds, values=tf.reshape(values, [-1]), dense_shape=(nrows, ncols))

one_hot_dense = tf.sparse_tensor_to_dense(one_hot_sparse, validate_indices=False)
with tf.Session() as sess:
    print(sess.run(one_hot_dense))

Вот вывод

[[0 1 0 1 0 1 0 0 0 0]
 [0 0 0 1 0 1 1 0 0 0]]
Другие вопросы по тегам