33 maxpool_op_internal(
const tensor_t& in_data,
35 std::vector<std::vector<serial_size_t>>& max_idx,
36 const std::vector<std::vector<serial_size_t>>& out2in,
37 const bool layer_parallelize) {
38 for_i(layer_parallelize, in_data.size(), [&](
int sample) {
39 const vec_t& in = in_data[sample];
40 vec_t& a = out_data[sample];
41 std::vector<serial_size_t>& max = max_idx[sample];
43 for (serial_size_t i = 0; i < out2in.size(); i++) {
44 const auto& in_index = out2in[i];
45 float_t max_value = std::numeric_limits<float_t>::lowest();
47 for (auto j : in_index) {
48 if (in[j] > max_value) {
59 maxpool_grad_op_internal(tensor_t& prev_delta,
60 const tensor_t& curr_delta,
61 std::vector<std::vector<serial_size_t>>& max_idx,
62 const std::vector<serial_size_t>& in2out,
63 const bool layer_parallelize) {
64 for_i(layer_parallelize, prev_delta.size(), [&](
int sample) {
65 vec_t& prev = prev_delta[sample];
66 const vec_t& curr = curr_delta[sample];
67 const std::vector<serial_size_t>& max = max_idx[sample];
69 for (serial_size_t i = 0; i < in2out.size(); i++) {
70 serial_size_t outi = in2out[i];
71 prev[i] = (max[outi] == static_cast<serial_size_t>(i)) ?
72 curr[outi] : float_t(0);