def backward(self): N = self.num_output K = np.prod(self.bottom.shape[1:]) M = self.bottom.shape[0] sgemm(True, False, 1.0, self.top_diff, 0, N, self.bottom, 0, K, 0.0, self.weights_diff, 0, K, N, K, M) sgemv(True, M, N, 1.0, self.top_diff, 0, N, self.bias_multiplier, 0, 1, 0.0, self.bias_diff, 0, 1) sgemm(False, False, 1.0, self.top_diff, 0, N, self.weights, 0, K, 0.0, self.bottom_diff, 0, K, M, K, N)
def launch(self, symbol_table, wait_for): queue = queues[0] bottom = symbol_table[sources[0]] bot_offset = np.prod(bottom.shape[1:]) top_diff = symbol_table[sources[1]] top_offset = np.prod(top_diff.shape[1:]) weights = symbol_table[sources[2]] bottom_diff = symbol_table[sinks[0]] bottom_diff.fill(0) bottom_diff.sync_ocl() weights_diff = symbol_table[sinks[1]] weights_diff.fill(0) weights_diff.sync_ocl() bias_diff = symbol_table[sinks[2]] bias_diff.fill(0) bias_diff.sync_ocl() for i in range(bottom.shape[0]): n = np.prod(top_diff.shape[2:]) sgemv(False, top_diff.shape[1], n, 1.0, top_diff, i * top_offset, n, bias_multiplier, 0, 1, 1.0, bias_diff, 0, 1) im2col(bottom.ocl_buf, col_data.ocl_buf, i * bot_offset).on(queue, im2col_global_size) m = top_diff.shape[1] n = col_data.shape[0] k = col_data.shape[1] sgemm(False, True, 1.0, top_diff, i * top_offset, k, col_data, 0, k, 1.0, weights_diff, 0, n, m, n, k) m = weights.shape[1] n = col_data.shape[1] k = weights.shape[0] sgemm(True, False, 1.0, weights, 0, m, top_diff, i * top_offset, n, 0.0, col_data, 0, n, m, n, k) col2im(col_data.ocl_buf, bottom_diff.ocl_buf, i * bot_offset).on(queue, col2im_global_size)