You are correct, the label shape is a 1-d array/tensor.
Here is the training code:
def train(model, epochs, train_set, lr=0.001, print_every=10):
    
    criterion = nn.MSELoss()
    opt = optim.Adam(model.parameters(), lr=lr)
    
    for e in range(epochs):
        hidden = None
        for x, y in train_set:
            
            opt.zero_grad()
            
            out, hidden = model(x, hidden)
        
            loss = criterion(out, y.squeeze(0))
            loss.backward()
            opt.step()
            
            hidden = tuple([h.data for h in hidden])
            
        if e % print_every == 0:
            print(f'Epoch {e} Training Loss: {loss}')

And here is my full notebook 17.  At this point, I think I’ve piecemeal copied and pasted the whole thing into this thread. Maybe it will be helpful to have it all in one place.
Thank you again for your ongoing help! I hope to finally understand this stuff and stop bugging you