| 71 | } |
| 72 | |
| 73 | static void update_pooling(const instruction_ref& input, const instruction_ref& ins, module& m) |
| 74 | { |
| 75 | auto op = any_cast<op::pooling>(ins->get_operator()); |
| 76 | if(op.mode == op::pooling_mode::average) |
| 77 | { |
| 78 | return; |
| 79 | } |
| 80 | auto kdims = input->get_shape().ndim() - 2; |
| 81 | if(std::equal(op.padding.begin(), |
| 82 | op.padding.begin() + kdims, |
| 83 | op.padding.begin() + kdims, |
| 84 | op.padding.end())) |
| 85 | return; |
| 86 | |
| 87 | std::vector<int64_t> padding(input->get_shape().ndim() * 2, 0); |
| 88 | std::vector<size_t> pads_l(op.padding.begin(), op.padding.begin() + kdims); |
| 89 | std::vector<size_t> pads_r(op.padding.begin() + kdims, op.padding.end()); |
| 90 | op.padding = std::vector<size_t>(kdims * 2, 0); |
| 91 | std::copy(pads_l.begin(), pads_l.end(), padding.begin() + 2); |
| 92 | std::copy(pads_r.begin(), pads_r.end(), padding.begin() + kdims + 2 + 2); |
| 93 | |
| 94 | float pad_val = 0.0f; // for the lpnorm |
| 95 | if(op.mode == op::pooling_mode::max) |
| 96 | { |
| 97 | // maxpool uses lowest value for padding |
| 98 | pad_val = std::numeric_limits<float>::lowest(); |
| 99 | } |
| 100 | auto pad_op = m.insert_instruction(ins, op::pad{padding, pad_val}, input); |
| 101 | |
| 102 | auto new_inputs = ins->inputs(); |
| 103 | new_inputs.front() = pad_op; |
| 104 | |
| 105 | m.replace_instruction(ins, op, new_inputs); |
| 106 | } |
| 107 | |
| 108 | void insert_pad::apply(module& m) const |
| 109 | { |
no test coverage detected