Разделение или расстегивание Tensorflow для работы с чередованными значениями - PullRequest
0 голосов
/ 26 апреля 2018

Скажем, у меня есть тензор Tensorflow l с формой [20,], и эти 10 координат упакованы как [x1,y1,x2,y2,...]. Мне нужен доступ к [x1,x2,...] и [y1,y2,...], чтобы изменить их значения (, например, , повернуть, масштабировать, сместить), а затем переупаковать как [x1',y1',x1',y2',...].

Я могу изменить форму , tf.reshape(l, (10, 2)), но тогда я не уверен, использовать ли split или unstack и какими должны быть аргументы. Когда следует использовать расщепление вместо разборки? И как тогда следует перепаковать измененные значения, чтобы они были в оригинальном формате?

1 Ответ

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

Это такие вещи, которые можно легко проверить с помощью активного режима тензорного потока:

import numpy as np
import tensorflow as tf

tf.enable_eager_execution()

l = np.arange(20)
y = tf.reshape(l, [10, 2])
a = tf.split(y, num_or_size_splits=2, axis=1)
b = tf.unstack(y, axis=1)

print('reshaped:', y, sep='\n', end='\n\n')

for operation, c in zip(('split', 'unstack'), (a, b)):
    print('%s:' % operation, c, sep='\n', end='\n\n')
reshaped:
tf.Tensor(
[[ 0  1]
 [ 2  3]
 ...
 [16 17]
 [18 19]], shape=(10, 2), dtype=int64)

split:
[<tf.Tensor: id=5, shape=(10, 1), dtype=int64, numpy=
array([[ 0],
       [ 2],
       ...
       [16],
       [18]])>,
 <tf.Tensor: id=6, shape=(10, 1), dtype=int64, numpy=
array([[ 1],
       [ 3],
       ...
       [17],
       [19]])>]

unstack:
[<tf.Tensor: id=7, shape=(10,), dtype=int64, numpy=array([ 0,  2, ... 16, 18])>,
 <tf.Tensor: id=8, shape=(10,), dtype=int64, numpy=array([ 1,  3, ... 17, 19])>]

Таким образом, они почти одинаковы, используя эти параметры ; кроме как по:

  • tf.split всегда будет разбивать тензор по axis на num_or_size_splits разбиения, которые потенциально могут отличаться от числа измерений shape[axis] и, следовательно, должны сохранять исходный ранг, выводя тензоры форма [10, n / num_or_size_splits] = [10, 2 / 2] = [10, 1].

    Переупаковка может быть выполнена путем объединения всех разделенных частей в a:

    c=tf.concat(a, axis=1)
    print(c)
    array([[ 0,  1],
           [ 2,  3],
           ...
           [16, 17],
           [18, 19]])>
    
  • tf.unstack разделит тензор вдоль axis на точное количество измерений shape[axis] и, следовательно, может однозначно уменьшить ранг на 1, что приведет к тензорам формы [10].

    Переупаковка может быть выполнена путем укладки всех разделенных частей в b:

    c=tf.stack(b, axis=1)
    print(c)
    array([[ 0,  1],
           [ 2,  3],
           ...
           [16, 17],
           [18, 19]])>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...