2017-01-16 6 views
1

Ich möchte ein bedingtes CNN-Modell in Tensorflow bauen, aber ich habe einige Probleme damit gefunden.Wie CNN-Modell mit wechselnden Frames in Tensorflow generieren?

Angenommen, es eine Matrix Merkmale mit Form benannt ist [64,? 50, 1], und eine andere Matrix Bedingungen mit Form benannt [64,?, 1, 130].

Das erste Dim ist die Losgröße, und das zweite Dim bedeutet die Rahmennummer (der Wert in diesem Dim der beiden Matrizen ist in jeder Charge gleich, aber unterschiedlich in verschiedenen Chargen). Die dritte ist die Merkmaldimension und die letzte Helligkeit ist die Kanalnummer.

Ich möchte die beiden Matrix verketten, das bedeutet, dass wir eine Matrix mit Form erhalten können [64,?, 50, 131] und tun conv2d in tensorflow.

Aber das Problem ist, dass ich diese zwei Matrizen wegen der Differenz in der dritten Dim nicht concat kann. Dann habe ich folgendes gemacht:

x_shapes = x.get_shape() 
    y_shapes = y.get_shape() 
    return tf.concat(3, [x, y*tf.ones([x_shapes[0], x_shapes[1], x_shapes[2], y_shapes[3]])]) 

Aber es funktioniert nicht, weil das zweite Dim nicht bekannt ist.

Ich frage mich, gibt es eine Möglichkeit, dieses Problem zu lösen?

Dank

Antwort

0

Obwohl es nicht klar, aus Ihrer Frage ist, sieht es aus wie Sie die zweite Tensor mit Form [64, ?, 1, 130] in der 3. Dimension übertragen möchten, das Sie Feature Dimension nennen, bevor Sie verketten. Beachten Sie, dass tf.concat alle Dimensionen benötigt, die übereinstimmen müssen, außer demjenigen, mit dem Sie verketten. Aus der Dokumentation von tf.concat:

Die Anzahl der Dimensionen der Eingangs Tensoren müssen, und alle Dimensionen außer concat_dim übereinstimmen müssen gleich sein.

die Sendung entlang der Feature-Dimension zu tun, ist es viel billiger tf.tile zu verwenden, anstatt mit einer Eins Tensor Multiplikation wie Sie tun. Hier ist, wie würden Sie tf.tile verwenden:

tf.concat(3, [x, tf.tile(y, [1, 1, x_shapes.as_list()[2], 1])]) 

In Ihrem Fall, da die dritte Dimension der y bekannt ist statisch, der obige Code funktioniert. Wenn das nicht der Fall ist, können Sie das zweite Argument tf.tile bilden, wie folgt:

tf.tile(y, tf.concat(0, [[1], [1], tf.shape(x)[2:3], [1]])) 
+0

Sorry für die späte Antwort wegen des chinesischen neuen Jahres. Vielen Dank für Ihre freundliche Antwort, und Ihre Antwort funktioniert sehr gut. Danke noch einmal! –