# How to set a constant value in conv weight?

Like this:

        fix_w = tf.get_variable('fix_w', shape=[fix_w_size, fix_w_size, 1, 1, 1], initializer=tf.zeros_initializer)
mask = np.zeros([fix_w_size, fix_w_size, 1, 1, 1], dtype=np.float32)
mask[dilation_factor - 1, dilation_factor - 1, 0, 0, 0] = 1
o = tf.expand_dims(x, -1)
o = tf.nn.conv3d(o, fix_w, strides=[1,1,1,1,1], padding='SAME')


just use the functional convolution instead of nn convlution. In the functional it ask for the weigths such that you can fix them

how to fix them this way？
Could you give me an example?

Hi,
if you look at functionals,
https://pytorch.org/docs/0.4.1/nn.html?highlight=functional%20conv2d#torch.nn.functional.conv2d

What they do is applaying a convolution given an input and a set of filters, kernels, weights or however you wanna call them. So, if you define some filters and never modify them, you are achiving exactly what you want.

On contrary, nn.conv2d is a class (functionals are functions). When you instantiate it, a set o weights is created. When you train those weights are modified. However, if you look at nn.conv2d source code

lass Conv2d(_ConvNd):
r"""Applies a 2D convolution over an input signal composed of several input
planes.

In the simplest case, the output value of the layer with input size
:math:(N, C_{in}, H, W) and output :math:(N, C_{out}, H_{out}, W_{out})
can be precisely described as:

.. math::

\begin{equation*}
\text{out}(N_i, C_{out_j}) = \text{bias}(C_{out_j}) +
\sum_{k = 0}^{C_{in} - 1} \text{weight}(C_{out_j}, k) \star \text{input}(N_i, k)
\end{equation*},

where :math:\star is the valid 2D cross-correlation_ operator,
:math:N is a batch size, :math:C denotes a number of channels,
:math:H is a height of input planes in pixels, and :math:W is
width in pixels.

* :attr:stride controls the stride for the cross-correlation, a single
number or a tuple.

* :attr:padding controls the amount of implicit zero-paddings on both
sides for :attr:padding number of points for each dimension.

* :attr:dilation controls the spacing between the kernel points; also
known as the à trous algorithm. It is harder to describe, but this link_
has a nice visualization of what :attr:dilation does.

* :attr:groups controls the connections between inputs and outputs.
:attr:in_channels and :attr:out_channels must both be divisible by
:attr:groups. For example,

* At groups=1, all inputs are convolved to all outputs.
* At groups=2, the operation becomes equivalent to having two conv
layers side by side, each seeing half the input channels,
and producing half the output channels, and both subsequently
concatenated.
* At groups= :attr:in_channels, each input channel is convolved with
its own set of filters (of size
:math:\left\lfloor\frac{\text{out_channels}}{\text{in_channels}}\right\rfloor).

The parameters :attr:kernel_size, :attr:stride, :attr:padding, :attr:dilation can either be:

- a single int -- in which case the same value is used for the height and width dimension
- a tuple of two ints -- in which case, the first int is used for the height dimension,
and the second int for the width dimension

.. note::

Depending of the size of your kernel, several (of the last)
columns of the input might be lost, because it is a valid cross-correlation_,
and not a full cross-correlation_.

.. note::

The configuration when groups == in_channels and out_channels == K * in_channels
where K is a positive integer is termed in literature as depthwise convolution.

In other words, for an input of size :math:(N, C_{in}, H_{in}, W_{in}), if you want a
depthwise convolution with a depthwise multiplier K,
then you use the constructor arguments
:math:(\text{in_channels}=C_{in}, \text{out_channels}=C_{in} * K, ..., \text{groups}=C_{in})

Args:
in_channels (int): Number of channels in the input image
out_channels (int): Number of channels produced by the convolution
kernel_size (int or tuple): Size of the convolving kernel
stride (int or tuple, optional): Stride of the convolution. Default: 1
dilation (int or tuple, optional): Spacing between kernel elements. Default: 1
groups (int, optional): Number of blocked connections from input channels to output channels. Default: 1
bias (bool, optional): If True, adds a learnable bias to the output. Default: True

Shape:
- Input: :math:(N, C_{in}, H_{in}, W_{in})
- Output: :math:(N, C_{out}, H_{out}, W_{out}) where

.. math::
H_{out} = \left\lfloor\frac{H_{in}  + 2 \times \text{padding} - \text{dilation}
\times (\text{kernel_size} - 1) - 1}{\text{stride}} + 1\right\rfloor

W_{out} = \left\lfloor\frac{W_{in}  + 2 \times \text{padding} - \text{dilation}
\times (\text{kernel_size} - 1) - 1}{\text{stride}} + 1\right\rfloor

Attributes:
weight (Tensor): the learnable weights of the module of shape
(out_channels, in_channels, kernel_size, kernel_size)
bias (Tensor):   the learnable bias of the module of shape (out_channels)

Examples::

>>> # With square kernels and equal stride
>>> m = nn.Conv2d(16, 33, 3, stride=2)
>>> # non-square kernels and unequal stride and with padding
>>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2))
>>> # non-square kernels and unequal stride and with padding and dilation
>>> m = nn.Conv2d(16, 33, (3, 5), stride=(2, 1), padding=(4, 2), dilation=(3, 1))
>>> input = torch.randn(20, 16, 50, 100)
>>> output = m(input)

.. _cross-correlation:
https://en.wikipedia.org/wiki/Cross-correlation

"""

def __init__(self, in_channels, out_channels, kernel_size, stride=1,
kernel_size = _pair(kernel_size)
stride = _pair(stride)
dilation = _pair(dilation)
super(Conv2d, self).__init__(
in_channels, out_channels, kernel_size, stride, padding, dilation,
False, _pair(0), groups, bias)

def forward(self, input):
return F.conv2d(input, self.weight, self.bias, self.stride,