神經網路可以通過torch.nn包來構建,它是基於自動梯度來構建一些模型,乙個nn.module包括層和乙個方法forward(input),同時也會返回乙個輸出(output)。
下圖是乙個簡單的前饋神經網路lenet,乙個簡單的神經網路包括一下幾點:
:# super(net,self) 首先找到 net 的父類(就是類 nn.module),
# 然後把類 net 的物件轉換為類 fooparent 的物件
super
(net, self)
.__init__(
)#構建卷積
self.conv1 = nn.conv2d(1,
6,5)
# 輸入 1, 輸出 6, 卷積 5*5,即6個不同的5*5卷積
self.conv2 = nn.conv2d(6,
16,5)
# 輸入 6, 輸出 16, 卷積 5*5
#構建全連線 y = wx + b
self.fc1 = nn.linear(16*
5*5,
120)
# 因為有16張 5*5 map, 所以有 16*5*5 = 400個輸入,因此有120個400*1的向量
self.fc2 = nn.linear(
120,84)
# 84 個 120 * 1 個向量
self.fc3 = nn.linear(84,
10)# 10個 84 * 1 個向量
defforward
(self, x)
: x = f.max_pool2d(f.relu(self.conv1(x)),
(2,2
))# 2*2 的最大值池化, relu為啟用函式
x = f.max_pool2d(f.relu(self.conv2(x)),
2)# 如果池化視窗是矩形的,則可以只設定為2
x = x.view(-1
, self.num_flat_features(x)
)# view函式將張量x變形成一維的向量形式,作為全連線的輸入
x = f.relu(self.fc1(x)
) x = f.relu(self.fc2(x)
) x = self.fc3(x)
return x
defnum_flat_features
(self, x)
: size = x.size()[
1:]# 單張影象的size
num_features =
1for s in size:
num_features *= s
return num_features
net = net(
(net)
# 輸出
# net(
# (conv1): conv2d(1, 6, kernel_size=(5, 5), stride=(1, 1))
# (conv2): conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))
# (fc1): linear(in_features=400, out_features=120, bias=true)
# (fc2): linear(in_features=120, out_features=84, bias=true)
# (fc3): linear(in_features=84, out_features=10, bias=true)
# )# 乙個模型的訓練引數可以通過呼叫 net.parameterss()返回
params =
list
(net.parameters())
(len
(params)
(params[0]
.size())
# 輸出
# 10
# torch.size([6, 1, 5, 5])
#下面嘗試隨機生成乙個32*32的輸入。注意:期望的輸入維度是32*32
# 為了使用這個網路在mnist資料上使用,需要把資料集中的影象維度修改為32*32
input
= torch.randn(1,
1,32,
32)out = net(
input
(out)
#輸出# tensor([[ 0.0469, 0.0975, 0.0686, 0.0793, 0.0673, 0.0325, -0.0455, -0.0428,
# # -0.0671, -0.0067]], grad_fn=)
#把所有引數梯度快取器置0, 用隨機的梯度來反向傳播
net.zero_grad(
)out.backward(torch.randn(1,
10))
上面的**定義了乙個神經而桑落,並且處理了輸入以及呼叫反向傳播。
下面開始,計算損失值和更新網路中的權重:
損失函式:乙個損失函式需要一對輸入:模型輸出和目標,然後計算乙個值來評估輸出距離目標有多遠。nn包中包含著一些不同的損失函式,乙個簡單的損失函式就是 nn.mseloss ,即均方誤差。
output = net(
input
)target = torch.randn(10)
# 目標值
target = target.view(1,
-1)# 將其變換成與輸出值相同的尺寸格式
criterion = nn.mseloss(
)# mseloss
loss = criterion(output, target)
#計算輸出與目標之間的損失函式
print
(loss)
#輸出#tensor(0.3130, grad_fn=)
反向傳播:為了使損失進行反向傳播,需要做的僅僅是使用loss.backward()。首先要清空現存的梯度,否則會和現存的梯度累計到一起
net.zero_grad(
)print
('conv1.bias.grad before backward'
)print
(net.conv1.bias.grad)
loss.backward(
)print
('conv1.bias.grad after backward'
)print
(net.conv1.bias.grad)
#輸出# conv1.bias.grad before backward
# tensor([0., 0., 0., 0., 0., 0.])
# conv1.bias.grad after backward
# tensor([-0.0040, -0.0041, 0.0244, -0.0020, -0.0054, -0.0084])
更新神經網路引數
最簡單的更新計算方式就是使用隨機梯度下降 weight = weight - learning_rate * gradient
python實現方式
learning_rate =
0.01
for f in net.parameters():
f.data.sub_(f.grad.data * learning_rate)
torch.optim中內建了多種權重更新規則,類似於sgd, nesterov-sgd,adam, rmsprop等。
使用方式如下:
import torch.optim as optim
# 建立優化器
optimizer = optim.sgd(net.parameters(
), lr=
0.01
)# 在訓練的迴圈中加入一下**
optimizer.zero_grad(
)# 將梯度置0
output = net(
input
)loss = criterion(output, target)
loss.backward(
)optimizer.step(
)# 更新權重
機器學習之神經網路
機器學習是一門致力於研究如何通過計算的手段,利用經驗來改善系統自身的效能。經驗通常以資料的形式存在,因此機器學習所研究的主要內容是關於在計算機上從資料中產生 模型 的演算法,即 學習演算法 有了學習演算法,將經驗資料提供給它,它就能基於這些資料產生模型 當面對新情況時,模型會給我們提供相應的判斷。一...
深度學習之神經網路
神經網路由輸入層 隱藏層 輸出層組成 1 單層神經網路 感知機 類似邏輯回歸,線性分類,全連線 沒有啟用函式 2 兩層神經網路 多層感知機 帶乙個隱層,非線性分類,全連線 3 多層神經網路 深度學習 全連線 4 卷積神經網路 cnn 非全連線 5 迴圈神經網路 rnn 處理序列資料 作非線性變換 s...
機器學習之神經網路NN
神經網路 neural network 以人腦中的神經網路為啟發而產生的,最著名對的演算法是backpropagation bp 演算法。可用來解決分類問題,也可用來解決回歸問題 詳情見前言 多層向前神經網路中使用了bp演算法 多層向前神經網路的組成,每一層由單元組成 圖中小圈圈 輸入層 由訓練集的...