correct
I think incorrect - you’ll receive padding values for shorter sequences, so you have to do something like gather(output, indexes=(seq_lens-1).expand(…), dim=time). If you’d use GRU, you could just use final hidden_states (they individually stop changing as soon as sequences end and are returned without time dimension), but for LSTM hidden state != output (usually denoted as c and h)
2.2) not sure I understand, but packed batched sequences are still processed together, for efficiency reasons. it is more about implementation details.
you should use “causal convolutions” for timeseries, i.e. convolution outputs should be shifted as to avoid information leaks into the “future”. I can’t advise any elegant solutions for using convolutions with variable length sequences…
RNN outputs usually already come from a non-linear activation function, so no. It is possible to insert a LayerNorm layer there instead.