諮詢機構 FS:2020 年華為模組化 UPS 全球份額 41.9% 排名第一
阿新 • • 發佈:2021-10-16
1 匯入實驗所需要的包
import numpy as np
import torch
from torch import nn
from torch.utils import data
import matplotlib.pyplot as plt
#解決核心掛掉
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
2 生成資料集
將根據帶有噪聲的線性模型構造一個人造資料集。任務是使用這個有限樣本的資料集來恢復這個模型的引數。這裡使用低維資料,這樣可以很容易地將其視覺化。
在下面的程式碼中, 將生成一個包含 1000 個樣本的資料集,每個樣本包含從標準正態分佈中取樣的 2 個特徵。合成數據集是一個矩陣 $\mathbf{X} \in \mathbb{R}^{1000 \times 2} $ 。
使用線性模型引數 $ \mathbf{w}=[2,-3.4]^{\top}$ 、 $b=4.2$ 和噪聲項 $\epsilon$ 生成資料集及其標籤:
$\mathbf{y}=\mathbf{X} \mathbf{w}+b+\epsilon$
可以將 $\epsilon$ 視為捕獲特徵和標籤時的潛在觀測誤差。在這裡認為標準假設成立,即 $\epsilon $ 服從均值為 $0$ 的正態分佈。為了簡化問題, 我們將標準差設 為 $0.01 $ 。下面的程式碼生成合成資料集。
def get_random_data(w,b,num_example):
X = torch.normal(0,1,(num_example,len(w)))
#X = torch.normal(0,1,(num_example,2))
Y = torch.matmul(X,w)+b #矩陣乘法,要求稍微低一點
Y += torch.normal(0,0.01,Y.shape)
return X,Y.reshape(-1,1)
true_w = torch.tensor([2,-3.4])
true_b = 4.2
features ,labels = get_random_data(true_w,true_b,1000)
3 視覺化初始資料
plt.rcParams['figure.figsize']=(12,4)
plt.subplot( 1,2,1)
plt.scatter(features[:,0],labels,s=2)
plt.subplot(1,2,2)
plt.scatter(features[:,1],labels,s=2)
4讀取資料集
def load_array(data_arrays, batch_size, is_train=True):
"""構造一個PyTorch資料迭代器。"""
dataset = data.TensorDataset(*data_arrays)
return data.DataLoader(dataset, batch_size, shuffle=is_train)
batch_size = 10
data_iter = load_array((features, labels), batch_size)
# next(iter(data_iter))
5 定義模型
#定義模型方法一:
# net = nn.Sequential(nn.Linear(2, 1))
# print(net[0])
#定義模型方法二:
# from collections import OrderedDict
# net = nn.Sequential(OrderedDict([('mylinear',nn.Linear(2, 1))]))
# print(net[0])
#定義模型方法三:
net = nn.Sequential()
net.add_module('mylinear',nn.Linear(2, 1))
print(net[0].weight)
print(net[0].bias)
print(net[0].weight.grad)
print("net[0] = ",net[0])
for index,param in enumerate(net.state_dict()):
print("index = ",index)
print("param = ",param)
print("param_value = ",net.state_dict()[param])
print('----------------')
Parameter containing:
tensor([[-0.6449, -0.3191]], requires_grad=True)
Parameter containing:
tensor([0.1766], requires_grad=True)
None
net[0] = Linear(in_features=2, out_features=1, bias=True)
index = 0
param = mylinear.weight
param_value = tensor([[-0.6449, -0.3191]])
----------------
index = 1
param = mylinear.bias
param_value = tensor([0.1766])
----------------
6初始化模型引數
正如我們在構造 nn.Linear 時指定輸入和輸出尺寸一樣。
現在我們直接訪問引數以設定初始值。我們通過 net[0] 選擇網路中的第一個圖層,然後使用 weight.data 和 bias.data 方法訪問引數。然後使用替換方法 normal_ 和 fill_ 來重寫引數值。
from torch.nn import init
init.normal_(net[0].weight,mean=0,std=0.01)
init.constant_(net[0].bias,val = 0)
print(net[0].weight)
print(net[0].bias)
print(net[0].weight.grad)
Parameter containing:
tensor([[-0.0027, -0.0086]], requires_grad=True)
Parameter containing:
tensor([0.], requires_grad=True)
None
7 定義損失函式
loss = nn.MSELoss()
8定義優化演算法
optimizer = torch.optim.SGD(net.parameters(), lr=0.03)
9 訓練
num_epochs = 3
for epoch in range(num_epochs):
for X, y in data_iter:
l = loss(net(X) ,y)
optimizer.zero_grad()
l.backward()
optimizer.step()
l = loss(net(features), labels)
print(f'epoch {epoch + 1}, loss {l:f}')
epoch 1, loss 0.000228
epoch 2, loss 0.000102
epoch 3, loss 0.000103
因上求緣,果上努力~~~~ 作者:希望每天漲粉,轉載請註明原文連結:https://www.cnblogs.com/BlairGrowing/p/15428515.html