autograd与逻辑回归

自动求导系统中两个常用的方法:

torch.autograd.backward and torch.autograd.grad

演示理解一阶导数、二阶导数的求导过程

理解自动求导系统,以及张量,前向传播构建计算图、计算图求取梯度

演示逻辑回归训练,学习五大模块:数据、模型、损失函数、优化器、迭代训练过程

深度学习模型的训练就是不断更新权值,权值的更新需要求解梯度。梯度时关键重要的,Pytorch就有自动求导系统,只需要搭建前向传播的计算图,通过autograd就可以得到梯度

torch.autograd.backward

  1. autograd

    torch.autograd.backward(tensors,grad_tensors=None,retain_graph=None,create_graph=False)

    retain_graph用来保存计算图

    create_graph创建导数计算图,用于高阶求导

    grad_tensors多梯度权重
import torch
import numpy as np x = torch.tensor([2.], requires_grad=True)
w = torch.tensor([1.], requires_grad=True) a = torch.add(x,w)
# a.retain_grad()
b = torch.add(w,1)
y = torch.mul(a,b)
y.backward()# 在此行设置断点

点击step into,此时发现调用的是tensor.py中的

torch.autograd.backward(self, gradient, retain_graph, create_graph)
import torch
import numpy as np x = torch.tensor([2.], requires_grad=True)
w = torch.tensor([1.], requires_grad=True) a = torch.add(x,w)
# a.retain_grad()
b = torch.add(w,1)
y = torch.mul(a,b)
y.backward()
y.backward()
RuntimeError: Trying to backward through the graph a second time, but the saved intermediate results have already been freed. Specify retain_graph=True when calling backward the first time.

报错信息表示我们想进行两次的backward运算,但是保存的结果已经释放掉了,如果我们想要运算的话,应该指定retain_graph=True

y.backward(retain_graph=True)
y.backward()

grad_tensors

用于设置多个梯度之间的权重。

torch.autograd

torch.autograd.grad(outputs,inputs,grad_outputs=None,retain_grph=None,create_graph=False)

outputs:用于求导的张量,如loss

inputs:需要梯度的张量

create_graph:创建导数计算图,用于高阶求导

retain_graph:保存计算图

grad_outputs:多梯度权重

flag = True
# flag = False
if flag:
x = torch.tensor([3.], requires_grad=True)
y = torch.pow(x, 2)
y1 = torch.autograd.grad(y,x,create_graph=True)
y2 = torch.autograd.grad(y1[0],x)# 二次求导对元组里的元素进行求导
y.backward()
print(x.grad)
print(y1)
print(y2)
tensor([6.])
(tensor([6.], grad_fn=<MulBackward0>),)
(tensor([2.]),)

tips

  1. 梯度不会自动清零
flag = True
# flag = False
if flag:
x = torch.tensor([3.], requires_grad=True)
y = torch.tensor([4.], requires_grad=True)
for i in range(10):
t = torch.mul(x,y)
t.backward()
x.grad.zero_()
print(x.grad)
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
tensor([4.])
  1. 依赖于叶子结点的结点,requires_grad默认为True
flag = True
# flag = False
if flag:
x = torch.tensor([3.], requires_grad=True)
y = torch.tensor([4.], requires_grad=True)
t = torch.mul(x,y)
t.backward()
print(t.requires_grad)
True
  1. 叶子结点不可执行in-place

    in_place操作即原位操作,类似于x.grad.zero_().其中_就是原位操作

    在查阅相关资料后,个人觉得可以直接当成覆盖操作,是否进行覆盖运算,pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改。 inplace = True:不创建新的对象,直接对原始对象进行修改;inplace = False:对数据进行修改,创建并返回新的对象承载其修改结果。默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。

    inplace是在原始内存中改变这个数据,为什么叶子结点不可以inplace

逻辑回归

逻辑回归模型是一个线性二分类模型

模型表达式:

\[y = f(WX+b)\\
f(x)=\frac{1}{1+e^-x}
\]

f(x)成为Sigmoid函数,也成为logistic函数

\[class =
\begin{cases}
0&,&{0.5>y}\\
1&,&{0.5 \leq y}
\end{cases}
\]

线性回归模型是分析自变量x因变量y(标量)之间关系的方法

逻辑回归是分析自变量x因变量y(概率)之间关系的方法,也可以说是把线性回归的基础上加上了sigmoid函数

逻辑回归=对数几率回归

\[ln\frac{y}{1-y}=WX+b
\]

对数回归

\[ln y = WX+B
\]

机器学习模型训练五个步骤

数据、模型、损失函数、优化器、迭代训练

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np
import os os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
torch.manual_seed(7) ones = torch.ones(100, 2)
x0 = torch.normal(ones, 1) + 1
x1 = torch.normal(-ones, 1) - 0.4
# print(x0)
y0 = torch.zeros(100)
y1 = torch.ones(100)
train_x = torch.cat((x0, x1), 0)
train_y = torch.cat((y0, y1), 0)
print(train_x.shape)
print(train_y.shape) 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 i in range(1000):
y_hats = lr_net(train_x) loss = loss_fn(y_hats.squeeze(), train_y) loss.backward() optimizer.step() optimizer.zero_grad() if i %10 == 0: mask = y_hats.ge(0.5).float().squeeze()
masky = (mask==train_y).sum()
# print(train_y.sum().data.numpy())
# print(masky.data.numpy())
print( masky.item(),train_y.size()[0])
acc = masky.item()/train_y.size()[0] plt.scatter(x0.data.numpy()[:, 0], x0.data.numpy()[:, 1])
plt.scatter(x1.data.numpy()[:, 0], x1.data.numpy()[:, 1])
plt.xlim(-6,6)
plt.ylim(-10,10)
w0,w1 = lr_net.features.weight[0]
w0,w1 = float(w0.item()),float(w1.item())
b = float(lr_net.features.bias[0].item())
xd = np.arange(-6,6,0.1)
yd = w0*xd+b
plt.plot(xd,yd)
plt.title("the acc:{}".format(acc)) # plt.show() # plt.ion()
plt.pause(1)
plt.clf()
if acc > 0.95:
break

pytorch(06)autograd与逻辑回归的更多相关文章

  1. 统计学习:逻辑回归与交叉熵损失(Pytorch实现)

    1. Logistic 分布和对率回归 监督学习的模型可以是概率模型或非概率模型,由条件概率分布\(P(Y|\bm{X})\)或决 策函数(decision function)\(Y=f(\bm{X} ...

  2. PRML读书会第四章 Linear Models for Classification(贝叶斯marginalization、Fisher线性判别、感知机、概率生成和判别模型、逻辑回归)

    主讲人 planktonli planktonli(1027753147) 19:52:28 现在我们就开始讲第四章,第四章的内容是关于 线性分类模型,主要内容有四点:1) Fisher准则的分类,以 ...

  3. Machine Learning 学习笔记 (1) —— 线性回归与逻辑回归

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 梯度下降法 (Gradien ...

  4. PytorchZerotoAll学习笔记(五)--逻辑回归

    逻辑回归: 本章内容主要讲述简单的逻辑回归:这个可以归纳为二分类的问题. 逻辑,非假即真.两种可能,我们可以联想一下在继电器控制的电信号(0 or 1) 举个栗子:比如说你花了好几个星期复习的考试(通 ...

  5. (数据科学学习手札24)逻辑回归分类器原理详解&Python与R实现

    一.简介 逻辑回归(Logistic Regression),与它的名字恰恰相反,它是一个分类器而非回归方法,在一些文献里它也被称为logit回归.最大熵分类器(MaxEnt).对数线性分类器等:我们 ...

  6. [源码解析] PyTorch 分布式 Autograd (1) ---- 设计

    [源码解析] PyTorch 分布式 Autograd (1) ---- 设计 目录 [源码解析] PyTorch 分布式 Autograd (1) ---- 设计 0x00 摘要 0x01 分布式R ...

  7. [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础

    [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 目录 [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 0x00 摘要 0x0 ...

  8. [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关

    [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关 0x00 摘要 我们已经知道 dist.autograd 如何发送和接受消息,本文再来看看如何其他支撑部分,就是如 ...

  9. [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎

    [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎 目录 [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎 0x00 摘要 0 ...

随机推荐

  1. poj1821 Fence(dp,单调队列优化)

    题意: 由k(1 <= K <= 100)个工人组成的团队应油漆围墙,其中包含N(1 <= N <= 16 000)个从左到右从1到N编号的木板.每个工人i(1 <= i ...

  2. hdu3247Resource Archiver (AC自动机+最短路+状压dp)

    Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others) Total Submis ...

  3. C. Table Decorations

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  4. hdu4533 威威猫系列故事——晒被子

    Problem Description 因为马拉松初赛中吃鸡腿的题目让不少人抱憾而归,威威猫一直觉得愧对大家,这几天他悄悄搬到直角坐标系里去住了. 生活还要继续,太阳也照常升起,今天,威威猫在第一象限 ...

  5. Java基础(第一期)

    Java基础 1.注释 Java中注释有三种: 单行注释 // 多行注释 /* */ 文本注释(用的较少) /** */ 书写注释是一个非常好的习惯 BAT 平时写代码一定要注意规范 //有趣的代码注 ...

  6. 活动精彩实录 | 阿里云刘军民(米诺):Cassandra中文社区年度回顾

    点击这里观看完整视频 大家好,我是刘军民,我是阿里云数据库的产品经理,目前负责云数据库的产品规划以及相关工作.曾在2019年和多位小伙伴一起发起了中文社区,我希望有更多的小伙伴能加入到社区建设中,这样 ...

  7. 浅谈Webpack模块打包工具二

    Webpack插件机制介绍 Loader专注实现资源模块加载,plugin解决其他自动化工作,比如清除dist目录,拷贝静态文件值输出目录,压缩输出代码等,下面列举几个plugin 的例子. Webp ...

  8. mybatis(六)插件机制及分页插件原理

    转载:https://www.cnblogs.com/wuzhenzhao/p/11120848.html MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要 ...

  9. μC/OS-III---I笔记6---互斥信号量

    互斥信号量 操作系统中利用信号量解决进程间的同步和互斥(互斥信号量)的问题,在多道程序环境下,操作系统就是遮掩实现进程之间的同步和互斥.但是在使用的过程中厉害的前辈还是发现了这一优秀机制的缺陷,它会导 ...

  10. virtual whiteboard

    virtual whiteboard 虚拟白板 / canvas https://twitter.com/excalidraw https://excalidraw.com/ https://gith ...