Ответ 1
Если вы просто сериализуете местоположения 1s, вы можете немного разобраться с вашим правильным разреженным тензором:
Анализируемый разреженный тензор features['features']
будет выглядеть примерно так:
features['features'].indices: [[batch_id, position]...]
Где position
- бесполезное перечисление.
но вы действительно хотите, чтобы feature['features']
выглядел как [[batch_id, one_position], ...]
Где one_position
- фактическое значение, указанное в вашем разреженном тензоре.
Итак:
indices = features['features'].indices
indices = tf.transpose(indices)
# Now looks like [[batch_id, batch_id, ...], [position, position, ...]]
indices = tf.stack([indices[0], features['features'].values])
# Now looks like [[batch_id, batch_id, ...], [one_position, one_position, ...]]
indices = tf.transpose(indices)
# Now looks like [[batch_id, one_position], [batch_id, one_position], ...]]
features['features'] = tf.SparseTensor(
indices=indices,
values=tf.ones(shape=tf.shape(indices)[:1])
dense_shape=1 + tf.reduce_max(indices, axis=[0])
)
Voila! features['features']
теперь представляет собой матрицу, которая является вашей партией разреженных векторов, конкатенированных.
ПРИМЕЧАНИЕ: если вы хотите рассматривать это как плотный тензор, вам нужно будет сделать tf.sparse_to_dense
И плотный тензор будет иметь форму [None, None]
(что делает его трудным для работы). Если вы знаете максимальная длина вектора, которую вы, возможно, захотите сделать с жестким кодом: dense_shape=[batch_size, max_vector_length]