Это такие вещи, которые можно легко проверить с помощью активного режима тензорного потока:
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]])>