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. CodeForces - 916C 思维

    题意:给你n,m,表示n个顶点和m条边,让你构造一个图. 要求 1.1->n最短路为素数 2.最小生成树边权和为prime 3.没有重边 4.边大小[1,1e9]. (题目给定m>n-1) ...

  2. 牛客编程巅峰赛S1第6场 - 黄金&钻石&王者 A.牛牛爱奇数 (模拟)

    题意:有一组数,每次将所有相等的偶数/2,求最少操作多少次使得所有数变成奇数. 题解:用桶标记,将所有不同的偶数取出来,然后写个while模拟统计一下次数就行. 代码: class Solution ...

  3. 轻松理解 Java开发中的依赖注入(DI)和控制反转(IOC)

    前言 关于这个话题, 网上有很多文章,这里, 我希望通过最简单的话语与大家分享. 依赖注入和控制反转两个概念让很多初学这迷惑, 觉得玄之又玄,高深莫测. 这里想先说明两点: 依赖注入和控制反转不是高级 ...

  4. 实战交付一套dubbo微服务到k8s集群(2)之Jenkins部署

    Jenkins官网:https://www.jenkins.io/zh/ Jenkins 2.190.3 镜像地址:docker pull jenkins/jenkins:2.190.3 1.下载Je ...

  5. 【原创】docker & kubernetes问题总结

    1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...

  6. leetcode_二叉树篇_python

    主要是深度遍历和层序遍历的递归和迭代写法. 另外注意:因为求深度可以从上到下去查 所以需要前序遍历(中左右),而高度只能从下到上去查,所以只能后序遍历(左右中). 所有题目首先考虑root否是空.有的 ...

  7. github 无法访问

    描述: 1. ping 丢失 100% 2. git 失败 Failed to connect to github.com port 443: Timed out 3.打开网站 超时 解决: http ...

  8. 进程控制——fork-and-exec、system、wait

    forc-and-exec流程 父进程与子进程之间的关系十分复杂,最大的复杂点在于进程间相互调用.Linux下这一流程称为fork-and-exec.父进程通过fork的方式产生一个一模一样的子进程, ...

  9. AbstractQueuedSynchronizer解析

    AbstractQueuedSynchronizer简称为AQS,是juc里很基本的一个包,juc里很多工具类是基于AQS实现的,理解了AQS,其它很多juc工具类也会比较清楚了. 1.方法简述 ge ...

  10. UI & APP

    UI & APP lanhu http://help.lanhuapp.com/hc/ http://help.lanhuapp.com/hc/kb/article/1173434/ 快速使用 ...