2017-01-20 1 views
0

Supposons, j'ai deux ensemble d'images, A et B, chaque 11X5x5x3, où 11 est un certain nombre d'exemples et 5x5x3 est une dimension de l'image.
Existe-t-il un moyen simple dans Tensorflow d'appliquer une convolution pour chaque image dans A_i sur B_i (c'est-à-dire que B_i joue un rôle de filtre et A_i est une entrée dans tf.conv2d)? Par exemple, conv2d (A_1, B_1), conv2d (A_2, B_2), ..., conv2d (A_11, B_11)
Aucun apprentissage de poids ici ne voulait juste appliquer une convolution sur une image plutôt qu'une autre. Je essayé de le faire comme suit:Image sur Image convolution dans Tensorflow

# change B to 5x5x3x11 to be compatible with tf convolution. 
tf.nn.conv2d(A, B, strides=[1,1,1,1], padding ='SAME') 

mais le problème est qu'il applique à chaque convolution A_i sur toute b_i de. Je ne veux pas ça, je veux seulement A_i sur B_j où i == j. Bien sûr, je peux le faire un par un, mais ce ne serait pas efficace et je dois le faire en mode batch.

Un commentaire comment résoudre ce problème?

Merci. J

Répondre

1

Je ne suis pas sûr que ce soit ce dont vous avez besoin, car il est pas vraiment mode batch mais vous pouvez utiliser une fonction de carte:

A = tf.placeholder(dtype=tf.float32, shape=[None, 5, 5, 3]) 
B = tf.placeholder(dtype=tf.float32, shape=[None, 5, 5, 3]) 

output = tf.map_fn(
    lambda inputs : tf.nn.conv2d(
     tf.expand_dims(inputs[0], 0), # H,W,C -> 1,H,W,C 
     tf.expand_dims(inputs[1], 3), # H,W,C -> H,W,C,1 
     strides=[1,1,1,1], 
     padding="SAME" 
    ), # Result of conv is 1,H,W,1 
    elems=[A,B], 
    dtype=tf.float32 
) 
final_output = output[:, 0, :, :, 0] # B,1,H,W,1 -> B,H,W 

Performance dépendra de la façon dont les minuscules circonvolutions séparées seront parallélisées I deviner.

+0

tnx pour votre temps et votre réponse. – superMind