pytorch forward函式底層實現

2021-10-10 20:08:41 字數 3177 閱讀 7284

神經網路的典型處理如下所示:

定義可學習引數的網路結構(堆疊各層和層的設計);

資料集輸入;

對輸入進行處理(由定義的網路層進行處理),主要體現在網路的前向傳播;

計算loss ,由loss層計算;

反向傳播求梯度;

根據梯度改變引數值,最簡單的實現方式(sgd)為:

weight = weight - learning_rate * gradient

下面是利用pytorch定義深度網路層(op)示例:

class featurel2norm(torch.nn.module):

definit(self):

super(featurel2norm, self).init()

def forward(self, feature):

epsilon = 1e-6

norm = torch.pow(torch.sum(torch.pow(feature,2),1)+epsilon,0.5).unsqueeze(1).expand_as(feature)

return torch.div(feature,norm)

class featureregression(nn.module):

definit(self, output_dim=6, use_cuda=true):

super(featureregression, self).init()

self.conv = nn.sequential(

nn.conv2d(225, 128, kernel_size=7, padding=0),

nn.batchnorm2d(128),

nn.relu(inplace=true),

nn.conv2d(128, 64, kernel_size=5, padding=0),

nn.batchnorm2d(64),

nn.relu(inplace=true),

)self.linear = nn.linear(64 * 5 * 5, output_dim)

if use_cuda:

self.conv.cuda()

self.linear.cuda()

def forward(self, x):

x = self.conv(x)

x = x.view(x.size(0), -1)

x = self.linear(x)

return x

由上例**可以看到,不論是在定義網路結構還是定義網路層的操作(op),均需要定義forward函式,下面看一下pytorch官網對pytorch的forward方法的描述:

那麼呼叫forward方法的具體流程是什麼樣的呢?具體流程是這樣的:

以乙個module為例:

呼叫module的call方法

module的call裡面呼叫module的forward方法

forward裡面如果碰到module的子類,回到第1步,如果碰到的是function的子類,繼續往下

呼叫function的call方法

function的call方法呼叫了function的forward方法。

function的forward返回值

module的forward返回值

在module的call進行forward_hook操作,然後返回值。

上述中「呼叫module的call方法」是指nn.module 的__call__方法。定義__call__方法的類可以當作函式呼叫,具體參考python的物件導向程式設計。也就是說,當把定義的網路模型model當作函式呼叫的時候就自動呼叫定義的網路模型的forward方法。nn.module 的__call__方法部分原始碼如下所示:

defcall(self, *input, **kwargs):

result = self.forward(*input, **kwargs)

for hook in self._forward_hooks.values():

#將註冊的hook拿出來用

hook_result = hook(self, input, result)

…return result

可以看到,當執行model(x)的時候,底層自動呼叫forward方法計算結果。具體示例如下:

class lenet(nn.module):

definit(self):

super(lenet, self).init()

layer1 = nn.sequential()

layer1.add_module('conv1', nn.conv(1, 6, 3, padding=1))

layer1.add_moudle('pool1', nn.maxpool2d(2, 2))

self.layer1 = layer1

layer2 = nn.sequential()

layer2.add_module('conv2', nn.conv(6, 16, 5))

layer2.add_moudle('pool2', nn.maxpool2d(2, 2))

self.layer2 = layer2

layer3 = nn.sequential()

layer3.add_module('fc1', nn.linear(400, 120))

layer3.add_moudle('fc2', nn.linear(120, 84))

layer3.add_moudle('fc3', nn.linear(84, 10))

self.layer3 = layer3

def forward(self, x):

x = self.layer1(x)

x = self.layer2(x)

x = x.view(x.size(0), -1)

x = self.layer3(x)

return x

model = lenet()

y = model(x)

如上則呼叫網路模型定義的forward方法。

WaitForSingleObject函式的使用

程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...

cvCreateVideoWriter函式使用

cvcreatevideowriter函式使用 2011 11 04 15 47 例如,cv fourcc p i m 1 是mpeg 1 codec,cv fourcc m j p g 是motion jpeg codec cv fourcc m p 4 2 mpeg 4.2 codec cv f...

CentimetersToPoints函式出錯

在word開發中,碰到centimeterstopoints函式呼叫出錯,提示未指定的錯誤的問題。解決辦法為修改centimeterstopoint函式 匯入msword.olb後的centimeterstopoint函式如下 修改後的centimeterstopoint函式如下,紅色表示的部分為增...