def conv2d_forward_batch(self, inputs, weights, bias, outputs, padding, stride): num_filters = weights.shape[0] num_images, input_rows, input_cols, num_input_maps = inputs.shape kernel_shape = weights.shape[1:] num_output_pixels = outputs.shape[1] * outputs.shape[2] num_kernel_params = np.prod(kernel_shape) out_shape = (num_output_pixels, num_filters) for i in range(num_images): col = np.zeros((num_output_pixels, num_kernel_params), dtype=self.dtype) _cpuop.im2col(inputs[i].reshape(inputs[i].size), input_rows, input_cols, num_input_maps, kernel_shape[0], kernel_shape[1], padding, padding, padding, padding, stride[0], stride[1], col.reshape(col.size)) reshaped_params = weights.reshape(num_filters, num_kernel_params) np.dot(col, reshaped_params.T, out=outputs[i].reshape(out_shape)) outputs += bias.reshape((1, 1, 1, num_filters))
def conv2d_backward_batch(self, inputs, params, padding, stride, in_deltas, out_deltas, dparams, dbias): num_filters = params.shape[0] num_images, input_rows, input_cols, num_input_maps = inputs.shape kernel_shape = params.shape[1:] num_output_pixels = out_deltas.shape[1] * out_deltas.shape[2] num_kernel_params = np.prod(kernel_shape) dparams.fill(0.0) dbias.fill(0.0) col = np.zeros((num_output_pixels, num_kernel_params), dtype=self.dtype) for i in range(num_images): _cpuop.im2col(inputs[i].reshape(inputs[i].size), input_rows, input_cols, num_input_maps, kernel_shape[0], kernel_shape[1], padding, padding, padding, padding, stride[0], stride[1], col.reshape(col.size)) # Compute gradients reshaped_dparams = dparams.reshape(num_filters, num_kernel_params) reshaped_out_deltas = out_deltas[i].reshape((num_output_pixels, num_filters)) self.dot_add_mm(reshaped_out_deltas, col, out=reshaped_dparams, transa=True) dbias += np.sum(reshaped_out_deltas, axis=0) # Compute in_deltas reshaped_params = params.reshape((num_filters, num_kernel_params)) np.dot(reshaped_out_deltas, reshaped_params, out=col) _cpuop.col2im(col.reshape(col.size), input_rows, input_cols, num_input_maps, kernel_shape[0], kernel_shape[1], padding, padding, padding, padding, stride[0], stride[1], in_deltas[i].reshape(in_deltas[i].size))