2016-05-24 8 views
2

ProblemTF: Erstellen Maske aus binären Daten lesen (Punkt-Zuordnung)

ich Daten aus einer binären Datenbank und ein Teil dieser Daten gelesen werden Koordinaten (x, y) innerhalb eines Bildes Maske und das Bild selbst. Die Maske selbst ist einfach zu erstellen, wenn ich die Bildform und die Koordinaten kenne. Im Grunde muss ich nur eine leere Maske mit der Form erstellen, die durch das gelesene Bild definiert ist, und das Pixel an den gegebenen Koordinaten auf eins setzen. Also, was ich im Grunde wollen, ist so etwas wie die folgenden:

import tensorflow as tf 
import numpy as np 

# coord read from binary file 
x = tf.constant([1]) 
y = tf.constant([1]) 

# shape is taken from another image read from binary file 
shape = tf.shape(tf.constant(np.ones([3, 3]).astype('float32'))) 

# create empty image but set (x,y) = 1 
mask = tf.zeros(shape) 
mask[x, y] = 1 

die aufgrund einer Typeerror versagt:

TypeError: 'Tensor' object does not support item assignment 

Versuch 1

tmp = np.zeros([3, 3]) 
tmp[x, y] = 1 
mask = tf.constant([tmp.tolist()]) 

Zuerst dachte ich, es eine sein könnte Guter Ansatz, um ein numpy Array mit den gewünschten Daten zu erstellen und es dann mit tf.constant() in einen Tensor umzuwandeln. Aber das führt zu dem Problem, dass ich die Tensoren x, y nicht zur Indizierung verwenden kann. Dies liegt daran, dass diese zum Zeitpunkt der Erstellung lediglich Platzhalter für die Daten sind, die aus der Datenbank gelesen werden (das gleiche Problem würde auftreten, wenn ich die Größe 3x3 aus den Binärdaten lesen möchte). Bitte beachten Sie, dass das Ausführen der Tensoren x und y in einer Sitzung, um die Werte nicht eine Lösung für mich zu bekommen, weil ich die Daten benötigen, um ein Netzwerk zu trainieren. Es ist also notwendig, alle Daten innerhalb eines Aufrufs zu erfassen und zu verarbeiten.

Versuch 2

zero_tensor = tf.zeros(shape) 
delta = tf.SparseTensor([[1, 1]], [1.0], [3, 3]) 
mask = zero_tensor + tf.sparse_tensor_to_dense(delta) 

sess = tf.Session() 
mask_val = sess.run([mask]) 
print mask_val 

Online fand ich eine Lösung, wie eine spärliche Tensor erstellen und verwenden es einen Tensor zu ändern. Problem ist, dass die Koordinaten und die Form der Maske fest codiert sein müssen und nicht zur Laufzeit vom Tensor gelesen werden können.

Ich schätze Ihre Vorschläge.

Antwort

0

Sie waren fast in Ihrem Versuch 2!

Die Funktion tf.SparseTensor() oder die bessere tf.sparse_to_dense(sparse_indices, output_shape, sparse_values) (siehe doc.) können Sie die Daten, die Sie als sparse_indices und output_shape lesen nehmen.


Hier ist der Code:

import tensorflow as tf 
import numpy as np 

# coord read from binary file 
x = tf.constant([1]) 
y = tf.constant([1]) 

# shape is taken from another image read from binary file 
shape = tf.constant([3, 3]) 

# Little modification to get the right shape for the indices 
sparse_indices = tf.transpose(tf.pack([x, y])) 
mask = tf.sparse_to_dense(sparse_indices, shape, 1.) 
+0

Vielen Dank, das hat geholfen! – zimmermc