1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import torch import random from d2l import torch as d2l
true_w = torch.tensor([2, -3.4]) true_b = 4.2
def synthetic_data(w, b, num_samples): X = torch.normal(0, 1, (num_samples, len(w))) y = torch.matmul(X, w) + b y += torch.normal(0, 0.01, y.shape) return X, y.reshape(-1, 1) features, labels = synthetic_data(true_w, true_b, 1000)
def data_iter(batch_size, features, labels): num_examples = len(features) indices = list(range(num_examples)) random.shuffle(indices) for i in range(0, num_examples, batch_size): batch_indices = torch.tensor( indices[i: min(i + batch_size, num_examples)]) yield features[batch_indices], labels[batch_indices]
w = torch.normal(0, 0.01, (2,1), requires_grad=True) b = torch.zeros(1, requires_grad=True)
def liner_regression(w, b, X): y_hat = torch.matmul(X, w) + b.reshape(-1, 1) return y_hat
def square_loss(y_hat, y): return 0.5 * ((y_hat - y) ** 2)
def sgd(params, lr, batch_size): with torch.no_grad(): for param in params: param -= lr * param.grad / batch_size param.grad.zero_()
def train(): lr = 0.03 batch_size = 10 num_epochs = 3 net = liner_regression loss = square_loss for epoch in range(num_epochs): for X, y in data_iter(batch_size, features, labels): y_pred = net(w, b, X) l = loss(y_pred, y) l.sum().backward() sgd([w, b], lr, batch_size) with torch.no_grad(): train_l = loss(net(w, b, features), labels) print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
|