2017-11-08 4 views
0

Zwei einfache Beispiele über conv1d: 1 Dimension Features: ` [1, 0, 2, 3,0, 1, 1] gefalteten durch [2, 1, 3], die Ausgänge ist [ 8. 11. 7. 9. 4.], das ist richtig. Aber für die zweidimensionalen Merkmale: "[[1, 0, 2, 3, 0, 1, 1], [1, 0, 2, 3, 0, 1, 1]]" "diese durch" [[2, 1, 3], [2, 1, 3]] "sollte ausgeben" [[8. 11. 7. 9. 4.], [8. 11. 7. 9. 4.]] "conv1d Probleme mit einfachem Beispiel

`

Aber das Programm Ausgabe:

[[ 2. 1. 3.] 
[ 10. 5. 15.] 
[ 2. 1. 3.] 
[ 4. 2. 6.] 
[ 4. 2. 6.] 
[ 6. 3. 9.] 
[ 4. 2. 6.]] 

Wo liegt das Problem? Jede Hilfe wird geschätzt. *

import tensorflow as tf 
i = tf.constant([1, 0, 2, 3, 0, 1, 1], dtype=tf.float32, name='i') 
print(i.shape) 
ii = tf.constant([[1, 0, 2, 3, 0, 1, 1],[1, 0, 2, 3, 0, 1, 1]]) 
print(ii.shape) 
k = tf.constant([2, 1, 3], dtype=tf.float32, name='k') 
k2 = tf.constant([[2, 1, 3], [2, 1, 3]], dtype=tf.float32, name='k') 
print(k2.shape) 

data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') 
data2 = tf.reshape(ii, [1, int(i.shape[0]), 2], name='data') 

kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') 
kernel2 = tf.reshape(k2, [1, int(k2.shape[0]), 3], name='kernel') 
print(kernel2) 

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
res2 = tf.squeeze(tf.nn.conv1d(data2, kernel2, 1, 'VALID')) 

with tf.Session() as sess: 
    print(sess.run(kernel2)) 
    print sess.run(res) 
    print sess.run(res2) 
+0

Eigenschaft: [[1, 0, 2, 3, 0 , 1, 1], [1, 0, 2, 3, 0, 1, 1]] Filter: [[2, 1, 3], [2, 1, 3]] – void

+0

Versuchen Sie, den Wert in 'data2' zu drucken . Ich denke, es wird anders sein als das, was Sie erwarten. – Sunreef

Antwort

1

1) Das tf.nn.conv1d Standardeingabeformat [Batch, in_width, in_channels], in Ihrem Fall ist es [2,7,1] (für Daten 2)

2) Der Convolution-Kernel ist in allen Batches identisch. Sie müssen den Kernel also nicht für jeden Batch klonen, es sei denn, Sie möchten verschiedene Kernel für dieselbe Eingabe anwenden, was zu mehr Kanälen in der Ausgabe führt. (Fe [2,7,2])

Wenn Sie also das erwähnte Ergebnis erhalten möchten, sollte der Code sein, wie folgend:

k = tf.constant([2, 1, 3], dtype=tf.float32, name='k') 

data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data') 
data2 = tf.reshape(ii, [2, int(i.shape[0]), 1], name='data2') 

kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel') 

res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID')) 
res2 = tf.squeeze(tf.nn.conv1d(data2, kernel, 1, 'VALID')) 
+0

Danke deine klare Antwort. Aber ich möchte die folgende Operation implementieren: Jede Zeile des Features (zwei Zeilen in meinem Beispiel) wird mit einem anderen Kernel gefaltet (hier haben wir zwei Kernel). Kannst du erklären, wie das geht? [[1, 0, 2, 3, 0, 1, 1], [1, 3, 2, 3, 5, 1, 1]] XX [[2, 1, 3], [4, 1, 2] ] ==> [[8. 11. 7. 9. 4.], [11. 20. 21. 19. 23.]] Dies kann sein, um einen anderen Kernel auf die verschiedenen Eingaben anzuwenden. [[1, 0, 2, 3, 0, 1, 1], [1, 3, 2, 3, 5, 1, 1]] ist ein 2D-Bild, [[2, 1, 3], [4, 1, 2]] ist ein 2D-Kernel – void

+0

@void gut der beste Weg wäre, sie in verschiedene Operationen zu trennen. Oder wenn Sie sie immer noch auf einmal ausführen möchten, implementieren Sie anschließend Slicing und schneiden Sie 2 von 4 Outputs in Scheiben, aber das wird sehr scharf. Die gesamte Implementierung von tf.nn.conv1d wurde entwickelt, um die Faltungsoperation über mehrere Stapel hinweg zu optimieren, indem diese Eingaben und Kernel in ein Produkt aus 2 Matrizen umgewandelt werden. – asakryukin

+0

@void Und dies wird als Konvertieren von Kernen in [number_ofkernels, kernel width] matrix und Eingabe in [Batches, kernels_size, number_of_receptive_fields] implementiert. Es ist also nicht möglich, alle Kernel mit der Tensorflow-Bibliothek auf alle Bilder anzuwenden. Auf der anderen Seite sehe ich nicht wirklich, warum würden Sie das brauchen? Da dies in Neuronalen Netzen nicht üblich ist, wird dies nicht mit der tf.nn-Bibliothek verglichen. – asakryukin

Verwandte Themen