This is happening because in your training loop you are only looping over your epochs and not your dataset. Because of this X_train never changes so your model predicts the same thing every time and the loss will not change. You need to also loop over your dataset by doing something like this
for t in range(num_epochs):
    for batch_idx, (inputs, targets) in enumerate(dataloader):
         optimiser.zero_grad()
         y_train_pred = model(inputs)    

         loss = criterion(y_train_pred, targets.reshape(targets.shape[0],1,1))
         loss.backward()
        optimiser.step()
    print("Epoch ", t, "MSE: ", loss.item())
    hist[t] = loss.item()

Whatever you dataset is you need to loop through it so you get different batches.