我正面臨一個相當奇怪的問題。我有歸結爲下列「中央」代碼的網絡: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]
,該錯誤消失。但我其實需要這麼大的批量。有任何想法嗎?
在我看來,一個'tensorflow'錯誤。 –
你真的認爲這是一個錯誤嗎?目前我認爲這可能是CuDNN的一些限制。你是什麼意思?否則,我應該報告給Tensorflow .. – ma0ho
可能是它的cuDnn ...我認爲它的一個'tensorflow限制/問題'的原因是當我嘗試了更大的批量輸入[1500,1,400,600]那裏沒有問題。但是卷積網絡的反向傳播也是卷積的,所以它也應該按照它在前進中的方式工作。你最小的例子是一個很好的測試,你應該向tensorflow報告。順便說一下,如果您的內核大小按照示例中的方式進行定義,則應嘗試1-d conv。 –