1. 程式人生 > 資訊 >諮詢機構 FS:2020 年華為模組化 UPS 全球份額 41.9% 排名第一

諮詢機構 FS:2020 年華為模組化 UPS 全球份額 41.9% 排名第一

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