1. 自动求导 torch.autograd
1.1 torch.autograd.backward
参数:
- tensors:用于求导的张量,如loss
- retain_graph:保存计算图
- create_graph:创建导数计算图,用于高阶求导
- grad_tensors:多梯度权重
x = torch.tensor( [ 2.] , requires_grad= True)
w = torch.tensor( [ 1.] , requires_grad= True)
a = x + w
a.retain_grad( )
b = w + 1
y = a * b
torch.autograd.backward( y, retain_graph= True)
1.2 torch.aurograd.grad
参数:
- outputs:用于求导的张量 ----- y, loss
- inputs:需要梯度的张量 ----- w, x
- create_graph:创建导数计算图,用于高阶求导
- retain_graph:保存计算图
- grad_outputs:多梯度权重
小贴士:
- 梯度不自动清零, 需要手动进行 w.grad.zero_( ) 等;
- 依赖于叶子结点的结点,requires_grad默认为True;
- 叶子结点不可执行in-place操作;
- 带有下划线的操作,如sub_( ) ,add_( ) ,表示原地操作,即会在原始数据上进行改变;
2. 逻辑回归(线性二分类模型)
逻辑回归是线性的二分类模型
模型表达式: y = f( WX + b)
f( x) = 1/( 1+eˆ( -x))
f( x) 称为Sigmoid函数,也称为Logistic函数.
class= { 0,0.5> y ; 1,0.5< y)
线性回归和逻辑回归之间的区别:
- 线性回归是分析自变量x与因变量y(标量)之间关系的方法
- 逻辑回归是分析自变量x与因变量y(概率)之间关系的方法
3. 机器学习模型训练步骤
机器学习模型训练步骤:
- 数据
- 模型
- 损失函数
- 优化器
- 迭代训练
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
torch.manual_seed( 10)
mean_value = 2.
var_value = 1.
bais = 1.0
x0 = torch.normal( mean_value, var_value, [ 100,2] ) + bais
y0 = torch.zeros( [ 100,1] )
x1 = torch.normal( -mean_value, var_value, [ 100,2] ) + bais
y1 = torch.ones( [ 100,1] )
train_x = torch.cat( [ x0, x1] , dim= 0)
lable_y = torch.cat( [ y0, y1] , dim= 0)
class LR( nn.Module) :
def __init__( self) :
super( LR, self) .__init__( )
self.features = nn.Linear( 2, 1)
self.sigmoid = nn.Sigmoid( )
def forward( self, x) :
x = self.features( x)
x = self.sigmoid( x)
return x
lr_net = LR( )
loss_fn = nn.BCELoss( )
lr = 0.01
optimizer = torch.optim.SGD( lr_net.parameters( ) , lr = lr, momentum= 0.9)
for iter in range( 1000) :
y_pred = lr_net( train_x)
loss = loss_fn( y_pred.squeeze( ) , lable_y.squeeze( ))
loss.backward( )
optimizer.step( )
optimizer.zero_grad( )
if iter % 100 == 0:
mask = y_pred.ge( 0.5) .float( ) .squeeze( )
correct = ( mask == lable_y.squeeze( )) .sum( ) .item( )
acc = correct / lable_y.size( 0)
plt.scatter( x0.data.numpy( ) [ :, 0] , x0.data.numpy( ) [ :, 1] , c= 'r' , label= 'class 0' )
plt.scatter( x1.data.numpy( ) [ :, 0] , x1.data.numpy( ) [ :, 1] , c= 'b' , label= 'class 1' )
w0, w1 = lr_net.features.weight[ 0]
w0, w1 = float( w0.item( )) , float( w1.item( ))
plot_b = float( lr_net.features.bias[ 0] .item( ))
plot_x = np.arange( -6, 6, 0.1)
plot_y = ( -w0 * plot_x - plot_b) / w1
plt.xlim( -5, 7)
plt.ylim( -7, 7)
plt.plot( plot_x, plot_y)
plt.text( -5, 5, 'Loss=%.4f' % loss.data.numpy( ) , fontdict= { 'size' : 20, 'color' : 'red' } )
plt.title( "Iteration: {}\nw0:{:.2f} w1:{:.2f} b: {:.2f} accuracy:{:.2%}" .format( iter, w0, w1, plot_b, acc))
plt.legend( )
plt.show( )
plt.pause( 0.5)
print( "Loss=%.4f" % loss, "accuraty=%.4f" % acc)
if acc > 0.99:
break
Loss= 0.0425 accuraty= 0.9950