主要学习Pytorch的基本使用步骤和基本逻辑:
线性回归:
首先 生成数据集:
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
x=torch.randn(100,1)*10 #生成100个1维的随机数
y=x+3* torch.randn(100,1) #生成y,添加一些扰动
plt.plot(x.numpy(),y.numpy(),'o') #画图看一下
然后 建立学习的class
def LR(nn.Module)
def __init__(self,input_size,output_size):
#定义输入和输出的维度
super().__init__()
self.linear=nn.Linear(input_size,output_size)
def forward(x):
pred=self.linear(x)
return pred
最后定义 loss, optimizer等进行学习:
model=LR(1,1) # 输入1维,输出1维
cirterion =nn.MSELoss() #设置loss,loss为MSE
optimizer=nn.optim.SGD(model.parameters(),lr=0.001) #设置优化器,为SGD
epoch=100
for i in range(epoch):
y_pred=model.forward(x)
loss=cirterion(y_pred,y)
optimizer.zero_grad() #将梯度清零,不然会累积
loss.backward() #计算w和b的当前的梯度
optimizer.step() # 对w和b进行更新
最后可以画图看看结果:
def get_parameters(model):
[w,b]=model.parameters();
return (w[0][0].item(),b[0].item)
def plot_fit(title):
w1,b1=get_parameters(model)
x1=np.array([-30,30])
y1=w1*x1+b1
plt.close()
plt.plot(x1,y1,'r')
plt.plot(x.numpy(),y.numpy(),'o')
plt.savefig(title)
plot_fit('fit_result,jpg')
逻辑回归
和线性回归的逻辑基本是一模一样的,除了在forward的时候需要加一个sigmoid函数去进行概率分类:
#首先导入数据库,用sklearn的datasets
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
from sklearn import datasets
import numpy as np
#生成一百个点,有两个中心点的cluster,每一个cluster的std为0.4,分别给出点的坐标x和类别y,其中x为2维,y为1维
n_pt=100
centers=[[-0.5,0.5],[0.5,-0.5]]
x,y=datasets.make_blobs(n_pt,random_state=123,centers=centers,cluster_std=0.4)
x_data=torch.Tensor(x)
y_data=torch.Tensor(y)
然后建立结构:
class Model(nn.Module):
def __init()__(self,input_size,output_size):
super().__init__()
self.linear=nn.Linear(input_size,output_size)
def forward(self,x):
pred=torch.sigmoid(self.linear(x)) #整体和 线性回归完全一致,在 最后pred的时候,加了一个sigmoid进行概率判断
return pred
def pred(self,x):
pred=self.forward(x)
if pred>0.5:
return 1
else:
return 0
最后进行训练:
model=Model(2,1)
criterion=nn.BCELoss()
optimizer=torch.optim.SGD(model.paramerters(),lr=0.01)
epoch=1000
losses=[]
for i in range(epoch):
y_pred=model.forward(x_data)
loss=criterion(y_pred,y_data)
optimizer.zero_grad() #梯度清零
loss.backward() # 计算梯度
losses.append(loss)
optimizer.step() # 更新参数
plt.plot(losses)
最后看一下数据分离的情况:
def get_parameters(model):
[w,b]=model.parameters()
w1,w2=w.view(2)
b=b[0]
return (w1.item(),w2.item(),b.item())
def scatter_plot():
plt.scatter(x[y==0,0],x[y==0,1],10)
plt.scatter(x[y==1,0],x[y==1,1],10)
def plot_fit(title):
plt.title=title
# 0=w1x1+w2x2+b
w1,w2,b=get_parameters(model)
x1=np.array([-2,2])
x2=(w1*x1+b)/(-w2)
scatter_plot()
plt.plot(x1,x2,'r')
plot_fit('after_optimize')