hstack Нумпи на тензор потока для одной матрицы / тензор - PullRequest
0 голосов
/ 01 декабря 2018

Numpy-версия hstack для одной матрицы

c=np.array([[[2,3,4],[4,5,6]],[[20,30,40],[40,50,60]]])

np.hstack(c)

output:

array([[ 2,  3,  4, 20, 30, 40],
       [ 4,  5,  6, 40, 50, 60]])

Я надеюсь добиться того же поведения в TF.

c_t=tf.constant(c)
tf.stack(c_t,axis=1).eval()

Я получаю сообщение об ошибке

TypeError: Expected list for 'values' argument to 'pack' Op, not <tf.Tensor 'Const_14:0' shape=(2, 2, 3) dtype=int64>.

Итак, я попытался

tf.stack([c_t],axis=1).eval()

Вывод

array([[[[ 2,  3,  4],
         [ 4,  5,  6]]],


       [[[20, 30, 40],
         [40, 50, 60]]]])

Я не ищу поведение.tf.reshape и tf.concat мне тоже не помогают.

Ответы [ 3 ]

0 голосов
/ 01 декабря 2018

Мы можем поменять / переставить оси и изменить их форму -

tf.reshape(tf.transpose(c_t,(1,0,2)),(c_t.shape[1],-1))

Соответствующие - Интуиция и идея преобразования четырехмерного массива в двухмерный массив в NumPy

0 голосов
/ 02 декабря 2018

Если вы хотите сделать это вручную на атомном уровне, то нижеприведенный подход также сработает.

In [132]: c=np.array([[[2,3,4],[4,5,6]],[[20,30,40],[40,50,60]]])
In [133]: tfc = tf.convert_to_tensor(c) 

In [134]: slices = [tf.squeeze(tfc[:1, ...]), tf.squeeze(tfc[1:, ...])]  
In [135]: stacked = tf.concat(slices, axis=1) 
In [136]: stacked.eval()           
Out[136]: 
array([[ 2,  3,  4, 20, 30, 40],
       [ 4,  5,  6, 40, 50, 60]])
0 голосов
/ 01 декабря 2018

Один из способов заставить его работать - сначала вставить тензор в список, а затем объединить тензоры в списке по первой оси:

new_c = tf.concat(tf.unstack(c_t), axis=1)
sess.run(new_c)

array([[ 2,  3,  4, 20, 30, 40],
       [ 4,  5,  6, 40, 50, 60]])
...