溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言擴(kuò)展怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-24 15:34:21 來源:億速云 閱讀:193 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“C語言擴(kuò)展怎么實(shí)現(xiàn)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Extending torch.autograd 擴(kuò)展torch.autograd
Adding operations to autograd requires implementing a new Function subclass 
for each operation. Recall that Function s are what autograd uses to compute 
the results and gradients, and encode the operation history. Every new function 
requires you to implement 2 methods:
向autograd自動梯度中添加操作需要我們?yōu)槊總€(gè)操作實(shí)現(xiàn)一個(gè)新的Function子類.
我們知道,autograd使用Function來計(jì)算結(jié)果和計(jì)算梯度,并且編碼操作歷史.
每一個(gè)新的function需要我們實(shí)現(xiàn)兩個(gè)方法:
	forward() - the code that performs the operation. It can take as many arguments as 
	you want, with some of them being optional, if you specify the default values. All 
	kinds of Python objects are accepted here. Tensor arguments that track history (i.e., 
	with requires_grad=True) will be converted to ones that don’t track history before the 
	call, and their use will be registered in the graph. Note that this logic won’t traverse 
	lists/dicts/any other data structures and will only consider Tensor s that are direct 
	arguments to the call. You can return either a single Tensor output, or a tuple of 
	Tensor s if there are multiple outputs. Also, please refer to the docs of Function to 
	find descriptions of useful methods that can be called only from forward().
	forward()方法 - 執(zhí)行操作的代碼.它可以接收你需要的任意數(shù)量的參數(shù),如果你指定默認(rèn)
	值,可以將其中部分設(shè)置成可選參數(shù).這里可以接收任意Python對象.
	跟蹤歷史的(即requires_grad=True) 張量Tensor參數(shù)在該函數(shù)調(diào)用之前將會被轉(zhuǎn)換成
	不跟蹤歷史的張量,并且他們的使用會被登記注冊到計(jì)算圖中.注意這個(gè)邏輯不會遍歷
	列表/字典/以及其他任何數(shù)據(jù)結(jié)構(gòu),并且只會作用于作為參數(shù)直接傳遞給該函數(shù)調(diào)用的
	張量. 你可以返回單個(gè)張量Tensor作為函數(shù)輸出,或者返回張量構(gòu)成的元組作為函數(shù)的
	多個(gè)輸出.同時(shí)你可以參閱Function文檔, 在文檔中你可以找到更多信息,它們介紹了一
	些只能在forward()函數(shù)中使用的好用的方法.
	backward() - gradient formula. It will be given as many Tensor arguments as there 
	were outputs, with each of them representing gradient w.r.t. that output. It should 
	return as many Tensor s as there were inputs, with each of them containing the 
	gradient w.r.t. its corresponding input. If your inputs didn’t require gradient 
	(needs_input_grad is a tuple of booleans indicating whether each input needs 
	gradient computation), or were non-Tensor objects, you can return None. Also, if you 
	have optional arguments to forward() you can return more gradients than there were 
	inputs, as long as they’re all None.
	backward() - 梯度公式. 這個(gè)方法接收一定數(shù)量的Tensor張量參數(shù),參數(shù)的數(shù)量,就是這
	個(gè)運(yùn)算操作的輸出數(shù)據(jù)數(shù)量(即前向傳遞函數(shù)輸出數(shù)據(jù)的數(shù)量),并且這個(gè)函數(shù)接收的參
	數(shù)就是相對于輸出數(shù)據(jù)(前向傳遞的輸出數(shù)據(jù))的梯度. 該方法也返回一定數(shù)量的
	Tensor張量參數(shù),參數(shù)的數(shù)量就是輸入數(shù)據(jù)(前向傳遞的輸入數(shù)據(jù),也就是forward函數(shù)接
	收參數(shù)的數(shù)量)的數(shù)量,并且它的值是相對于輸入數(shù)據(jù)的梯度.如果你的數(shù)據(jù)不需要梯度
	(needs_input_grad是一個(gè)布爾類型構(gòu)成的元組,他表示輸入的每個(gè)數(shù)據(jù)是否需要計(jì)算梯
	度),	或者是非張量的對象,你可以返回None. 同樣,如果有可選參數(shù)傳遞到forward(),那
	么你可以返回比輸入數(shù)據(jù)更多數(shù)量的梯度,只要把他們設(shè)置成None即可.

Below you can find code for a Linear function from torch.nn, with additional comments:
以下內(nèi)容你可以看到torch.nn庫中Linear 函數(shù)的代碼:
# Inherit from Function# 繼承Functionclass LinearFunction(Function):# Note that both forward and backward are @staticmethods# 注意forward方法和backward方法都需要用@staticmethod來裝飾@staticmethod# bias is an optional argument# bias 是可選參數(shù)def forward(ctx, input, weight, bias=None):ctx.save_for_backward(input, weight, bias)output = input.mm(weight.t())if bias is not None:output += bias.unsqueeze(0).expand_as(output)return output# This function has only a single output, so it gets only one gradient# 該函數(shù)只有單個(gè)輸出,因此他只會接收一個(gè)梯度@staticmethoddef backward(ctx, grad_output):# This is a pattern that is very convenient - at the top of backward# unpack saved_tensors and initialize all gradients w.r.t. inputs to# None. Thanks to the fact that additional trailing Nones are# ignored, the return statement is simple even when the function has# optional inputs.# 這是一個(gè)非常方便的模式,在backward函數(shù)開頭解包saved_tensors# 然后初始化相對于輸入的梯度,將他們設(shè)置成None# 由于尾部多余的None值會被忽略,因此盡管函數(shù)有可選參數(shù),# 返回語句依然很簡單.input, weight, bias = ctx.saved_tensors
        grad_input = grad_weight = grad_bias = None# These needs_input_grad checks are optional and there only to# improve efficiency. If you want to make your code simpler, you can# skip them. Returning gradients for inputs that don't require it is# not an error.# if ctx.needs_input_grad[0]:grad_input = grad_output.mm(weight)if ctx.needs_input_grad[1]:grad_weight = grad_output.t().mm(input)if bias is not None and ctx.needs_input_grad[2]:grad_bias = grad_output.sum(0).squeeze(0)return grad_input, grad_weight, grad_bias

“C語言擴(kuò)展怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI