2017-07-04 5 views
2

Ich stehe vor einem ziemlich seltsamen Problem. Ich habe ein Netzwerk, das die folgenden „zentralen“ Code läuft darauf hinaus:Tensorflow-Fehler beim Rückwärtsfahren durch conv2d

# COSINE 
proj = tf.multiply(proj, cosine_w, name = 'cosine-weighting') 

# PARKER 
proj = tf.multiply(proj, parker_w, name = 'parker-weighting') 

# RAMLAK 
s = config.proj_shape 
proj = tf.reshape(proj, [ s.N, 1, s.H, s.W ]) 
proj = tf.nn.conv2d(
     input = proj, 
     filter = kernel, 
     strides = [ 1, 1, 1, 1 ], 
     padding = 'SAME', 
     data_format = 'NCHW', 
     name = 'ramlak-filter' 
) 
proj = tf.reshape(proj, config.proj_shape.toNCHW()) 

# BACKPROJECTION 
volume = backproject(
     projections = proj, 
     # other arguments, which are attrs in the user defined op 
) 

ich einige Projektionsdaten erhalten in proj, die ein N x H x W Tensor (wo N die Anzahl der Vorsprünge ist). Diese Daten werden dann in zwei Stufen gewichtet und anschließend mit einem 1-dimensionalen Filterkernel gefiltert. Beachten Sie hier, dass ich keine unterschiedlichen Gewichte für die verschiedenen Projektionsbilder (die N Dimension) möchte. Daher verforme ich proj, um eine Größe von 1 in der Kanaldimension zu haben, und interpretiere die Projektionsbilder als verschiedene Bilder von einem Stapel. Die Backproject-Funktion ist eine benutzerdefinierte Tensorflow-Operation, die in C++/cuda mit einem registrierten Gradienten implementiert ist.

Alles funktioniert gut für den Forward-Pass. Aber wenn ich versuche, den Gradienten w.r.t des Filterkerns zu berechnen, z. von

tf.gradients(volume, kernel, volume) 

wenn die folgende Fehler:

NotFoundError (see above for traceback): No algorithm without scratch worked! 
[[Node: gradients/LAReconstructor_1/LAReconstructor/ramlak-filter_grad/Conv2DBackpropFilter = Conv2DBackpropFilter[T=DT_FLOAT, _class=["loc:@LAReconstructor_1/LAReconstructor/ramlak-filter"], data_format="NCHW", padding="SAME", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/gpu:0"](LAReconstructor_1/LAReconstructor/Reshape, gradients/LAReconstructor_1/LAReconstructor/ramlak-filter_grad/Shape_1, gradients/LAReconstructor_1/LAReconstructor/Reshape_1_grad/Reshape)]] 

ich einige minimale Beispiel zu liefern versucht, der den Fehler wiedergibt, aber ich konnte es in einem solchen minimalen Beispiel nicht reproduzieren. Ich habe den Gradient w.r.t auf proj überprüft und er entspricht meinen Erwartungen.

Hat jemand eine Idee, was hier schief gehen könnte?

EDIT:

Ich habe gefunden, nur ein minimales Beispiel, das den gleichen Fehler erzeugt:

import tensorflow as tf 

proj = tf.Variable(tf.random_normal([720,1,400,600], stddev = 2)) 
kernel = tf.Variable(tf.random_normal([1, 401, 1, 1], stddev = .5), trainable = True) 
proj = tf.nn.conv2d(
    input = proj, 
    filter = kernel, 
    strides = [ 1, 1, 1, 1 ], 
    padding = 'SAME', 
    data_format = 'NCHW', 
    name = 'ramlak-filter' 
) 
grad = tf.gradients(proj, kernel, proj) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print(sess.run(grad)) 

Es scheint auf die Größe des proj zusammenzuhängen. Wenn ich das zu [100, 1, 400, 600] ändere, verschwindet der Fehler. Aber ich brauche diese große Losgröße. Irgendwelche Ideen?

+0

Scheint mir ein 'tensorflow' Fehler. –

+0

Glaubst du wirklich, das ist ein Fehler? Derzeit denke ich, dass dies eine Grenze für CuDNN sein könnte. Was meinst du? Ansonsten möchte ich Tensorflow berichten .. – ma0ho

+0

Mai seine cuDnn sein ... Der Grund, ich denke, es ist ein 'tensorflow Begrenzung/issue' ist, wenn ich Vorwärtspfad mit einem viel größeren Batch-Input habe versucht, [1500, 1, 400, 600] dort Dort war kein Problem. Aber die Backpropagation eines Faltungsnetzwerkes ist auch konvolutionell, also sollte es auch so funktionieren, wie es in forward geschieht. Ihr minimales Beispiel ist ein guter Test, Sie sollten Tensorflow melden. Und übrigens, wenn Ihre Kernel-Größe wie im Beispiel definiert ist, sollten Sie versuchen 1-D-Conv. –

Antwort

Verwandte Themen