2016-06-17 2 views
1
weights = tf.placeholder("float",[5,5,1,1]) 
imagein = tf.placeholder("float",[1,32,32,1]) 
conv = tf.nn.conv2d(imagein,weights,strides=[1,1,1,1],padding="SAME") 
deconv = tf.nn.conv2d_transpose(conv, weights, [1,32,32,1], [1,1,1,1],padding="SAME") 


dw = np.random.rand(5,5,1,1) 
noise = np.random.rand(1,32,32,1) 

sess = tf.InteractiveSession() 

convolved = conv.eval(feed_dict={imagein: noise, weights: dw}) 
deconvolved = deconv.eval(feed_dict={imagein: noise, weights: dw}) 

Я пытался вычислить conv2d_transpose, чтобы обратить свертку в Tensorflow. Я понимаю, что «deconvolved» должен содержать те же данные, что и «шум» после применения обычной свертки, а затем его транспонирование, но «deconvolved» просто содержит совершенно другое изображение. Что-то не так с моим кодом, или теория неверна?Почему этот Conv2d_Transpose/deconv2d не возвращает исходный вход в тензорном потоке?

ответ

1

Есть причина, по которой это называется conv2d_transpose, а не deconv2d: это не деконволюция. Свертка не является ортогональным преобразованием, поэтому она обратная (деконволюция) не совпадает с ее транспонированием (conv2d_transpose).

Ваша путаница понятна: вызов транспонирования свертки «деконволюция» является стандартной практикой нейронной сети в течение многих лет. Я счастлив, чем мы смогли исправить имя, которое должно быть математически правильным в TensorFlow; более подробно здесь:

https://github.com/tensorflow/tensorflow/issues/256