тензор потока: расщепленный тензор по некоторому разделителю - PullRequest
0 голосов
/ 28 апреля 2018

Скажите, что у меня есть тензор вроде:

ts = tf.constant([1,2,3,-1,3,4,5,-1,2])

Как я могу разбить тензор на список тензоров с -1 в качестве разделителя и получить следующее

tf.constant([1,2,3])
tf.constant([3,4,5])
tf.constant([1,2])

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Частичное решение, вы должны указать количество кусков заранее. Надеюсь, что это все еще помогает.

Код (проверено):

import tensorflow as tf

ts = tf.constant([ 1, 2, 3, -1, 3, 4, 5, -1, 1, 2 ] )
delimiter = tf.constant( [ -1 ] )

left_padded = tf.concat( [ delimiter, ts ], axis = 0 )
padded = tf.concat( [ delimiter, ts, delimiter ], axis = 0 )
begin = tf.squeeze( tf.where( tf.equal( padded, delimiter ) ), axis = -1 ) # get position of -1s
sizes = begin[ 1 : ] - begin[ : -1 ] # get sizes of chunks
chunks = tf.split( left_padded, sizes, num = 3 ) # have to pre-specify number of chunks
for i in xrange( len( chunks ) ):
    chunks[ i ] = chunks[ i ][ 1 : ] # get rid of leading -1s

with tf.Session() as sess:
    print( sess.run( [ chunks ] ) )

Выходы:

[[массив ([1, 2, 3], dtype = int32),
массив ([3, 4, 5], dtype = int32),
массив ([1, 2], dtype = int32)]]

0 голосов
/ 30 июля 2018

Заимствуя ответ Сабины Мэннел, вот полное решение:

import tensorflow as tf

def split_by_delimiter(ts, delimiter):
    """Split a tensor similarly to python's `str.split` method."""
    ts_str = tf.reshape(tf.reduce_join(tf.as_string(ts), separator=' '), [-1])
    ts_slices = tf.string_split(
        tf.string_split(ts_str, delimiter=str(delimiter)).values)

    result = tf.SparseTensor(
        ts_slices.indices,
        tf.string_to_number(ts_slices.values, out_type=tf.int64),
        ts_slices.dense_shape)

    return tf.sparse_tensor_to_dense(result)
0 голосов
/ 28 апреля 2018

Вы можете преобразовать константу в строки, а затем разбить их как строки на нужные вам фрагменты, а затем вы можете преобразовать их обратно в списки чисел:

Вот шаг нарезки:

import tensorflow as tf

ts = tf.constant([1,2,3,-1,3,4,5,-1,2])
ts_slices = 
    tf.string_split(tf.reshape(tf.reduce_join(tf.as_string(ts)), 
    [-1]), delimiter='-1')
sess = tf.Session()
sess.run(ts_slices.values)

Это дает вам:

array([b'23', b'345', b'2'], dtype=object)

Теперь вы можете снова конвертировать в целые числа.

Я не уверен, что это лучшее решение этой проблемы, но, по крайней мере, оно решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...