数据集
import torch
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
train_sample = 500
train_examples = 7000
w = torch.ones(1,train_sample)*0.0056
train_x = torch.tensor(np.random.normal(0, 1, (train_sample, train_examples)), dtype=torch.float)
labels = torch.mm(w,train_x) + 0.028
plt.figure(figsize=(8,6))
plt.scatter(train_x[0,:],labels)
plt.xlabel("x")
plt.ylabel("y")
plt.show()
def layer_sizes(X , Y):
n_x = X.shape[0]
n_h = 5
n_y = Y.shape[0]
return (n_x,n_h,n_y)
def initialize_parameters( n_x , n_h ,n_y):
W1 = torch.randn(n_h, n_x, requires_grad=True)
b1 = torch.zeros(n_h, 1, requires_grad=True)
W2 = torch.randn(n_y, n_h, requires_grad=True)
b2 = torch.zeros(n_y, 1, requires_grad=True)
parameters = {"W1" : W1,
"b1" : b1,
"W2" : W2,
"b2" : b2 }
return parameters
def forward(X , parameters):
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
A1 = torch.mm(W1, X) + b1
A2 = torch.mm(W2, A1) + b2
return A2
def squared_loss(y_hat, y):
return (y_hat - y.view(y_hat.size())) ** 2 / 2
def update(y_hat, labels, lr, parameters):
W1 = parameters["W1"]
b1 = parameters["b1"]
W2 = parameters["W2"]
b2 = parameters["b2"]
loss = squared_loss(y_hat, labels).mean()
loss.backward()
W1.data -= lr * W1.grad
W2.data -= lr * W2.grad
b1.data -= lr * b1.grad
b2.data -= lr * b2.grad
W1.grad.data.zero_()
W2.grad.data.zero_()
b1.grad.data.zero_()
b2.grad.data.zero_()
parameters = {
"W1" : W1,
"W2" : W2,
"b1" : b1,
"b2" : b2
}
return loss, parameters
ls = []
learning_rate = 0.001
epoch_nums = 10
n_0, n_1, n_2 = layer_sizes(train_x , labels)
parameters = initialize_parameters(n_0,n_1,n_2)
for epoch in range(epoch_nums):
y_hat = forward(train_x,parameters)
loss ,parameters = update(y_hat,labels,learning_rate,parameters)
ls.append(loss)
print("epoch:{}, loss:{:.5}".format(epoch, loss))
plt.plot(ls)
plt.xlabel("epoch")
plt.ylabel("loss")
plt.show()
结果