Metadata-Version: 2.1
Name: lr_schedules
Version: 0.0.1
Summary: 
Author: sradc
Author-email: sidneyradcliffe@sky.com
Requires-Python: >=3.9
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Description-Content-Type: text/markdown

# lr_schedules

This project currently just contains `LinearScheduler`, for custom linear learning rate schedules.


```python
from lr_schedules import LinearScheduler
import matplotlib.pyplot as plt
import torch
```

## PyTorch example, triangle


```python
times = [0, 0.5, 1]
values = [0, 1, 0]

W = torch.tensor([1.0], requires_grad=True)
optimizer = torch.optim.SGD([W], lr=0.1)
linear_scheduler = LinearScheduler(times, values, total_training_steps=100)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, linear_scheduler)

lr_vals = []
for step in range(100):
    optimizer.zero_grad()
    loss = torch.sum(W**2)
    loss.backward()
    optimizer.step()
    scheduler.step()
    lr_vals.append(optimizer.param_groups[0]["lr"])

plt.figure(figsize=(5, 2))
plt.plot(lr_vals)
plt.xlabel("Training step")
plt.ylabel("Learning rate")
plt.show()
```


    
![png](data:image/png;base64,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)
    


## Pytorch example, ramp up and down


```python
times = [0, 0.1, 0.9, 1]
values = [0, 1, 0.9, 0]

W = torch.tensor([1.0], requires_grad=True)
optimizer = torch.optim.SGD([W], lr=0.1)
linear_scheduler = LinearScheduler(times, values, total_training_steps=100)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, linear_scheduler)

lr_vals = []
for step in range(100):
    optimizer.zero_grad()
    loss = torch.sum(W**2)
    loss.backward()
    optimizer.step()
    scheduler.step()
    lr_vals.append(optimizer.param_groups[0]["lr"])

plt.figure(figsize=(5, 2))
plt.plot(lr_vals)
plt.xlabel("Training step")
plt.ylabel("Learning rate")
plt.show()
```


    
![png](data:image/png;base64,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)
    


## Pytorch example, specifying absolute number of steps


```python
times = [0, 12, 90, 100]
values = [0, 1, 0.8, 0]

W = torch.tensor([1.0], requires_grad=True)
optimizer = torch.optim.SGD([W], lr=0.1)
linear_scheduler = LinearScheduler(times, values)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, linear_scheduler)

lr_vals = []
for step in range(100):
    optimizer.zero_grad()
    loss = torch.sum(W**2)
    loss.backward()
    optimizer.step()
    scheduler.step()
    lr_vals.append(optimizer.param_groups[0]["lr"])

plt.figure(figsize=(5, 2))
plt.plot(lr_vals)
plt.xlabel("Training step")
plt.ylabel("Learning rate")
plt.show()
```


    
![png](data:image/png;base64,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)
    


## Dev set up of repo

- Clone the repo
- Install `poetry` (repo was run with python3.9)
- Run `poetry install --with docs`
- Run `poetry run pre-commit install`

