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 292E. Copying Data

    We often have to copy large volumes of information. Such operation can take up many computer resourc ...

  2. hdu3706 Second My Problem First

    Problem Description Give you three integers n, A and B.  Then we define Si = Ai mod B and Ti = Min{ ...

  3. RSA 加密解密使用实例

    http://www.dtmao.cc/news_show_692109.shtml 本文不讨论RSA加密解密本身,只记录使用方法及遇到的坑,RSA原理及注意事项可在网上查找. 背景:公司的一个需求, ...

  4. 生成不带签名(BOM)的UTF8格式的XML

    生成XML的一种方法如下: using System.Xml; private void SaveXML(string savePath) { XmlWriterSettings setting = ...

  5. 基于Vue的单页面应用的Markdown渲染

    之前渲染 Markdown 的时候, 笔者使用的是 mavonEditor 的预览模式, 使用起来比较爽, 只需要引入组件即可, 但是在最近的开发中, 遇到了困难. 主要问题在于作为单页面应用, 站内 ...

  6. oslab oranges 一个操作系统的实现 实验二 认识保护模式

    https://github.com/yyu/osfs00 实验目的: 理解x86架构下的段式内存管理 掌握实模式和保护模式下段式寻址的组织方式. 关键数据结构.代码组织方式 掌握实模式与保护模式的切 ...

  7. u-boot 移植 --->7、u-bootl流程粗线条梳理

    通过前面的调试了解到s5pv210这个芯片的启动流程是需要将u-boot分为两部分的分别为SPL和u-boot.这里我使用网上的方式不直接使用u-boot的SPL连接脚本单独生成SPL的image而是 ...

  8. docker07-数据存储

    Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录 (Bind mounts) 数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 U ...

  9. OKR vs KPI

    OKR vs KPI refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  10. Git Best Practice All In One

    Git Best Practice All In One git workflow 本地开发环境: 开发人员自测的,可以是自己本地部署的静态服务器,当然也可类似是运行 npm server类似的环境, ...