@@ -1,92 +0,0 @@ | |||||
import numpy as np | |||||
import torch | |||||
from torch.autograd import Variable | |||||
import matplotlib.pyplot as plt | |||||
""" | |||||
Using pytorch to do linear regression | |||||
""" | |||||
torch.manual_seed(2018) | |||||
# generate data | |||||
x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], | |||||
[9.779], [6.182], [7.59], [2.167], [7.042], | |||||
[10.791], [5.313], [7.997], [3.1]], dtype=np.float32) | |||||
y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], | |||||
[3.366], [2.596], [2.53], [1.221], [2.827], | |||||
[3.465], [1.65], [2.904], [1.3]], dtype=np.float32) | |||||
# draw the data | |||||
plt.plot(x_train, y_train, 'bo') | |||||
plt.show() | |||||
# convert to tensor | |||||
x_train = torch.from_numpy(x_train) | |||||
y_train = torch.from_numpy(y_train) | |||||
# define model parameters | |||||
w = Variable(torch.randn(1), requires_grad=True) | |||||
b = Variable(torch.zeros(1), requires_grad=True) | |||||
# construct the linear model | |||||
x_train = Variable(x_train) | |||||
y_train = Variable(y_train) | |||||
def linear_model(x): | |||||
return x*w + b | |||||
# first predictive | |||||
y_pred = linear_model(x_train) | |||||
# draw the real & predictived data | |||||
plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label="Real") | |||||
plt.plot(x_train.data.numpy(), y_pred.data.numpy(), 'ro', label="Estimated") | |||||
plt.legend() | |||||
plt.show() | |||||
# define the loss function | |||||
def get_loss(y_pred, y): | |||||
return torch.mean((y_pred - y)**2) | |||||
loss = get_loss(y_pred, y_train) | |||||
print("loss = %f" % float(loss)) | |||||
# auto-grad | |||||
loss.backward() | |||||
print("w.grad = %f" % float(w.grad)) | |||||
print("b.grad = %f" % float(b.grad)) | |||||
# upgrade parameters | |||||
eta = 1e-2 | |||||
w.data = w.data - eta*w.grad.data | |||||
b.data = b.data - eta*w.grad.data | |||||
y_pred = linear_model(x_train) | |||||
plt.plot(x_train.data.numpy(), y_train.data.numpy(), 'bo', label="Real") | |||||
plt.plot(x_train.data.numpy(), y_pred.data.numpy(), 'ro', label="Estimated") | |||||
plt.legend() | |||||
plt.show() | |||||
for i in range(10): | |||||
y_pred = linear_model(x_train) | |||||
loss = get_loss(y_pred, y_train) | |||||
w.grad.zero_() | |||||
b.grad.zero_() | |||||
loss.backward() | |||||
w.data = w.data - eta*w.grad.data | |||||
b.data = b.data - eta*b.grad.data | |||||
print("epoch: %3d, loss: %f" % (i, loss.data[0])) | |||||
@@ -49,8 +49,9 @@ def get_loss(y_pred, y): | |||||
# upgrade parameters | # upgrade parameters | ||||
eta = 1e-2 | eta = 1e-2 | ||||
n_epoch = 100 | |||||
for i in range(100): | |||||
for i in range(n_epoch): | |||||
y_pred = linear_model(x_train) | y_pred = linear_model(x_train) | ||||
loss = get_loss(y_pred, y_train) | loss = get_loss(y_pred, y_train) |
@@ -1,17 +1,31 @@ | |||||
import torch as t | |||||
import torch | |||||
from torch import nn, optim | from torch import nn, optim | ||||
from torch.autograd import Variable | from torch.autograd import Variable | ||||
import numpy as np | import numpy as np | ||||
import matplotlib.pyplot as plt | import matplotlib.pyplot as plt | ||||
# create numpy data | |||||
x_train = np.linspace(0, 10, 100) | |||||
y_train = 10*x_train + 4.5 | |||||
# convert to tensor (need to change nx1, float32 dtype) | |||||
x_train = t.from_numpy(x_train.reshape(-1, 1).astype("float32")) | |||||
y_train = t.from_numpy(y_train.reshape(-1, 1).astype("float32")) | |||||
torch.manual_seed(2018) | |||||
# model's real-parameters | |||||
w_target = 3 | |||||
b_target = 10 | |||||
# generate data | |||||
n_data = 100 | |||||
x_train = np.random.rand(n_data, 1)*20 - 10 | |||||
y_train = w_target*x_train + b_target + (np.random.randn(n_data, 1)*10-5.0) | |||||
# draw the data | |||||
plt.plot(x_train, y_train, 'bo') | |||||
plt.show() | |||||
# convert to tensor | |||||
x_train = torch.from_numpy(x_train).float() | |||||
y_train = torch.from_numpy(y_train).float() | |||||
# Linear Regression Model | # Linear Regression Model | ||||
@@ -50,15 +64,14 @@ for epoch in range(num_epochs): | |||||
print('Epoch[{}/{}], loss: {:.6f}' | print('Epoch[{}/{}], loss: {:.6f}' | ||||
.format(epoch+1, num_epochs, loss.data[0])) | .format(epoch+1, num_epochs, loss.data[0])) | ||||
# do evaluation & plot | |||||
model.eval() | model.eval() | ||||
predict = model(Variable(x_train)) | predict = model(Variable(x_train)) | ||||
predict = predict.data.numpy() | predict = predict.data.numpy() | ||||
plt.plot(x_train.numpy(), y_train.numpy(), 'ro', label='Original data') | |||||
plt.plot(x_train.numpy(), predict, label='Fitting Line') | |||||
plt.plot(x_train.numpy(), y_train.numpy(), 'bo', label='Real') | |||||
plt.plot(x_train.numpy(), predict, 'ro', label='Estimated') | |||||
# 显示图例 | |||||
plt.legend() | |||||
plt.legend() | |||||
plt.show() | plt.show() | ||||
# 保存模型 | |||||
t.save(model.state_dict(), './model_LinearRegression.pth') |
@@ -0,0 +1,90 @@ | |||||
import numpy as np | |||||
from sklearn import datasets | |||||
import matplotlib.pyplot as plt | |||||
import torch | |||||
from torch.autograd import Variable | |||||
import torch.nn.functional as F | |||||
# generate sample data | |||||
centers = [(0, 0), (5, 5)] | |||||
n_samples = 200 | |||||
x_train, y_train = datasets.make_blobs(n_samples=n_samples, n_features=2, cluster_std=1.0, | |||||
centers=centers, shuffle=False, random_state=42) | |||||
y_label = y_train | |||||
# plot data | |||||
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_label, label="Real", cmap=plt.cm.Spectral) | |||||
plt.show() | |||||
# convert to tensor | |||||
x_train = torch.from_numpy(x_train).float() | |||||
y_train = torch.from_numpy(y_train).float() | |||||
y_train.unsqueeze_(1) | |||||
# define model parameters | |||||
w = Variable(torch.randn(2, 1).float(), requires_grad=True) | |||||
b = Variable(torch.zeros(1).float(), requires_grad=True) | |||||
# construct the linear model | |||||
x_train = Variable(x_train) | |||||
y_train = Variable(y_train) | |||||
# define logistic regression function | |||||
def logistic_regression(x): | |||||
return torch.sigmoid(torch.mm(x, w) + b) | |||||
# define loss function | |||||
def binary_loss(y_pred, y): | |||||
logits = (y * y_pred.clamp(1e-12).log() + (1 - y) * (1 - y_pred).clamp(1e-12).log()).mean() | |||||
return -logits | |||||
# upgrade parameters | |||||
eta = 1e-2 | |||||
n_epoch = 1000 | |||||
for i in range(n_epoch): | |||||
y_pred = logistic_regression(x_train) | |||||
loss = binary_loss(y_pred, y_train) | |||||
loss.backward() | |||||
w.data = w.data - eta*w.grad.data | |||||
b.data = b.data - eta*b.grad.data | |||||
w.grad.zero_() | |||||
b.grad.zero_() | |||||
y_est = y_pred.ge(0.5).float() | |||||
acc = float((y_est == y_train).sum().data[0]) / y_train.shape[0] | |||||
if i % 10 == 0: | |||||
print("epoch: %3d, loss: %f, acc: %f" % (i, loss.data[0], acc)) | |||||
# plot decision boundary | |||||
w0 = float(w[0].data[0]) | |||||
w1 = float(w[1].data[0]) | |||||
b0 = float(b.data[0]) | |||||
print("w: %f %f, b = %f" % (w0, w1, b0)) | |||||
x_min = float(x_train[:, 0].min()) | |||||
x_max = float(x_train[:, 0].max()) | |||||
plot_x = np.arange(x_min, x_max, 0.1) | |||||
plot_y = (-w0*plot_x - b0)/w1 | |||||
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_label, label="Real", cmap=plt.cm.Spectral) | |||||
plt.plot(plot_x, plot_y, 'g-', label="Decision boundary") | |||||
plt.legend() | |||||
plt.show() | |||||
y_pred = logistic_regression(x_train) | |||||
y_est = torch.Tensor(y_pred.size()) | |||||
y_est[y_pred > 0.5] = 1 | |||||
y_est[y_pred < 0.5] = 0 | |||||
y_est = y_est.numpy().flatten() | |||||
err = np.sum((y_est - y_label)**2) | |||||
print("err = %f" % err) | |||||
@@ -1,105 +0,0 @@ | |||||
import numpy as np | |||||
import torch | |||||
from torch.autograd import Variable | |||||
import matplotlib.pyplot as plt | |||||
""" | |||||
Polynomial fitting by pytorch | |||||
""" | |||||
# define the model's parameters | |||||
w_target = np.array([0.5, 3, 2.4]) | |||||
b_target = np.array([0.9]) | |||||
f_des = "y = %f + %f * x + %f * x^2 + %f * x^3" % ( | |||||
b_target[0], | |||||
w_target[0], w_target[1], w_target[2]) | |||||
print(f_des) | |||||
# draw the data | |||||
x_sample = np.arange(-3, 3.1, 0.1) | |||||
y_sample = b_target[0] + w_target[0]*x_sample + w_target[1]*x_sample**2 + w_target[2]*x_sample**3 | |||||
plt.plot(x_sample, y_sample, label="Real") | |||||
plt.legend() | |||||
plt.show() | |||||
# construct variabels | |||||
x_train = np.stack([x_sample**i for i in range(1, 4)], axis=1) | |||||
x_train = torch.from_numpy(x_train).float() | |||||
y_train = torch.from_numpy(y_sample).float().unsqueeze(1) | |||||
# define model parameters | |||||
w = Variable(torch.randn(3, 1).float(), requires_grad=True) | |||||
b = Variable(torch.zeros(1).float(), requires_grad=True) | |||||
x_train = Variable(x_train) | |||||
y_train = Variable(y_train) | |||||
print(w.shape) | |||||
print(b.shape) | |||||
print(x_train.shape) | |||||
print(y_train.shape) | |||||
def polynomial(x): | |||||
return torch.mm(x, w) + b | |||||
def get_loss(y_pred, y): | |||||
return torch.mean((y_pred-y)**2) | |||||
# draw initial graph | |||||
y_pred = polynomial(x_train) | |||||
plt.plot(x_train.data.numpy()[:, 0], y_sample, label="Real", color='b') | |||||
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label="Fitting", color='r') | |||||
plt.legend() | |||||
plt.show() | |||||
# compute loss | |||||
loss = get_loss(y_pred, y_train) | |||||
print("Loss = %f" % loss) | |||||
loss.backward() | |||||
print(w.grad) | |||||
print(b.grad) | |||||
eta = 0.001 | |||||
w.data = w.data - eta*w.grad.data | |||||
b.data = b.data - eta*b.grad.data | |||||
# second draw | |||||
y_pred = polynomial(x_train) | |||||
plt.plot(x_train.data.numpy()[:, 0], y_sample, label="Real", color='b') | |||||
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label="Fitting", color='r') | |||||
plt.legend() | |||||
plt.show() | |||||
for i in range(100): | |||||
y_pred = polynomial(x_train) | |||||
loss = get_loss(y_pred, y_train) | |||||
w.grad.data.zero_() | |||||
b.grad.data.zero_() | |||||
loss.backward() | |||||
w.data = w.data - eta*w.grad.data | |||||
b.data = b.data - eta*b.grad.data | |||||
print("epoch: %4d, loss: %f" % (i, loss.data[0])) | |||||
# second draw | |||||
y_pred = polynomial(x_train) | |||||
plt.plot(x_train.data.numpy()[:, 0], y_sample, label="Real", color='b') | |||||
plt.plot(x_train.data.numpy()[:, 0], y_pred.data.numpy(), label="Fitting", color='r') | |||||
plt.legend() | |||||
plt.show() |