神經網路的典型處理如下所示:
1. 定義可學習引數的網路結構(堆疊各層和層的設計);
2. 資料集輸入;
3. 對輸入進行處理(由定義的網路層進行處理),主要體現在網路的前向傳播;
4. 計算loss ,由loss層計算;
5. 反向傳播求梯度;
6. 根據梯度改變引數值,最簡單的實現方式(sgd)為:
weight = weight - learning_rate * gradient
下面是利用pytorch定義深度網路層(op)示例:
class
featurel2norm
(torch.nn.module):
definit(self):
super(featurel2norm, self).init()
defforward
(self, feature):
epsilon =
1e-6
# print(feature.size())
# print(torch.pow(torch.sum(torch.pow(feature,2),1)+epsilon,0.5).size())
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()
defforward
(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的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
defforward
(self, x):
x = self.layer1(x)
x = self.layer2(x)
x = x.view(x.size(
0),
-1)x = self.layer3(x)
return x
如上則呼叫網路模型定義的forward方法。
參考:1. pytorch學習筆記(九):pytorch結構介紹
2. pytorch學習筆記(七):pytorch hook 和 關於pytorch backward過程的理解
3. pytorch入門學習(三):neural networks
神經網路的典型處理如下所示:
Tensorflow筆記之前向傳播演算法簡介
前面已經說到神經網路可以將輸入的特徵向量經過層層推導到最後輸出,並通過這些輸出解決分類問題或回歸問題。那麼如果要得到輸出就需要乙個最簡單的演算法 前向傳播演算法。想要了解前向傳播演算法就需要知道神經元。乙個神經元有多個輸入和乙個輸出。每個神經元既可以是其他神經元的輸出,也可以是整個神經網路的輸出。所...
前向傳播和反向傳播 複習下前向反向傳播以及計算量
和大佬學習 沐風 googlenet v1的計算量和參數量精算表 zhuanlan.zhihu.com michael yuan 卷積神經網路的複雜度分析 zhuanlan.zhihu.com 以及資料量運算,和運算時間。首先簡單介紹下概念 卷積過程 單個神經元的卷積過程 如上圖,首先從一維擴充套件...
前向傳播演算法
乙個神經元有多個輸入和乙個輸出,每個神經元的輸入既可以是其他神經元的輸出也可以是整個神經網路的輸入。所謂神經網路的結構就是指的是不同的神經元之間的連線結構。如圖所示,乙個最簡單的神經元結構的輸出就是所有輸入的加權和,而不同的輸入的權重就是神經元的引數。神經網路的優化過程就是優化神經元中引數的取值的過...