From 2c804a14e4fc1787f3c958f97bf7f9e32a95a720 Mon Sep 17 00:00:00 2001 From: Morten Hjorth-Jensen Date: Sun, 3 Nov 2024 13:50:48 +0100 Subject: [PATCH] Create torchexample.py --- doc/src/week45/programs/torchexample.py | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 doc/src/week45/programs/torchexample.py diff --git a/doc/src/week45/programs/torchexample.py b/doc/src/week45/programs/torchexample.py new file mode 100644 index 000000000..c95d8e17e --- /dev/null +++ b/doc/src/week45/programs/torchexample.py @@ -0,0 +1,83 @@ +from IPython.display import Image as IPythonImage +#%matplotlib inline + +import torch +import numpy as np +import matplotlib.pyplot as plt + +X_train = np.arange(10, dtype='float32').reshape((10, 1)) +y_train = np.array([1.0, 1.3, 3.1, 2.0, 5.0, 6.3, 6.6, + 7.4, 8.0, 9.0], dtype='float32') + +plt.plot(X_train, y_train, 'o', markersize=10) +plt.xlabel('x') +plt.ylabel('y') + +#plt.savefig('figures/12_07.pdf') +plt.show() + +from torch.utils.data import TensorDataset +from torch.utils.data import DataLoader + +X_train_norm = (X_train - np.mean(X_train)) / np.std(X_train) +X_train_norm = torch.from_numpy(X_train_norm) + +# On some computers the explicit cast to .float() is +# necessary +y_train = torch.from_numpy(y_train).float() + +train_ds = TensorDataset(X_train_norm, y_train) + +batch_size = 1 +train_dl = DataLoader(train_ds, batch_size, shuffle=True) + +torch.manual_seed(1) +weight = torch.randn(1) +weight.requires_grad_() +bias = torch.zeros(1, requires_grad=True) + +def loss_fn(input, target): + return (input-target).pow(2).mean() + +def model(xb): + return xb @ weight + bias + +learning_rate = 0.001 +num_epochs = 200 +log_epochs = 10 + +for epoch in range(num_epochs): + for x_batch, y_batch in train_dl: + pred = model(x_batch) + loss = loss_fn(pred, y_batch) + loss.backward() + + with torch.no_grad(): + weight -= weight.grad * learning_rate + bias -= bias.grad * learning_rate + weight.grad.zero_() + bias.grad.zero_() + + if epoch % log_epochs==0: + print(f'Epoch {epoch} Loss {loss.item():.4f}') + +print('Final Parameters:', weight.item(), bias.item()) + +X_test = np.linspace(0, 9, num=100, dtype='float32').reshape(-1, 1) +X_test_norm = (X_test - np.mean(X_train)) / np.std(X_train) +X_test_norm = torch.from_numpy(X_test_norm) +y_pred = model(X_test_norm).detach().numpy() + + +fig = plt.figure(figsize=(13, 5)) +ax = fig.add_subplot(1, 2, 1) +plt.plot(X_train_norm, y_train, 'o', markersize=10) +plt.plot(X_test_norm, y_pred, '--', lw=3) +plt.legend(['Training examples', 'Linear Reg.'], fontsize=15) +ax.set_xlabel('x', size=15) +ax.set_ylabel('y', size=15) +ax.tick_params(axis='both', which='major', labelsize=15) + +#plt.savefig('figures/12_08.pdf') + +plt.show()