1.線性回歸
線性回歸輸出是?個連續(xù)值,因此適?用于回歸問題嗜憔。
基本要素
①模型定義
②模型訓練
(1)訓練數(shù)據(jù):在機器?學習術語?里里吉捶,該數(shù)據(jù)集 被稱為訓練數(shù)據(jù)集(training data set)或訓練集(training set),?一棟房屋被稱為?一個樣本 (sample)币励,其真實售出價格叫作標簽(label)食呻,?用來預測標簽的兩個因素叫作特征(feature)。 特征?用來表征樣本的特點仅胞。
(2)損失函數(shù):平方損失
(3)優(yōu)化算法:小批量量隨機梯度下降(mini-batch stochastic gradient descent)在深度 學習中被廣泛使用昔头。它的算法很簡單:先選取一組模型參數(shù)的初始值揭斧,如隨機選取;接下來對參數(shù)進?行行 多次迭代,使每次迭代都可能降低損失函數(shù)的值盅视。在每次迭代中闹击,先隨機均勻采樣?個由固定數(shù)?目訓練 數(shù)據(jù)樣本所組成的?小批量量(mini-batch) 成艘,然后求?批量中數(shù)據(jù)樣本的平均損失有關模型參數(shù)的導數(shù) (梯度)淆两,最后?用此結果與預先設定的?個正數(shù)的乘積作為模型參數(shù)在本次迭代的減?量秋冰。
③模型預測:模型訓練完成后,我們將模型參數(shù) 在優(yōu)化算法停?止時的值分別記作 埃撵。注意暂刘,這?里里 我們得到的并不一定是最?化損失函數(shù)的最優(yōu)解 鸳惯,而是對最優(yōu)解的?個近似。
pytorch實現(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是訓練數(shù)據(jù)特征绪商,labels是標簽格郁。:
2.讀取數(shù)據(jù):PyTorch提供了?data包來讀取數(shù)據(jù)例书。由于data常用作變量名刻炒,我們將導入的data模塊?用Data代替坟奥。在每?次迭代中,我們將隨機讀取包含10個數(shù)據(jù)樣本的?批量晒喷。
import torch.utils.data as Data
batch_size = 10
# ?將訓練數(shù)據(jù)的特征和標簽組合
dataset = Data.TensorDataset(features, labels)
# ?隨機讀取?批量
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.定義模型:?先凉敲,導? torch.nn 模塊寺旺。實際上爷抓,“nn”是neural networks(神經(jīng)?絡)的縮寫。顧名思義阻塑,該模 塊定義了?量神經(jīng)?絡的層蓝撇。 之前我們已經(jīng)?過了 autograd , ? nn 就是利? autograd 來定義模 型叮姑。 nn 的核?數(shù)據(jù)結構是 Module 唉地,它是?個抽象概念,既可以表示神經(jīng)?絡中的某個層(layer)传透, 也可以表示?個包含很多層的神經(jīng)?絡耘沼。在實際使?中,最常?見的做法是繼承 nn.Module 朱盐,撰寫?? 的?絡/層群嗤。?個 nn.Module 實例應該包含?些層以及返回輸出的前向傳播(forward)?法。下?先 來看看如何? nn.Module 實現(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可以打印出?絡的結構
可以? nn.Sequential 來更加?便地搭建?絡, Sequential是?個有序的容器钱烟,?絡層將按照在傳? 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()來查看模型所有的可學習參數(shù),此函數(shù)將返回?個?成器逝她。
for param in net.par
????print(param)
注意: torch.nn 僅?持輸??個batch的樣本不?持單個樣本輸?, 如果只有單個樣本, 可使 ? input.unsqueeze(0) 來添加?維徽惋。
4.初始化
使? net 前踢京,我們需要初始化模型參數(shù),如線性回歸模型中的權重和偏差。PyTorch在 init 模塊中 提供了多種參數(shù)初始化?法逻杖。這?的 init 是 initializer 的縮寫形式滨攻。我們通過 init.normal_ 將權重參數(shù)每個元素初始化為隨機采樣于均值為0、標準差為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)化算法
?須??實現(xiàn)?批量隨機梯度下降算法。 torch.optim 模塊提供了很多常?的優(yōu)化算法 ?如SGD、Adam和RMSProp等。下?我們創(chuàng)建?個?于優(yōu)化 net 所有參數(shù)的優(yōu)化器實例,并指定學 習率為0.03的?批量隨機梯度下降(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.訓練
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()))