Как сделать, чтобы однострочный тензор с каждой строкой в тензоре содержал более одного "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]]