does it make sense to put two convolutional layers sequentially after each other without an activation function
I am working with one model, here part of it:
...
nn.Conv2d(1, 1 * filters_multiplier, kernel_size=(3, 1)),
nn.Conv2d(1 * filters_multiplier, 6 * filters_multiplier, kernel_size=(1, 3)),

# no activation layer

nn.Conv2d(6 * filters_multiplier, 6 * filters_multiplier, kernel_size=(3, 1)),
nn.Conv2d(6 * filters_multiplier, 12 * filters_multiplier, kernel_size=(1, 3)),
nn.MaxPool2d((3, 3), stride=(2, 2)),
...

I understand that layers 1-2 and 3-4 are just convs(3,3) made for easier calculations (3x1 and 1x3 is 6 operations and 3x3 is 9). But does it make sense to put two convolutional layers sequentially after each other without an activation function or it is just a mistake? I mean between convs 1-2 and 3-4 (in commented place). I thought that a convolution followed by a convolution is just a convolution.

The purpose of adding an activation at the end of a layer is to make sure that your model can learn non-linear functions. Without activation, you will just be doing linear regression. It is the activation functions that give neural networks the power to model any function given enough depth ( Universal Approximation Theorem.
Thus it is perfectly fine not to add activations, but then you would lose on non-linearities.
If you use a linear activation function or alternatively if you don't have an activation function then no matter how many layers your neural network has, all your model is doing is just computing a linear
activation function so you might as well not have any hidden layers. (See the figure below for proof). The purpose of depth loses its essence.

For details, you can refer to this video by Andrew Ng https://youtu.be/NkOv_k7r6no.
For Convolutional Neural Network -
Well, this works the same for CNN and we don't need to prove it separately (one can do obviously). As convolutions are themselves a constraint. It just restricts the kernels to a particular spatial location, hence preserves spatial properties. A convolutional layer is really just a more restricted version of a fully connected (FC) layer. This is why you can implement convolutions using an FC layer and vice versa — they’re fundamentally the same thing. [ Source and for further details refer  - https://machinethink.net/blog/object-detection/ &amp; https://youtu.be/bNb2fEVKeEo ]
