2015-12-07 9 views
7

Gibt es eine Möglichkeit, einen Tensor und Pad jeden Überlauf mit Nullen neu zu gestalten? Ich weiß, dass ndarray.reshape das tut, aber wie ich es verstehe, würde das Konvertieren eines Tensors zu einem Ndray ein Flip-Flop zwischen der GPU und der CPU erfordern.Tensorflow Tensor neu zu gestalten und das Kissen mit Nullen

Tensorflow's reshape() Dokumentation sagt die TensorShapes müssen die gleiche Anzahl von Elementen haben, so wäre vielleicht der beste Weg ein Pad() und dann umformen()?

Ich versuche, erreichen zu:

a = tf.Tensor([[1,2],[3,4]]) 
tf.reshape(a, [2,3]) 
a => [[1, 2, 3], 
     [4, 0 ,0]] 

Antwort

7

Tensorflow bietet nun die Pad-Funktion, die Polsterung auf einem Tensor in einer Reihe von Möglichkeiten (für Arrays wie opencv2 der padding-Funktion) ausführt:

https://www.tensorflow.org/versions/r0.8/api_docs/python/array_ops.html#pad

tf.pad(tensor, paddings, mode='CONSTANT', name=None) 

Beispiel der Dokumenten oben:

# 't' is [[1, 2, 3], [4, 5, 6]]. 
# 'paddings' is [[1, 1,], [2, 2]]. 
# rank of 't' is 2. 
pad(t, paddings, "CONSTANT") ==> [[0, 0, 0, 0, 0, 0, 0], 
            [0, 0, 1, 2, 3, 0, 0], 
            [0, 0, 4, 5, 6, 0, 0], 
            [0, 0, 0, 0, 0, 0, 0]] 

pad(t, paddings, "REFLECT") ==> [[6, 5, 4, 5, 6, 5, 4], 
           [3, 2, 1, 2, 3, 2, 1], 
           [6, 5, 4, 5, 6, 5, 4], 
           [3, 2, 1, 2, 3, 2, 1]] 

pad(t, paddings, "SYMMETRIC") ==> [[2, 1, 1, 2, 3, 3, 2], 
            [2, 1, 1, 2, 3, 3, 2], 
            [5, 4, 4, 5, 6, 6, 5], 
            [5, 4, 4, 5, 6, 6, 5]] 
10

Soweit ich weiß, gibt es keine eingebauten Operator, der diese (tf.reshape() erhalten Sie einen Fehler, wenn die Formen nicht geeignet sind) der Fall ist. Sie können jedoch das gleiche Ergebnis mit ein paar verschiedenen Betreibern erreichen:

a = tf.constant([[1, 2], [3, 4]]) 

# Reshape `a` as a vector. -1 means "set this dimension automatically". 
a_as_vector = tf.reshape(a, [-1]) 

# Create another vector containing zeroes to pad `a` to (2 * 3) elements. 
zero_padding = tf.zeros([2 * 3] - tf.shape(a_as_vector), dtype=a.dtype) 

# Concatenate `a_as_vector` with the padding. 
a_padded = tf.concat(0, [a_as_vector, zero_padding]) 

# Reshape the padded vector to the desired shape. 
result = tf.reshape(a_padded, [2, 3]) 
Verwandte Themen