I think in Pytorch the way of thinking, differently from TF/Keras, is that layers are generally used on some process that requires some gradients, Flatten(), Reshape(), Add(), etc… are just formal process, no gradients involved, so you can just use helper functions like the ones in torch.nn.functional.*…
There’s some use cases where a Reshape() layer can come in handy, like in embedded systems where you add to your model firstly a reshape, so that all the model is compacted to be flashed in the device, and the reshape can adjust incoming data from sensors…
For high level DL, those layers are more confusing than beneficial…