婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > pytorch自定義不可導激活函數的操作

pytorch自定義不可導激活函數的操作

熱門標簽:商家地圖標注海報 打電話機器人營銷 騰訊地圖標注沒法顯示 南陽打電話機器人 孝感營銷電話機器人效果怎么樣 地圖標注自己和別人標注區別 海外網吧地圖標注注冊 聊城語音外呼系統 ai電銷機器人的優勢

pytorch自定義不可導激活函數

今天自定義不可導函數的時候遇到了一個大坑。

首先我需要自定義一個函數:sign_f

import torch
from torch.autograd import Function
import torch.nn as nn
class sign_f(Function):
    @staticmethod
    def forward(ctx, inputs):
        output = inputs.new(inputs.size())
        output[inputs >= 0.] = 1
        output[inputs  0.] = -1
        ctx.save_for_backward(inputs)
        return output

    @staticmethod
    def backward(ctx, grad_output):
        input_, = ctx.saved_tensors
        grad_output[input_>1.] = 0
        grad_output[input_-1.] = 0
        return grad_output

然后我需要把它封裝為一個module 類型,就像 nn.Conv2d 模塊 封裝 f.conv2d 一樣,于是

import torch
from torch.autograd import Function
import torch.nn as nn
class sign_(nn.Module):
	# 我需要的module
    def __init__(self, *kargs, **kwargs):
        super(sign_, self).__init__(*kargs, **kwargs)
        
    def forward(self, inputs):
    	# 使用自定義函數
        outs = sign_f(inputs)
        return outs

class sign_f(Function):
    @staticmethod
    def forward(ctx, inputs):
        output = inputs.new(inputs.size())
        output[inputs >= 0.] = 1
        output[inputs  0.] = -1
        ctx.save_for_backward(inputs)
        return output

    @staticmethod
    def backward(ctx, grad_output):
        input_, = ctx.saved_tensors
        grad_output[input_>1.] = 0
        grad_output[input_-1.] = 0
        return grad_output

結果報錯

TypeError: backward() missing 2 required positional arguments: 'ctx' and 'grad_output'

我試了半天,發現自定義函數后面要加 apply ,詳細見下面

import torch
from torch.autograd import Function
import torch.nn as nn
class sign_(nn.Module):

    def __init__(self, *kargs, **kwargs):
        super(sign_, self).__init__(*kargs, **kwargs)
        self.r = sign_f.apply ### -----注意此處
        
    def forward(self, inputs):
        outs = self.r(inputs)
        return outs

class sign_f(Function):
    @staticmethod
    def forward(ctx, inputs):
        output = inputs.new(inputs.size())
        output[inputs >= 0.] = 1
        output[inputs  0.] = -1
        ctx.save_for_backward(inputs)
        return output

    @staticmethod
    def backward(ctx, grad_output):
        input_, = ctx.saved_tensors
        grad_output[input_>1.] = 0
        grad_output[input_-1.] = 0
        return grad_output

問題解決了!

PyTorch自定義帶學習參數的激活函數(如sigmoid)

有的時候我們需要給損失函數設一個超參數但是又不想設固定閾值想和網絡一起自動學習,例如給Sigmoid一個參數alpha進行調節

函數如下:

import torch.nn as nn
import torch
class LearnableSigmoid(nn.Module):
    def __init__(self, ):
        super(LearnableSigmoid, self).__init__()
        self.weight = torch.nn.Parameter(torch.FloatTensor(1), requires_grad=True)

        self.reset_parameters()
    def reset_parameters(self):
        self.weight.data.fill_(1.0)
        
    def forward(self, input):
        return 1/(1 +  torch.exp(-self.weight*input))

驗證和Sigmoid的一致性

class LearnableSigmoid(nn.Module):
    def __init__(self, ):
        super(LearnableSigmoid, self).__init__()
        self.weight = torch.nn.Parameter(torch.FloatTensor(1), requires_grad=True)

        self.reset_parameters()
    def reset_parameters(self):
        self.weight.data.fill_(1.0)
        
    def forward(self, input):
        return 1/(1 +  torch.exp(-self.weight*input))
   
Sigmoid = nn.Sigmoid()
LearnSigmoid = LearnableSigmoid()
input = torch.tensor([[0.5289, 0.1338, 0.3513],
        [0.4379, 0.1828, 0.4629],
        [0.4302, 0.1358, 0.4180]])

print(Sigmoid(input))
print(LearnSigmoid(input))

輸出結果

tensor([[0.6292, 0.5334, 0.5869],
[0.6078, 0.5456, 0.6137],
[0.6059, 0.5339, 0.6030]])

tensor([[0.6292, 0.5334, 0.5869],
[0.6078, 0.5456, 0.6137],
[0.6059, 0.5339, 0.6030]], grad_fn=MulBackward0>)

驗證權重是不是會更新

import torch.nn as nn
import torch
import torch.optim as optim
class LearnableSigmoid(nn.Module):
    def __init__(self, ):
        super(LearnableSigmoid, self).__init__()
        self.weight = torch.nn.Parameter(torch.FloatTensor(1), requires_grad=True)

        self.reset_parameters()

    def reset_parameters(self):
        self.weight.data.fill_(1.0)
        
    def forward(self, input):
        return 1/(1 +  torch.exp(-self.weight*input))
        
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()       
        self.LSigmoid = LearnableSigmoid()
    def forward(self, x):                
        x = self.LSigmoid(x)
        return x

net = Net()  
print(list(net.parameters()))
optimizer = optim.SGD(net.parameters(), lr=0.01)
learning_rate=0.001
input_data=torch.randn(10,2)
target=torch.FloatTensor(10, 2).random_(8)
criterion = torch.nn.MSELoss(reduce=True, size_average=True)

for i in range(2):
    optimizer.zero_grad()     
    output = net(input_data)   
    loss = criterion(output, target)
    loss.backward()             
    optimizer.step()           
    print(list(net.parameters()))

輸出結果

tensor([1.], requires_grad=True)]
[Parameter containing:
tensor([0.9979], requires_grad=True)]
[Parameter containing:
tensor([0.9958], requires_grad=True)]

會更新~

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • pytorch方法測試——激活函數(ReLU)詳解
  • PyTorch中常用的激活函數的方法示例
  • Pytorch 實現自定義參數層的例子

標簽:南寧 迪慶 牡丹江 撫州 聊城 楊凌 揚州 六盤水

巨人網絡通訊聲明:本文標題《pytorch自定義不可導激活函數的操作》,本文關鍵詞  pytorch,自定義,不,可導,激活,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pytorch自定義不可導激活函數的操作》相關的同類信息!
  • 本頁收集關于pytorch自定義不可導激活函數的操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩二区三区| 精品一区二区三区免费播放| 粉嫩av一区二区三区| 亚洲视频小说图片| 欧美精品国产精品| 国产很黄免费观看久久| 一区二区三区中文字幕在线观看| 3d成人h动漫网站入口| 成人av第一页| 久久精品国产一区二区| 国产精品久久久久久久久久久免费看| 欧美少妇xxx| 国产成人av自拍| 成人精品视频一区| 美腿丝袜亚洲综合| 一区二区国产盗摄色噜噜| 亚洲国产综合91精品麻豆| 国产精品动漫网站| 亚洲情趣在线观看| 国产精品久久久久aaaa樱花| 亚洲免费三区一区二区| 性欧美疯狂xxxxbbbb| 亚洲精品视频在线看| 欧美国产综合色视频| 欧美一区二区精品| 欧美日韩大陆一区二区| 欧美妇女性影城| 久久先锋资源网| 精品欧美乱码久久久久久| 欧美高清激情brazzers| 欧美sm极限捆绑bd| 国产精品日产欧美久久久久| 精品国精品国产| 日韩精品最新网址| 日韩亚洲欧美综合| 4438x亚洲最大成人网| 国产丝袜在线精品| 国产婷婷色一区二区三区在线| 亚洲精品免费一二三区| 麻豆精品一区二区三区| 99精品1区2区| 欧美性xxxxx极品少妇| 日韩欧美色电影| 一区二区三区欧美视频| 韩国精品一区二区| 国产福利一区在线观看| 欧美三级电影网| 欧美一区中文字幕| 亚洲女同ⅹxx女同tv| 国产一区二区成人久久免费影院| 国产suv一区二区三区88区| 欧美性生活一区| 国产精品毛片久久久久久| 久久精品久久99精品久久| 在线亚洲一区二区| 91在线观看下载| 色哦色哦哦色天天综合| 7777精品伊人久久久大香线蕉| 亚洲美腿欧美偷拍| 高清成人在线观看| 久久久久久久久久久久久久久99 | 国产日韩欧美综合在线| 国产欧美日韩视频一区二区| 久久国产尿小便嘘嘘尿| 91精品国产综合久久精品| 亚洲精品国产a| 99re热视频精品| 亚洲三级在线免费| 日本精品一区二区三区高清| 中文字幕在线一区| 日日摸夜夜添夜夜添精品视频| 国产一区二区三区四区在线观看| 日韩视频在线你懂得| 天天综合色天天综合色h| 国产一区二区在线观看视频| 精品久久久久久久久久久久久久久久久| 午夜影院在线观看欧美| 欧美四级电影网| 偷拍一区二区三区四区| 91麻豆精品国产综合久久久久久| 首页综合国产亚洲丝袜| 欧美视频你懂的| 天天免费综合色| 欧美一区二区精品在线| 国产综合色视频| 欧美激情综合在线| 色婷婷精品久久二区二区蜜臀av| 亚洲精品乱码久久久久久| 欧美午夜在线一二页| 蜜臀久久久久久久| 色菇凉天天综合网| 首页国产欧美日韩丝袜| 久久美女艺术照精彩视频福利播放| 国模娜娜一区二区三区| 中文字幕一区二区三区蜜月| 欧美亚洲一区三区| 麻豆极品一区二区三区| 国产精品不卡在线观看| 欧美精品在线观看播放| 国产麻豆精品久久一二三| 亚洲麻豆国产自偷在线| 日韩欧美一卡二卡| aaa国产一区| 18成人在线观看| 欧美日韩在线直播| 国产精品自在欧美一区| 久久久久久久久久久久久夜| 97久久精品人人爽人人爽蜜臀| 日韩高清电影一区| 欧美一级专区免费大片| 不卡的av网站| 日本欧美韩国一区三区| 亚洲色图欧洲色图婷婷| 精品日本一线二线三线不卡| 色狠狠一区二区| 国产成人精品免费一区二区| 亚洲综合免费观看高清完整版 | 青青草原综合久久大伊人精品优势| 久久这里只有精品6| 欧美日韩一区久久| 91免费在线视频观看| 国产一区二区三区四区五区入口| 婷婷综合久久一区二区三区| 亚洲女女做受ⅹxx高潮| 久久亚洲影视婷婷| 日韩精品一区在线| 欧美日韩国产中文| 在线观看成人免费视频| 99视频一区二区三区| 成人一级视频在线观看| 国模冰冰炮一区二区| 久久国产免费看| 蜜桃视频在线观看一区| 亚洲成a人v欧美综合天堂 | 欧美一区二区三区思思人| 色综合久久综合| 91一区一区三区| 成人av电影免费观看| 风间由美一区二区三区在线观看 | 欧美日韩一本到| 一本高清dvd不卡在线观看 | 日韩欧美在线一区二区三区| 在线免费观看日本一区| 一本久久a久久免费精品不卡| 暴力调教一区二区三区| 成人黄色小视频在线观看| 国产精品99久久久久| 紧缚奴在线一区二区三区| 韩国一区二区视频| 国产一区二区网址| 国产成人精品亚洲777人妖 | 免费一级欧美片在线观看| 亚洲丰满少妇videoshd| 日韩二区在线观看| 激情综合色综合久久综合| 国产尤物一区二区| 成人丝袜高跟foot| 91老司机福利 在线| 欧美午夜片在线观看| 欧美一区二区三区播放老司机| 精品日韩av一区二区| 国产欧美日韩另类视频免费观看| 国产精品动漫网站| 亚洲一区在线观看网站| 偷拍一区二区三区四区| 精品中文字幕一区二区 | 亚洲精选一二三| 亚洲国产精品久久艾草纯爱 | 久久综合网色—综合色88| 欧美激情一区二区三区蜜桃视频 | 精品在线一区二区三区| 国产99精品国产| 欧美午夜精品一区| 精品电影一区二区三区| 国产精品久久久久久久久图文区| 一片黄亚洲嫩模| 国产在线精品不卡| 一本久久精品一区二区| 日韩免费视频一区| 亚洲欧美激情插| 久久精品国产99久久6| 99在线精品一区二区三区| 91精品国产综合久久久久久久久久| 久久久精品综合| 一区二区欧美国产| 国产91精品在线观看| 欧美日韩卡一卡二| 一区免费观看视频| 精品一区二区三区在线播放视频 | 91在线看国产| 欧美成人在线直播| 亚洲高清免费在线| 国产高清成人在线| 欧美一区二区三区在线观看 | 欧美日韩一二区| 国产精品午夜电影| 国产在线精品视频| 欧美人与禽zozo性伦| 亚洲人成网站影音先锋播放| 国产精品综合网|