2017-02-09 5 views
1

RAMからモデルにテンソルを疎らに詰めようとしています。私はPaddingFIFOQueueを作成しました。これは、疎な値を他の方法でRAMから一括して処理できないという仮定の下で、疎なテンソルのインデックス、値、および形状を別々にキューに入れています(そうでない場合は教えてください)。シーケンスはすべて異なる長さであるため、それらをパディングする必要があります。デキューされた値、インデックス、形状のバッチからSparseTensorを作成する

私は次のことをデキューしています...

indices = [batch size, None, 2] 
values = [batch size, None] 
shapes = [batch size, 2] 

私はSparseTensorを作成するために、これらの値を使用しようとしましたが、次のエラーを取得しています。

ValueError: Shape (512, ?, 2) must have rank 2 

以下の通りであるコードの主要部分は、...

indices, values, shapes = self.queue.dequeue_many(batch_size) 
sp_tensor = tf.SparseTensor(indices, values, shapes) 

Iはによって示されるようにSparseTensorは(ランク2テンソル及びランク2テンソルのないバッチを期待しているためであると仮定しますエラーメッセージ)、私はバッチを変換する方法がわかりません。

+0

あなたは[sparse_merge](https://www.tensorflow.org/api_docs/python/sparse_ops/conversion#sparse_merge)を検討しましたか? –

+0

デキューするテンソルは密なテンソルです。 'sparse_merge'は入力のスパーステンソルと思われます。 'sp_ids:int32またはint64型のvaluesプロパティを持つSparseTensor。 sp_values:任意の種類のASparseTensor。 – user7542570

+0

私の愚かなことです。私は答えに何かをまとめました。 –

答えて

1

これはタイルのビットが可能と整形である:

import tensorflow as tf 

def sparse_tensor_merge(indices, values, shape): 
    """Creates a SparseTensor from batched indices, values, and shapes. 

    Args: 
    indices: A [batch_size, N, D] integer Tensor. 
    values: A [batch_size, N] Tensor of any dtype. 
    shape: A [batch_size, D] Integer Tensor. 
    Returns: 
    A SparseTensor of dimension D + 1 with batch_size as its first dimension. 
    """ 
    merged_shape = tf.reduce_max(shape, axis=0) 
    batch_size, elements, shape_dim = tf.unstack(tf.shape(indices)) 
    index_range_tiled = tf.tile(tf.range(batch_size)[..., None], 
           tf.stack([1, elements]))[..., None] 
    merged_indices = tf.reshape(
     tf.concat([tf.cast(index_range_tiled, tf.int64), indices], axis=2), 
     [-1, 1 + tf.size(merged_shape)]) 
    merged_values = tf.reshape(values, [-1]) 
    return tf.SparseTensor(
     merged_indices, merged_values, 
     tf.concat([[tf.cast(batch_size, tf.int64)], merged_shape], axis=0)) 

をしたがって、例えば:

batch_indices = tf.constant(
    [[[0, 0], [0, 1]], 
    [[0, 0], [1, 1]]], dtype=tf.int64) 
batch_values = tf.constant(
    [[0.1, 0.2], 
    [0.3, 0.4]]) 
batch_shapes = tf.constant(
    [[2, 2], 
    [3, 2]], dtype=tf.int64) 

merged = sparse_tensor_merge(batch_indices, batch_values, batch_shapes) 

with tf.Session(): 
    print(merged.eval()) 

プリント:

SparseTensorValue(indices=array([[0, 0, 0], 
     [0, 0, 1], 
     [1, 0, 0], 
     [1, 1, 1]]), 
    values=array([ 0.1  , 0.2  , 0.30000001, 0.40000001], 
     dtype=float32), 
    dense_shape=array([2, 3, 2])) 

注意組み合わせSparseTensorの形状こと元のバッチディメンションの後に、他のディメンションごとにバッチ全体の最大値が続きますイオン。

+0

説明文とスニペットありがとうございます。これはうまくいった。 – user7542570

関連する問題