def in_shape(self, output_shape):
    out_dims = list(output_shape[:self.n_dims_before])
    num_strides = []
    for (i, ds) in enumerate(self.dims_neighbourhoods):
        num_strides.append(output_shape[(self.n_dims_before + i)])
        at_least_width = (num_strides[i] * self.strides[i])
        num_neigh = (at_least_width // ds)
        if ((at_least_width % ds) != 0):
            num_neigh += 1
        out_dims.append((num_neigh * ds))
    return (out_dims, num_strides)
def in_shape(self, output_shape):
    out_dims = list(output_shape[:self.n_dims_before])
    num_strides = []
    for (i, ds) in enumerate(self.dims_neighbourhoods):
        num_strides.append(output_shape[(self.n_dims_before + i)])
        at_least_width = (num_strides[i] * self.strides[i])
        num_neigh = (at_least_width // ds)
        if ((at_least_width % ds) != 0):
            num_neigh += 1
        out_dims.append((num_neigh * ds))
    return (out_dims, num_strides)