MCPcopy Create free account
hub / github.com/arrayfire/arrayfire / conv2FilterGradient

Function conv2FilterGradient

src/backend/opencl/convolve.cpp:206–236  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

204
205template<typename T>
206Array<T> conv2FilterGradient(const Array<T> &incoming_gradient,
207 const Array<T> &original_signal,
208 const Array<T> &original_filter,
209 const Array<T> & /*convolved_output*/,
210 af::dim4 stride, af::dim4 padding,
211 af::dim4 dilation) {
212 const dim4 &cDims = incoming_gradient.dims();
213 const dim4 &fDims = original_filter.dims();
214
215 const bool retCols = false;
216 Array<T> unwrapped =
217 unwrap(original_signal, fDims[0], fDims[1], stride[0], stride[1],
218 padding[0], padding[1], dilation[0], dilation[1], retCols);
219
220 unwrapped = reorder(unwrapped, dim4(1, 2, 0, 3));
221 dim4 uDims = unwrapped.dims();
222 unwrapped =
223 modDims(unwrapped, dim4(uDims[0] * uDims[1], uDims[2] * uDims[3]));
224
225 Array<T> collapsed_gradient = incoming_gradient;
226 collapsed_gradient = reorder(collapsed_gradient, dim4(0, 1, 3, 2));
227 collapsed_gradient = modDims(
228 collapsed_gradient, dim4(cDims[0] * cDims[1] * cDims[3], cDims[2]));
229
230 Array<T> res =
231 matmul(unwrapped, collapsed_gradient, AF_MAT_NONE, AF_MAT_NONE);
232 res = modDims(res, dim4(fDims[0], fDims[1], fDims[2], fDims[3]));
233
234 auto out = flip(res, {1, 1, 0, 0});
235 return out;
236}
237
238#define INSTANTIATE(T) \
239 template Array<T> conv2DataGradient<T>( \

Callers

nothing calls this directly

Calls 7

unwrapFunction · 0.70
reorderFunction · 0.70
matmulFunction · 0.70
dim4Class · 0.50
modDimsFunction · 0.50
flipFunction · 0.50
dimsMethod · 0.45

Tested by

no test coverage detected