1.線性回歸
線性回歸輸出是?個連續(xù)值,因此適?用于回歸問題。
基本要素
①模型定義
②模型訓(xùn)練
(1)訓(xùn)練數(shù)據(jù):在機(jī)器?學(xué)習(xí)術(shù)語?里里,該數(shù)據(jù)集 被稱為訓(xùn)練數(shù)據(jù)集(training data set)或訓(xùn)練集(training set),?一棟房屋被稱為?一個樣本 (sample),其真實(shí)售出價格叫作標(biāo)簽(label),?用來預(yù)測標(biāo)簽的兩個因素叫作特征(feature)。 特征?用來表征樣本的特點(diǎn)。
(2)損失函數(shù):平方損失
(3)優(yōu)化算法:小批量量隨機(jī)梯度下降(mini-batch stochastic gradient descent)在深度 學(xué)習(xí)中被廣泛使用。它的算法很簡單:先選取一組模型參數(shù)的初始值,如隨機(jī)選取;接下來對參數(shù)進(jìn)?行行 多次迭代,使每次迭代都可能降低損失函數(shù)的值。在每次迭代中,先隨機(jī)均勻采樣?個由固定數(shù)?目訓(xùn)練 數(shù)據(jù)樣本所組成的?小批量量(mini-batch) ,然后求?批量中數(shù)據(jù)樣本的平均損失有關(guān)模型參數(shù)的導(dǎo)數(shù) (梯度),最后?用此結(jié)果與預(yù)先設(shè)定的?個正數(shù)的乘積作為模型參數(shù)在本次迭代的減?量。
③模型預(yù)測:模型訓(xùn)練完成后,我們將模型參數(shù) 在優(yōu)化算法停?止時的值分別記作 。注意,這?里里 我們得到的并不一定是最?化損失函數(shù)的最優(yōu)解 ,而是對最優(yōu)解的?個近似。
pytorch實(shí)現(xiàn):
1.生成數(shù)據(jù)集
import torch
from torch import nn
import numpy as np
torch.manual_seed(1)
print(torch.__version__)
torch.set_default_tensor_type('torch.FloatTensor’)
num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)
其中features是訓(xùn)練數(shù)據(jù)特征,labels是標(biāo)簽。:
2.讀取數(shù)據(jù):PyTorch提供了?data包來讀取數(shù)據(jù)。由于data常用作變量名,我們將導(dǎo)入的data模塊?用Data代替。在每?次迭代中,我們將隨機(jī)讀取包含10個數(shù)據(jù)樣本的?批量。
import torch.utils.data as Data
batch_size = 10
# ?將訓(xùn)練數(shù)據(jù)的特征和標(biāo)簽組合
dataset = Data.TensorDataset(features, labels)
# ?隨機(jī)讀取?批量
data_iter = Data.DataLoader(
????dataset=dataset,????????????# torch TensorDataset format
????batch_size=batch_size,??????# mini batch size
????shuffle=True,???????????????# whether shuffle the data or not
????num_workers=2,??????????????# read data in multithreading
)
#讀取并打印第?個?批量數(shù)據(jù)樣本
for X, y in data_iter:
????print(X, '\n', y)
????break
3.定義模型:?先,導(dǎo)? torch.nn 模塊。實(shí)際上,“nn”是neural networks(神經(jīng)?絡(luò))的縮寫。顧名思義,該模 塊定義了?量神經(jīng)?絡(luò)的層。 之前我們已經(jīng)?過了 autograd , ? nn 就是利? autograd 來定義模 型。 nn 的核?數(shù)據(jù)結(jié)構(gòu)是 Module ,它是?個抽象概念,既可以表示神經(jīng)?絡(luò)中的某個層(layer), 也可以表示?個包含很多層的神經(jīng)?絡(luò)。在實(shí)際使?中,最常?見的做法是繼承 nn.Module ,撰寫?? 的?絡(luò)/層。?個 nn.Module 實(shí)例應(yīng)該包含?些層以及返回輸出的前向傳播(forward)?法。下?先 來看看如何? nn.Module 實(shí)現(xiàn)?個線性回歸模型。
class LinearNet(nn.Module):
?? ?def __init__(self, n_feature):
?? ?super(LinearNet, self).__init__()
?? ?self.linear = nn.Linear(n_feature, 1)
?? ?# forward 定義前向傳播
?? ?def forward(self, x):
?? ?y = self.linear(x)
?? ?return y
net = LinearNet(num_inputs)?
print(net) # 使?print可以打印出?絡(luò)的結(jié)構(gòu)
可以? nn.Sequential 來更加?便地搭建?絡(luò), Sequential是?個有序的容器,?絡(luò)層將按照在傳? Sequential 的順序依次被添加到計算圖中。
# ways to init a multilayer network
# method one
net = nn.Sequential(
????nn.Linear(num_inputs, 1)
????# other layers can be added here
????)
# method two
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
# net.add_module ......
# method three
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
??????????('linear', nn.Linear(num_inputs, 1))
??????????# ......
????????]))
print(net)
print(net[0])
可以通過net.parameters()來查看模型所有的可學(xué)習(xí)參數(shù),此函數(shù)將返回?個?成器。
for param in net.par
????print(param)
注意: torch.nn 僅?持輸??個batch的樣本不?持單個樣本輸?, 如果只有單個樣本, 可使 ? input.unsqueeze(0) 來添加?維。
4.初始化
使? net 前,我們需要初始化模型參數(shù),如線性回歸模型中的權(quán)重和偏差。PyTorch在 init 模塊中 提供了多種參數(shù)初始化?法。這?的 init 是 initializer 的縮寫形式。我們通過 init.normal_ 將權(quán)重參數(shù)每個元素初始化為隨機(jī)采樣于均值為0、標(biāo)準(zhǔn)差為0.01的正態(tài)分布。偏差會初始化為零。
from torch.nn import init
init.normal_(net[0].weight, mean=0.0, std=0.01)
init.constant_(net[0].bias, val=0.0) ?# 也可以直接修改bias的data: net[0].bias.data.fill_(0)
5.損失函數(shù)
PyTorch在nn模塊中提供了各種損失函數(shù),這些損失函數(shù)可看作是?種特殊的層,PyTorch也將這些損失函數(shù) nn.Module 的?類。我們現(xiàn)在使?它提供的均?誤差損失作為模型的損失函數(shù)。
loss = nn.MSELoss()
6.優(yōu)化算法
?須??實(shí)現(xiàn)?批量隨機(jī)梯度下降算法。 torch.optim 模塊提供了很多常?的優(yōu)化算法 ?如SGD、Adam和RMSProp等。下?我們創(chuàng)建?個?于優(yōu)化 net 所有參數(shù)的優(yōu)化器實(shí)例,并指定學(xué) 習(xí)率為0.03的?批量隨機(jī)梯度下降(SGD)為優(yōu)化算法。
import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.03)???# built-in random gradient descent function
print(optimizer)??# function prototype: `torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)`
7.訓(xùn)練
num_epochs = 3
for epoch in range(1, num_epochs + 1):
????for X, y in data_iter:
????????output = net(X)
????????l = loss(output, y.view(-1, 1))
????????optimizer.zero_grad() # reset gradient, equal to net.zero_grad()
????????l.backward()
????????optimizer.step()
????print('epoch %d, loss: %f' % (epoch, l.item()))