29 #include "tiny_dnn/core/params/deconv_params.h"
35 inline void tiny_deconv2d_kernel(
const deconv_params& params,
40 const bool layer_parallelize) {
42 for_i(layer_parallelize, in.size(), [&](
int sample) {
43 for (serial_size_t o = 0; o < params.out.depth_; o++) {
44 for (serial_size_t inc = 0; inc < params.in.depth_; inc++) {
45 if (!params.tbl.is_connected(o, inc)) continue;
47 serial_size_t idx = 0;
48 idx = params.in.depth_ * o + inc;
49 idx = params.weight.get_index(0, 0, idx);
50 assert(idx < W.size());
51 const float_t *pw = &W[idx];
53 idx = params.in.get_index(0, 0, inc);
54 assert(static_cast<serial_size_t>(sample) < in.size() &&
55 idx < in[sample].size());
56 const float_t *pi = &in[sample][idx];
58 idx = params.out.get_index(0, 0, o);
59 assert(static_cast<serial_size_t>(sample) < a.size() &&
60 idx < a[sample].size());
61 float_t *pa = &a[sample][idx];
63 for (serial_size_t y = 0; y < params.in.height_; y++) {
64 for (serial_size_t x = 0; x < params.in.width_; x++) {
65 const float_t * ppw = pw;
66 const float_t * ppi = pi + y * params.in.width_ + x;
68 for (serial_size_t wy = 0; wy < params.weight.height_; wy++) {
69 for (serial_size_t wx = 0; wx < params.weight.width_; wx++) {
70 pa[(y * params.h_stride + wy) *
71 params.out.width_ + (x *
72 params.w_stride + wx)] += ppw[wy *
73 params.weight.width_ + wx] * (*ppi);
80 if (params.has_bias) {
81 float_t * pa = &a[sample][params.out.get_index(0, 0, o)];
82 float_t * paa = pa + params.out.width_ * params.out.height_;
83 std::for_each(pa, paa, [&](float_t& f) { f += bias[o]; });