2017-07-04 73 views
2

我正面臨一個相當奇怪的問題。我有歸結爲下列「中央」代碼的網絡:Tensorflow錯誤,通過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 
) 

我得到proj一些投影數據,這是一個N x H x W張量(其中N是突起的數量)。然後將這些數據分兩個階段加權,然後用1維濾波器內核進行濾波。請注意,我不希望不同的投影圖像具有不同的權重(尺寸爲N)。因此,我將proj重塑爲在通道維中的大小爲1,並將投影圖像「解釋」爲批次中的不同圖像。 backproject函數是一個用C++/cuda實現的自定義張量流,具有已註冊的漸變效果。

一切正常工作的正向通過。但是,如果我嘗試計算濾波器內核的梯度w.r.t,通過

tf.gradients(volume, kernel, volume) 

如果出現以下錯誤:

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)]] 

我試圖提供再現錯誤一些最起碼的例子,但在這樣一個小例子,我無法重現它。我已經檢查了梯度w.r.t到proj,它符合我的期望。

有沒有人有一個想法在這裏可能會出錯?

編輯:

我剛找到產生相同的錯誤小例子:

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)) 

這似乎是關係到proj大小。如果我將其更改爲[100, 1, 400, 600],該錯誤消失。但我其實需要這麼大的批量。有任何想法嗎?

+0

在我看來,一個'tensorflow'錯誤。 –

+0

你真的認爲這是一個錯誤嗎?目前我認爲這可能是CuDNN的一些限制。你是什麼意思?否則,我應該報告給Tensorflow .. – ma0ho

+0

可能是它的cuDnn ...我認爲它的一個'tensorflow限制/問題'的原因是當我嘗試了更大的批量輸入[1500,1,400,600]那裏沒有問題。但是卷積網絡的反向傳播也是卷積的,所以它也應該按照它在前進中的方式工作。你最小的例子是一個很好的測試,你應該向tensorflow報告。順便說一下,如果您的內核大小按照示例中的方式進行定義,則應嘗試1-d conv。 –

回答