神經網路的典型處理如下所示:
定義可學習引數的網路結構(堆疊各層和層的設計);
資料集輸入;
對輸入進行處理(由定義的網路層進行處理),主要體現在網路的前向傳播;
計算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函式如下,紅色表示的部分為增...