const vec_t& back_propagation(const vec_t& curr_delta, size_t index) override {
auto& ws = this->get_worker_storage(index);
conv_layer_worker_specific_storage& cws = conv_layer_worker_storage_[index];
const vec_t& prev_out = *(cws.prev_out_padded_);
const activation::function& prev_h = prev_->activation_function();
vec_t* prev_delta = (pad_type_ == padding::same) ? &cws.prev_delta_padded_ : &ws.prev_delta_;
vec_t& dW = ws.dW_;
vec_t& db = ws.db_;
std::fill(prev_delta->begin(), prev_delta->end(), float_t(0));
// propagate delta to previous layer
for_i(in_.depth_, [&](int inc) {
for (cnn_size_t outc = 0; outc W_[weight_.get_index(0, 0, in_.depth_ * outc + inc)];
const float_t *pdelta_src = &curr_delta[out_.get_index(0, 0, outc)];
float_t *pdelta_dst = &(*prev_delta)[in_padded_.get_index(0, 0, inc)];
for (cnn_size_t y = 0; y back_propagation(ws.prev_delta_, index);
}