iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >pytorch怎么定义新的自动求导函数
  • 932
分享到

pytorch怎么定义新的自动求导函数

2023-07-04 19:07:41 932人浏览 薄情痞子
摘要

今天小编给大家分享一下PyTorch怎么定义新的自动求导函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pytorch定义

今天小编给大家分享一下PyTorch怎么定义新的自动求导函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    pytorch定义新的自动求导函数

    在pytorch中想自定义求导函数,通过实现torch.autograd.Function并重写forward和backward函数,来定义自己的自动求导运算。

    直接上代码,定义一个ReLu来实现自动求导

    import torchclass MyRelu(torch.autograd.Function):    @staticmethod    def forward(ctx, input):        # 我们使用ctx上下文对象来缓存,以便在反向传播中使用,ctx存储时候只能存tensor        # 在正向传播中,我们接收一个上下文对象ctx和一个包含输入的张量input;        # 我们必须返回一个包含输出的张量,        # input.clamp(min = 0)表示讲输入中所有值范围规定到0到正无穷,如input=[-1,-2,3]则被转换成input=[0,0,3]        ctx.save_for_backward(input)                # 返回几个值,backward接受参数则包含ctx和这几个值        return input.clamp(min = 0)    @staticmethod    def backward(ctx, grad_output):        # 把ctx中存储的input张量读取出来        input, = ctx.saved_tensors                # grad_output存放反向传播过程中的梯度        grad_input = grad_output.clone()                # 这儿就是ReLu的规则,表示原始数据小于0,则relu为0,因此对应索引的梯度都置为0        grad_input[input < 0] = 0        return grad_input

    进行输入数据并测试

    dtype = torch.floatdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')# 使用torch的generator定义随机数,注意产生的是cpu随机数还是gpu随机数generator=torch.Generator(device).manual_seed(42)# N是Batch, H is hidden dimension,# D_in is input dimension;D_out is output dimension.N, D_in, H, D_out = 64, 1000, 100, 10x = torch.randn(N, D_in, device=device, dtype=dtype,generator=generator)y = torch.randn(N, D_out, device=device, dtype=dtype, generator=generator)w1 = torch.randn(D_in, H, device=device, dtype=dtype, requires_grad=True, generator=generator)w2 = torch.randn(H, D_out, device=device, dtype=dtype, requires_grad=True, generator=generator)learning_rate = 1e-6for t in range(500):    relu = MyRelu.apply    # 使用函数传入参数运算     y_pred = relu(x.mm(w1)).mm(w2)# 计算损失    loss = (y_pred - y).pow(2).sum()    if t % 100 == 99:        print(t, loss.item())    # 传播    loss.backward()    with torch.no_grad():        w1 -= learning_rate * w1.grad        w2 -= learning_rate * w2.grad               w1.grad.zero_()        w2.grad.zero_()

    pytorch自动求导与逻辑回归

    自动求导

    pytorch怎么定义新的自动求导函数

    retain_graph设为True,可以进行两次反向传播

    pytorch怎么定义新的自动求导函数

    pytorch怎么定义新的自动求导函数

    逻辑回归

    pytorch怎么定义新的自动求导函数

    pytorch怎么定义新的自动求导函数

    import torchimport torch.nn as nnimport matplotlib.pyplot as pltimport numpy as nptorch.manual_seed(10)#========生成数据=============sample_nums = 100mean_value = 1.7bias = 1n_data = torch.ones(sample_nums,2)x0 = torch.nORMal(mean_value*n_data,1)+bias#类别0数据y0 = torch.zeros(sample_nums)#类别0标签x1 = torch.normal(-mean_value*n_data,1)+bias#类别1数据y1 = torch.ones(sample_nums)#类别1标签train_x = torch.cat((x0,x1),0)train_y = torch.cat((y0,y1),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 xlr_net = LR()#实例化逻辑回归模型#==============选择损失函数===============loss_fn = nn.BCELoss()#==============选择优化器=================lr = 0.01optimizer = torch.optim.SGD(lr_net.parameters(),lr = lr,momentum=0.9)#===============模型训练==================for iteration in range(1000):    #前向传播    y_pred = lr_net(train_x)#模型的输出    #计算loss    loss = loss_fn(y_pred.squeeze(),train_y)    #反向传播    loss.backward()    #更新参数    optimizer.step()    #绘图    if iteration % 20 == 0:        mask = y_pred.ge(0.5).float().squeeze() #以0.5分类        correct = (mask==train_y).sum()#正确预测样本数        acc = correct.item()/train_y.size(0)#分类准确率        plt.scatter(x0.data.numpy()[:,0],x0.data.numpy()[:,1],c='r',label='class0')        plt.scatter(x1.data.numpy()[:,0],x1.data.numpy()[:,1],c='b',label='class1')        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(iteration,w0,w1,plot_b,acc))        plt.legend()        plt.show()        plt.pause(0.5)        if acc > 0.99:            break

    以上就是“pytorch怎么定义新的自动求导函数”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

    --结束END--

    本文标题: pytorch怎么定义新的自动求导函数

    本文链接: https://www.lsjlt.com/news/347047.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • pytorch怎么定义新的自动求导函数
      今天小编给大家分享一下pytorch怎么定义新的自动求导函数的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。pytorch定义...
      99+
      2023-07-04
    • pytorch自定义不可导激活函数的操作
      pytorch自定义不可导激活函数 今天自定义不可导函数的时候遇到了一个大坑。 首先我需要自定义一个函数:sign_f import torch from torch.autog...
      99+
      2024-04-02
    • python怎么导入自定义函数
      在python中导入自定义函数的方法首先,需要自定义一个函数;def add(x, y):z=x+yreturn z函数自定义好后,通过调用sys模块,即可将自定义函数导入到Python中;import syssys.path.append...
      99+
      2024-04-02
    • pytorch自定义loss损失函数
      目录步骤1:添加自定义的类步骤2:修改使用的loss函数自定义loss的方法有很多,但是在博主查资料的时候发现有挺多写法会有问题,靠谱一点的方法是把loss作为一个pytorch的模...
      99+
      2024-04-02
    • JavaScript怎么自定义函数求累加
      这篇文章主要介绍了JavaScript怎么自定义函数求累加的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript怎么自定义函数求累加文章都会有所收获,下面我们一起来看看吧。什么是累加累加即将数字序列...
      99+
      2023-07-06
    • PyTorch中怎么实现自定义损失函数
      要实现自定义损失函数,可以按照以下步骤在PyTorch中实现: 创建一个继承自torch.nn.Module的类,该类用于定义自定...
      99+
      2024-03-05
      PyTorch
    • PyTorch自动求导机制是什么
      PyTorch的自动求导机制是指PyTorch能够自动计算张量的梯度,即张量的导数。这个机制使得使用PyTorch进行深度学习模型的...
      99+
      2024-03-05
      PyTorch
    • JavaScript自定义函数求累加
      JavaScript是一种用于编写Web应用程序的高级编程语言,其强大的能力和广泛的用途已经使它成为Web开发中必备的工具之一。 在JavaScript中,自定义函数是一种非常重要的技术,它允许我们根据自己的需求编写并调用函数。在本文中,我...
      99+
      2023-05-14
    • PyTorch中怎么定义损失函数
      在PyTorch中,我们可以使用torch.nn模块中的各种损失函数来定义损失函数。以下是一些常用的损失函数及其定义方法: 均方误...
      99+
      2024-04-02
    • Promise中怎么自定义一个GET请求函数
      这篇文章给大家介绍Promise中怎么自定义一个GET请求函数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。语法基本new Promise( function(re...
      99+
      2024-04-02
    • pyqt5怎么自定义槽函数
      要自定义槽函数,你需要按照以下步骤进行操作: 在你的PyQt5应用程序的主窗口类中定义一个新的函数作为槽函数。例如,你可以在主窗口...
      99+
      2024-02-29
      pyqt5
    • Vue怎么自定义hook函数
      这篇文章主要介绍“Vue怎么自定义hook函数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue怎么自定义hook函数”文章能帮助大家解决问题。定义什么是hook本质是一个函数,把 setup 函...
      99+
      2023-07-02
    • MySQL中怎么自定义函数
      MySQL中怎么自定义函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。控制流程函数  case...when  根据值判断返...
      99+
      2024-04-02
    • Vue怎么自定义hooks函数
      本文小编为大家详细介绍“Vue怎么自定义hooks函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue怎么自定义hooks函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在Vue当中,一个非常重要的功能就...
      99+
      2023-07-05
    • python中怎么自定义函数
      这篇文章主要讲解了“python中怎么自定义函数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中怎么自定义函数”吧!  python中支持自定义函数  以def开头,后接标识符名...
      99+
      2023-06-01
    • c++怎么自己定义函数
      通过使用 function 关键字,可以创建自定义函数,包括指定返回类型、命名函数、定义参数列表、编写函数体和返回一个值(对于非 void 函数)。示例代码演示了如何计算两个数的和并返回...
      99+
      2024-04-22
      c++
    • shell中怎么自定义函数
      shell中怎么自定义函数,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、定义函数代码如下:function fname(){statements;}或代码如...
      99+
      2023-06-09
    • Pytorch自动求导函数详解流程以及与TensorFlow搭建网络的对比
      一、定义新的自动求导函数 在底层,每个原始的自动求导运算实际上是两个在Tensor上运行的函数。其中,forward函数计算从输入Tensor获得的输出Tensors。而backwa...
      99+
      2024-04-02
    • SwiftUI怎么自定义导航
      这篇文章主要介绍“SwiftUI怎么自定义导航”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SwiftUI怎么自定义导航”文章能帮助大家解决问题。前言默认情况下,SwiftUI提供的各种导航API在...
      99+
      2023-06-30
    • mysql怎么调用自定义函数
      mysql调用自定义函数的方法:1、在Navicat工具中点击界面上的“函数”。进入函数操作界面后点击新建函数。2、继续点击弹窗中的“函数”。3、设置函数的参数名和参数类型。设置完成后点击“下一步”。4、继续设置函数的返回类型。设置后点击“...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作