Exemplo n.º 1
0
    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))
Exemplo n.º 2
0
    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))