2017-01-20 3 views
0

Предположим, у меня есть два набора изображений: A и B, каждый 11X5x5x3, где 11 - это число примеров, а 5x5x3 - размер изображения.
Есть ли простой способ в Tensorflow применить свертку для каждого изображения в A_i через B_i (т. Е. B_i играет роль фильтра, а A_i - вход в tf.conv2d)? Например, conv2d (A_1, B_1), conv2d (A_2, B_2), ..., conv2d (A_11, B_11)
Здесь нет никакого изучения веса, просто нужно применить свертку на одном изображении поверх другого. я попытался сделать это следующим образом:Image over Image convolution in Tensorflow

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

но проблема состоит в том, что она применяется свертку на каждой A_i по всем B_i годов. Я не хочу этого, я хочу A_i только над B_j, где i == j. Конечно, я могу сделать это один за другим, но это было бы неэффективно, и мне нужно сделать это в пакетном режиме.

Любой комментарий, как решить эту проблему?

Спасибо. J

ответ

1

Я не уверен, что это то, что вам нужно, потому что это на самом деле не пакетный режим, но вы можете использовать функцию карты:

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 

Производительность будет зависеть от того, как крошечные отдельные витки будут распараллеливание I Угадай.

+0

tnx для вашего времени и ответа. – superMind