๐ŸŽ“ A1Learner
๐Ÿ”

PyTorch Printing a Loss Curve

A printed loss curve turns each epoch's loss into a row of characters. Longer rows mean bigger losses, so learning shows as shrinking rows.

Scale a loss to a bar

A loss becomes a count of characters. Half of the top loss gives half of the full width.

top = 1.0
value = 0.5
bar = "#" * round(value / top * 20)
print(bar)
print(len(bar))

One row per epoch

A loop prints one bar per loss. The bars shrink as the losses fall.

losses = [0.9, 0.6, 0.3]
top = losses[0]
for value in losses:
    bar = "#" * max(1, round(value / top * 20))
    print(f"{value:.1f}  {bar}")

Keep the raw numbers too

The bar shows the shape at a glance. The printed number beside it keeps the exact value.

print(f"{0.3:.4f}")

Example

import torch
import torch.nn as nn

torch.manual_seed(0)
x = torch.linspace(0, 1, 40).reshape(-1, 1)
y = 3.0 * x - 2.0

model = nn.Linear(1, 1)
loss_fn = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.2)

losses = []
for epoch in range(12):
    optimizer.zero_grad()
    loss = loss_fn(model(x), y)
    loss.backward()
    optimizer.step()
    losses.append(loss.item())

top = losses[0]
for i, value in enumerate(losses, start=1):
    bar = "#" * max(1, round(value / top * 30))
    print(f"Epoch {i:2d}  {value:.4f}  {bar}")

Key points

  • Loss curve: the losses of a run, one point per epoch, in order
  • Use the first loss as the scale, so the longest bar is fixed
  • Use round(loss / top * width) to turn a loss into a bar length
  • A falling curve shows as bars that shrink epoch by epoch
  • Printing losses as bars shows the shape of learning in plain text

In this example, the model trains on 40 rows that follow the rule y = 3x - 2. The loop saves the loss of each of the 12 epochs. The first loss sets the scale for the bars. Each epoch then prints its loss and a bar of # characters. The bars shrink from 30 characters to 9, so the fall of the loss is easy to see.

Try it Yourself

Edit the code, then press Run.

Running is simulated ยท Python Playground

Exercise

In this printing scheme, what does a bar half as long as the first bar mean?