As per docs, when using ReduceLROnPlateau,
>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> scheduler = ReduceLROnPlateau(optimizer, 'min')
>>> for epoch in range(10):
>>>     train(...)
>>>     val_loss = validate(...)
>>>     # Note that step should be called after validate()
>>>     scheduler.step(val_loss)

But you are not having that correct imo; Also in my exprience too, it’s slightly tricky to match the performance with a keras model, it generally needs param or arch changes sometimes as well;