2017-02-20 8 views
1

Gibt es eine Möglichkeit, einen Tensor variabler Größe auf eine bestimmte Form mit einem bestimmten Pad-Wert aufzufüllen? Zum Beispiel der Tensoren gegeben:TensorFlow - Pad unbekannte Größe Tensor auf eine bestimmte Größe?

[[1, 2], 
[3, 4]] 

und

[[1, 2, 3], 
[4, 5, 6]] 

Gibt es eine Möglichkeit, eine generische Operation zu haben, die entweder übernehmen würden und Pad sie mit einem Wert (etwa [2, 4] mit Wert zu gestalten -1)

[[1, 2, -1, -1], 
[3, 4, -1, -1]] 

und

: zu folgenden Ergebnissen führen

jeweils? Meine Schlussfolgerung (falls es eine bessere Lösung gibt) besteht darin, dass ich Beispiele aus einer TFRecords-Datei habe, von denen ein Teil eine variable Länge hat. Bei der Verarbeitung erleichtert eine statische Länge die Arbeit.

Antwort

-1

In TensorFlow gibt es keine Möglichkeit, dies zu tun.Sie müssen die Daten vorverarbeiten und einen Satz von -1 hinzufügen, um die gewünschte Länge zu erhalten. Zum Beispiel erhalten Sie die Länge und Schleife durch list[0].append(-1) und list[1].append(-1) die gewünschte Anzahl von Malen - die Länge der Liste. Hoffe das hilft!

0

Ich stieß auf etwas ähnliches. Nicht ganz allgemein, aber Sie können etwas tun wie:

test_a = tf.constant([[1, 2], [3, 4]]) 
test_b = tf.constant([[1, 2, 3], [4, 5, 6]]) 

def pad_second_dim(input, desired_size): 
    padding = tf.tile([[0]], tf.stack([tf.shape(input)[0], desired_size - tf.shape(input)[1]], 0)) 
    return tf.concat([input, padding], 1) 

with tf.Session() as sess: 
    print sess.run(pad_second_dim(test_a, 4)) 
    # [[1 2 0 0] [3 4 0 0]] 
    print sess.run(pad_second_dim(test_b, 4)) 
    # [[1 2 3 0] [4 5 6 0]] 
1

Ja. Es gibt. Vorausgesetzt, Sie müssen den Rang des Tensors nicht ändern, ist das sehr einfach.

tf.pad() akzeptiert normale Python-Listen mit Tensoren. Das Format der Auffüllung ist eine Liste von Paaren, wie viel auf jeder Seite dieser Dimension aufzufüllen ist.

z.B.

t = tf.constant([[1, 2], [3, 4]]) 
paddings = [[0, 0], [0, 4-tf.shape(t)[0]]] 
out = tf.pad(t, paddings, 'CONSTANT', constant_values=-1) 
sess.run(out) 
# gives: 
# array([[ 1, 2, -1, -1], 
#  [ 3, 4, -1, -1]], dtype=int32) 

Wenn Sie dies eine nützliche Funktion verallgemeinern wollen, können Sie so etwas wie tun könnte:

def pad_up_to(t, max_in_dims, constant_values): 
    s = tf.shape(t) 
    paddings = [[0, m-s[i]] for (i,m) in enumerate(max_in_dims)] 
    return tf.pad(t, paddings, 'CONSTANT', constant_values=constant_values) 

wo max_in_dims ist im Wesentlichen die gewünschte Form des Ausgangs. Hinweis: Diese Funktion schlägt fehl, wenn Sie eine Form angeben, die in jeder Dimension streng kleiner als t ist.

Sie können es gerne verwenden:

t = tf.constant([[1, 2], [3, 4]]) # shape = [2, 2] 
t_padded = pad_up_to(t, [2, 4], -1) # shape = [2, 4], padded with -1s 
Verwandte Themen