画图x-y折线图
随机梯度下降
%matplotlib inline
import random
import torch
import matplotlib.pyplot as plt
def synthetic_data(w, b, num_examples):
"""y=wx+b+noise"""
X = torch.normal(0, 1, size=(num_examples, len(w)))
y = X.matmul(w) + b + torch.randn(num_examples, 1) * 0.001
return X, y
true_w = torch.tensor([[2, -3.4, 4.2]]).reshape(3, 1)
true_b = torch.tensor(4.3)
num_examples = 10000
features, labels = synthetic_data(true_w, true_b, num_examples)
# 画图x-y折线图
figure = plt.figure(figsize=(10, 10))
plt.scatter(features[:, 2], labels, s=10, alpha=0.5)
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):
j = indices[i:min(i + batch_size, num_examples)]
yield features[j], labels[j]
batch_size = 10
for X, y in data_iter(batch_size, features, labels):
print(X, '\n', y)
break
w = torch.normal(0, 1, (3, 1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
def loss(y_true, y_pred):
return sum((y_true - y_pred) ** 2) / len(y_true)
model = torch.nn.Linear(3, 1)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
epoches = 1000
for epoch in range(epoches):
y_pred = model(features)
loss_val = loss(labels, y_pred)
optimizer.zero_grad()
loss_val.backward()
optimizer.step()
if epoch % 100 == 0:
print(f"Epoch: {epoch}, Loss: {loss_val.item():.4f}")
# eval
X_test, y_test = synthetic_data(true_w, true_b, num_examples//10)
y_pred = model(X_test)
print(f"loss:{loss(y_test, y_pred).item()}")