Python 如何在tensorflow中省略四维张量中的零?

Python 如何在tensorflow中省略四维张量中的零?,python,tensorflow,Python,Tensorflow,假设我有一个张量: import tensorflow as tf t = tf.Variable([[[[0., 235., 0., 0., 1006., 0., 0., 23., 42.], [77., 0., 0., 12., 0., 0., 33., 55., 0.]], [[0., 132., 0., 0., 234., 0., 1., 24., 0.], [43., 0., 0., 124., 0., 0., 0., 52., 645]]]]) 我

假设我有一个张量:

import tensorflow as tf
t = tf.Variable([[[[0., 235., 0., 0., 1006., 0., 0., 23., 42.], [77., 0., 0., 12., 0., 0., 33., 55., 0.]],
                 [[0., 132., 0., 0., 234., 0., 1., 24., 0.], [43., 0., 0., 124., 0., 0., 0., 52., 645]]]])
我想省略零,留下一个形状的张量:(1,2,2,4),其中4是类张量中非零元素的数量

t = tf.Variable([[[[235., 1006., 23., 42], [77., 12., 33., 55.]],
                 [[132., 234., 1., 24.], [43., 124., 52., 645]]]])
我用布尔掩码在一维张量上做了这个。我怎么能省略四维张量中的零呢。它可以推广到更高级别吗?

使用TensorFlow 1.12:

import tensorflow as tf

def batch_of_vectors_nonzero_entries(batch_of_vectors):
  """Removes non-zero entries from batched vectors.

  Requires that each vector have the same number of non-zero entries.

  Args:
    batch_of_vectors: A Tensor with length-N vectors, having shape [..., N].
  Returns:
    A Tensor with shape [..., M] where M is the number of non-zero entries in
    each vector.
  """
  nonzero_indices = tf.where(tf.not_equal(
      batch_of_vectors, tf.zeros_like(batch_of_vectors)))
  # gather_nd gives us a vector containing the non-zero entries of the
  # original Tensor
  nonzero_values = tf.gather_nd(batch_of_vectors, nonzero_indices)
  # Next, reshape so that all but the last dimension is the same as the input
  # Tensor. Note that this will fail unless each vector has the same number of
  # non-zero values.
  reshaped_nonzero_values = tf.reshape(
      nonzero_values,
      tf.concat([tf.shape(batch_of_vectors)[:-1], [-1]], axis=0))
  return reshaped_nonzero_values

t = tf.Variable(
    [[[[0., 235., 0., 0., 1006., 0., 0., 23., 42.],
       [77., 0., 0., 12., 0., 0., 33., 55., 0.]],
      [[0., 132., 0., 0., 234., 0., 1., 24., 0.],
       [43., 0., 0., 124., 0., 0., 0., 52., 645]]]])
nonzero_t = batch_of_vectors_nonzero_entries(t)

with tf.Session():
    tf.global_variables_initializer().run()
    result_evaled = nonzero_t.eval()
    print(result_evaled.shape, result_evaled)
印刷品:

(1, 2, 2, 4) [[[[  2.35000000e+02   1.00600000e+03   2.30000000e+01   4.20000000e+01]
   [  7.70000000e+01   1.20000000e+01   3.30000000e+01   5.50000000e+01]]

  [[  1.32000000e+02   2.34000000e+02   1.00000000e+00   2.40000000e+01]
   [  4.30000000e+01   1.24000000e+02   5.20000000e+01   6.45000000e+02]]]]

如果结果是参差不齐的,那么查看s可能会很有用。

在'tf.concat(0,[tf.shape(批向量)[:-1],-1]])中,我得到一个错误
ValueError:两个形状中的维度0必须相等,但都是3和1。形状为[3]和[1]。将形状0与其他形状合并。对于输入形状为[3]、[1]的“concat_2/concat_dim”(op:“Pack”)。
没错,对此表示抱歉。我已经更新了TF1.x兼容性的示例(交换了concat参数)。