Pytorch 復習總結 4

Pytorch 復習總結,僅供筆者使用,參考教材:

  • 《動手學深度學習》
  • Stanford University: Practical Machine Learning

本文主要內容為:Pytorch 深度學習計算。

本文先介紹了深度學習中自定義層和塊的方法,然后介紹了一些有關參數的管理和讀寫方法,最后介紹了 GPU 的使用方法。


Pytorch 語法匯總:

  • Pytorch 張量的常見運算、線性代數、高等數學、概率論 部分 見 Pytorch 復習總結1;
  • Pytorch 線性神經網絡 部分 見 Pytorch 復習總結2;
  • Pytorch 多層感知機 部分 見 Pytorch 復習總結3;
  • Pytorch 深度學習計算 部分 見 Pytorch 復習總結4;
  • Pytorch 卷積神經網絡 部分 見 Pytorch 復習總結5;
  • Pytorch 現代卷積神經網絡 部分 見 Pytorch 復習總結6;

目錄

  • 一. 自定義塊
    • 1. 順序塊
    • 2. 自定義前向傳播
    • 3. 嵌套塊
  • 二. 自定義層
    • 1. 無參數層
    • 2. 有參數層
  • 三. 參數管理
    • 1. 參數訪問
    • 2. 參數初始化
    • 3. 延后初始化
  • 四. 文件讀寫
    • 1. 加載和保存張量
    • 2. 加載和保存模型參數
  • 五. GPU 計算

層是神經網絡的基本組成單元,如全連接層、卷積層、池化層等。塊是由層組成的更大的功能單元,用于構建復雜的神經網絡結構。塊可以是一系列相互關聯的層,形成一個功能完整的單元,也可以是一組層的重復模式,用于實現重復的結構。下圖就是多個層組合成塊形成的更大模型:
在這里插入圖片描述

在實際應用中,經常會需要自定義層和塊。

一. 自定義塊

1. 順序塊

nn.Sequential 本質上就是一個順序塊,通過在塊中實例化層來創建神經網絡。 nn.Module 是 PyTorch 中用于構建神經網絡模型的基類,nn.Sequential 和各種層都是繼承自 Module,nn.Sequential 維護一個由多個層組成的有序列表,列表中的每個層連接在一起,將每個層的輸出作為下一個層的輸入。

如果想要自定義一個順序塊,必須要定義以下兩個關鍵函數:

  1. 構造函數:將每個層按順序逐個加入列表;
  2. 前向傳播函數:將每一層按順序傳遞給下一層;
import torch
from torch import nnclass MySequential(nn.Module):def __init__(self, *args):super().__init__()for idx, module in enumerate(args):self._modules[str(idx)] = moduledef forward(self, X):# self._modules的類型是OrderedDictfor block in self._modules.values():X = block(X)return Xnet = MySequential(nn.Linear(20, 256),nn.ReLU(),nn.Linear(256, 10)
)X = torch.rand(2, 20)
output = net(X)

上述示例代碼中,定義 net 時會自動調用 __init__(self, *args) 函數,實例化 MySequential 對象;調用 net(X) 相當于 net.__call__(X),會自動調用模型類中定義的 forward() 函數,進行前向傳播,每一層的傳播本質上就是調用 block(X) 的過程。

2. 自定義前向傳播

nn.Sequential 類將前向傳播過程封裝成函數,用戶可以自由使用但沒法修改傳播細節。如果想要自定義前向傳播過程中的細節,就需要自定義順序塊及 forward 函數,而不能僅僅依賴預定義的框架。

例如,需要一個計算函數 f ( x , w ) = c ? w T x f(\bold x,\bold w)=c \cdot \bold w ^T \bold x f(x,w)=c?wTx 的層,并且在傳播過程中引入控制流。其中 x \bold x x 是輸入, w \bold w w 是參數, c c c 是優化過程中不需要更新的指定常量。為此,定義 FixedHiddenMLP 類如下:

import torch
from torch import nn
from torch.nn import functional as Fclass FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()self.rand_weight = torch.rand((20, 20), requires_grad=False)    # 優化過程中不需要更新的指定常量self.linear = nn.Linear(20, 20)def forward(self, X):X = self.linear(X)X = F.relu(torch.mm(X, self.rand_weight) + 1)X = self.linear(X)          # 兩個全連接層共享參數while X.abs().sum() > 1:    # 控制流X /= 2return X

3. 嵌套塊

多個層可以組合成塊,多個塊還可以嵌套形成更大的模型:

import torch
from torch import nn
from torch.nn import functional as Fclass FixedHiddenMLP(nn.Module):def __init__(self):super().__init__()self.rand_weight = torch.rand((20, 20), requires_grad=False)    # 優化過程中不需要更新的指定常量self.linear = nn.Linear(20, 20)def forward(self, X):X = self.linear(X)X = F.relu(torch.mm(X, self.rand_weight) + 1)X = self.linear(X)          # 兩個全連接層共享參數while X.abs().sum() > 1:    # 控制流X /= 2return X.sum()class NestMLP(nn.Module):def __init__(self):super().__init__()self.net = nn.Sequential(nn.Linear(20, 64), nn.ReLU(),nn.Linear(64, 32), nn.ReLU())self.linear = nn.Linear(32, 16)def forward(self, X):return self.linear(self.net(X))net = nn.Sequential(NestMLP(), nn.Linear(16, 20), FixedHiddenMLP()
)X = torch.rand(2, 20)
output = net(X)

二. 自定義層

和自定義塊一樣,自定義層也需要實現構造函數和前向傳播函數。

1. 無參數層

import torch
from torch import nnclass CenteredLayer(nn.Module):def __init__(self):super().__init__()def forward(self, X):return X - X.mean()net = nn.Sequential(nn.Linear(8, 128), CenteredLayer())
X = torch.rand(4, 8)
output = net(X)
print(output.mean())	# tensor(0., grad_fn=<MeanBackward0>)

2. 有參數層

import torch
from torch import nn
import torch.nn.functional as Fclass MyLinear(nn.Module):def __init__(self, in_units, out_units):super().__init__()self.weight = nn.Parameter(torch.randn(in_units, out_units))self.bias = nn.Parameter(torch.randn(out_units,))def forward(self, X):linear = torch.matmul(X, self.weight.data) + self.bias.datareturn F.relu(linear)net = nn.Sequential(MyLinear(64, 8), MyLinear(8, 1)
)
X = torch.rand(2, 64)
output = net(X)
print(output)       # tensor([[11.9497], [13.9729]])

三. 參數管理

在實驗過程中,有時需要提取參數,以便檢查或在其他環境中復用。本節將介紹參數的訪問方法和參數的初始化。

1. 參數訪問

  • net.state_dict() / net[i].state_dict():返回模型或某一層參數的狀態字典;
  • net[i].weight.data / net[i].bias.data:返回某一層的權重 / 偏置參數;
  • net[i].weight.grad:返回某一層的權重參數的梯度屬性。只有調用了 backward() 方法后才能訪問到梯度值,否則為 None;
import torch
from torch import nnnet = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
output = net(X)print(net.state_dict())
'''
OrderedDict([('0.weight', tensor([[ 0.2178, -0.3286,  0.4875, -0.0347],[-0.0415,  0.0009, -0.2038, -0.1813],[-0.2766, -0.4759, -0.3134, -0.2782],[ 0.4854,  0.0606,  0.1070,  0.0650],[-0.3908,  0.2412, -0.1348,  0.3921],[-0.3044, -0.0331, -0.1213, -0.1690],[-0.3875, -0.0117,  0.3195, -0.1748],[ 0.1840, -0.3502,  0.4253,  0.2789]])), ('0.bias', tensor([-0.2327, -0.0745,  0.4923, -0.1018,  0.0685,  0.4423, -0.2979,  0.1109])), ('2.weight', tensor([[ 0.1006,  0.2959, -0.1316, -0.2015,  0.2446, -0.0158,  0.2217, -0.2780]])), ('2.bias', tensor([0.2362]))])
'''
print(net[2].state_dict())
'''
OrderedDict([('weight', tensor([[ 0.1006,  0.2959, -0.1316, -0.2015,  0.2446, -0.0158,  0.2217, -0.2780]])), ('bias', tensor([0.2362]))])
'''
print(net[2].bias)
'''
Parameter containing:
tensor([0.2362], requires_grad=True)
'''
print(net[2].bias.data)
'''
tensor([0.2362])
'''

如果想一次性訪問所有參數,可以使用 for 循環遞歸遍歷:

import torch
from torch import nnnet = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
output = net(X)print(*[(name, param.data) for name, param in net[0].named_parameters()])
'''
('weight', tensor([[-0.0273, -0.4942, -0.0880,  0.3169],[ 0.2205,  0.3344, -0.4425, -0.0882],[ 0.1726, -0.0007, -0.0256, -0.0593],[-0.3854, -0.0934, -0.4641,  0.1950],[ 0.2358, -0.4820, -0.2315,  0.1642],[-0.2645,  0.2021,  0.3167, -0.0042],[ 0.1714, -0.2201, -0.3326, -0.2908],[-0.3196,  0.0584, -0.1059,  0.0256]])) ('bias', tensor([ 0.3285,  0.4167, -0.2343,  0.3099,  0.1576, -0.0397, -0.2190, -0.3854]))
'''
print(*[(name, param.shape) for name, param in net.named_parameters()])
'''
('0.weight', torch.Size([8, 4])) ('0.bias', torch.Size([8])) ('2.weight', torch.Size([1, 8])) ('2.bias', torch.Size([1]))
'''

如果網絡是由多個塊相互嵌套的,可以按塊索引后再訪問參數:

import torch
from torch import nndef block1():return nn.Sequential(nn.Linear(4, 8), nn.ReLU(),nn.Linear(8, 4), nn.ReLU())def block2():net = nn.Sequential()for i in range(4):net.add_module(f'block {i}', block1())return netnet = nn.Sequential(block2(), nn.Linear(4, 1))
X = torch.rand(size=(2, 4))
output = net(X)print(net)
'''
Sequential((0): Sequential((block 0): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 1): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 2): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU())(block 3): Sequential((0): Linear(in_features=4, out_features=8, bias=True)(1): ReLU()(2): Linear(in_features=8, out_features=4, bias=True)(3): ReLU()))(1): Linear(in_features=4, out_features=1, bias=True)
)
'''
print(net[0][1][0].bias.data)
'''
tensor([-0.0083,  0.2490,  0.1794,  0.1927,  0.1797,  0.1156,  0.4409,  0.1320])
'''

2. 參數初始化

PyTorch 的 nn.init 模塊提供了多種初始化方法:

  • nn.init.constant_(layer.weight, c):將權重參數初始化為指定的常量值;
  • nn.init.zeros_(layer.weight):將權重參數初始化為 0;
  • nn.init.ones_(layer.weight):將權重參數初始化為 1;
  • nn.init.uniform_(layer.weight, a, b):將權重參數按均勻分布初始化;
  • nn.init.xavier_uniform_(layer.weight)
  • nn.init.normal_(layer.weight, mean, std):將權重參數按正態分布初始化;
  • nn.init.orthogonal_(layer.weight):將權重參數初始化為正交矩陣;
  • nn.init.sparse_(layer.weight, sparsity, std):將權重參數初始化為稀疏矩陣;

初始化時,可以直接 net.apply(init_method) 初始化整個網絡,也可以 net[i].apply(init_method) 初始化某一層:

import torch
from torch import nndef init_normal(m):if type(m) == nn.Linear:nn.init.normal_(m.weight, mean=0, std=0.01)nn.init.zeros_(m.bias)def init_constant(m):if type(m) == nn.Linear:nn.init.constant_(m.weight, 1)nn.init.zeros_(m.bias)net = nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1))
X = torch.rand(size=(2, 4))
output = net(X)# net.apply(init_normal)
net[0].apply(init_normal)
net[2].apply(init_constant)

3. 延后初始化

有些情況下,無法提前判斷網絡的輸入維度。為了代碼能夠繼續運行,需要使用延后初始化,即直到數據第一次通過模型傳遞時,框架才會動態地推斷出每個層的大小。由于 PyTorch 的延后初始化功能還處于開發階段,API 和功能隨時可能變化,下面只給出簡單示例:

import torch
from torch import nnnet = nn.Sequential(nn.LazyLinear(256), nn.ReLU(), nn.LazyLinear(10))print(net)
'''
Sequential((0): LazyLinear(in_features=0, out_features=256, bias=True)(1): ReLU()(2): LazyLinear(in_features=0, out_features=10, bias=True)
)
'''X = torch.rand(2, 20)
net(X)
print(net)
'''
Sequential((0): Linear(in_features=20, out_features=256, bias=True)(1): ReLU()(2): Linear(in_features=256, out_features=10, bias=True)
)
'''

四. 文件讀寫

可以使用 torch.load(file)torch.save(x, file) 函數讀寫張量和模型參數。

1. 加載和保存張量

只要保證讀寫格式一致即可:

import torch
from torch import nn
from torch.nn import functional as Fx = torch.arange(4)
y = torch.zeros(4)
torch.save([x, y],'xy.pth')x2, y2 = torch.load('xy.pth')
print(x2, y2)       # tensor([0, 1, 2, 3]) tensor([0., 0., 0., 0.])

保存張量的文件格式沒有要求,甚至可以沒有后綴名。因為 torch.save(x, file) 函數本質上是使用 Python 的 pickle 模塊來序列化對象并將其保存到文件中的,pickle 模塊負責將 Python 對象轉換為字節流,而文件的擴展名本身并不影響 pickle 模塊的工作。

2. 加載和保存模型參數

因為模型一般是自定義的類,所以加載模型前要先實例化一個相同類別的變量,再將模型參數加載到該變量中:

import torch
from torch import nn
from torch.nn import functional as Fclass MLP(nn.Module):def __init__(self):super().__init__()self.hidden = nn.Linear(4, 2)self.output = nn.Linear(2, 3)def forward(self, x):return self.output(F.relu(self.hidden(x)))net = MLP()
X = torch.randn(size=(2, 4))
Y = net(X)
print(net.state_dict())
'''
OrderedDict([('hidden.weight', tensor([[-0.0154, -0.3586, -0.3653, -0.2950],[ 0.2591, -0.2563,  0.3833,  0.1449]])), ('hidden.bias', tensor([0.1884, 0.3998])), ('output.weight', tensor([[-0.4805,  0.4077],[-0.0933,  0.0584],[ 0.3114,  0.6285]])), ('output.bias', tensor([-0.2552, -0.6520,  0.3290]))])
'''torch.save(net.state_dict(), 'mlp.pth')net2 = MLP()
net2.load_state_dict(torch.load('mlp.pth'))
print(net2.state_dict())
'''
OrderedDict([('hidden.weight', tensor([[-0.0154, -0.3586, -0.3653, -0.2950],[ 0.2591, -0.2563,  0.3833,  0.1449]])), ('hidden.bias', tensor([0.1884, 0.3998])), ('output.weight', tensor([[-0.4805,  0.4077],[-0.0933,  0.0584],[ 0.3114,  0.6285]])), ('output.bias', tensor([-0.2552, -0.6520,  0.3290]))])
'''

也可以只保存單層參數:

import torch
from torch import nn
from torch.nn import functional as Fclass MLP(nn.Module):def __init__(self):super().__init__()self.hidden = nn.Linear(4, 2)self.output = nn.Linear(2, 3)def forward(self, x):return self.output(F.relu(self.hidden(x)))net = MLP()
X = torch.randn(size=(2, 4))
Y = net(X)
print(net.state_dict())
'''
OrderedDict([('hidden.weight', tensor([[-0.2937,  0.1589,  0.2349,  0.1130],[ 0.4170,  0.2699,  0.3760,  0.0201]])), ('hidden.bias', tensor([ 0.3914, -0.1185])), ('output.weight', tensor([[0.0884, 0.2572],[0.1547, 0.0164],[0.3386, 0.5151]])), ('output.bias', tensor([-0.5032, -0.2515, -0.4531]))])
'''torch.save(net.hidden.state_dict(), 'mlp.pth')net2 = MLP()
net2.hidden.load_state_dict(torch.load('mlp.pth'))
print(net2.state_dict())
'''
OrderedDict([('hidden.weight', tensor([[-0.2937,  0.1589,  0.2349,  0.1130],[ 0.4170,  0.2699,  0.3760,  0.0201]])), ('hidden.bias', tensor([ 0.3914, -0.1185])), ('output.weight', tensor([[ 0.2318,  0.3837],[ 0.2380,  0.6463],[-0.6014,  0.3717]])), ('output.bias', tensor([-0.3154, -0.0078, -0.2676]))])
'''

五. GPU 計算

在 PyTorch 中,CPU 和 GPU 分別可以用 torch.device('cpu')torch.device('cuda') 表示。如果有多個 GPU,可以使用 torch.device(fcuda:i') 來表示,cuda:0cuda 等價。可以查詢所有可用 GPU 也可以指定 GPU:

import torchdef try_gpu(i=0):if torch.cuda.device_count() >= i + 1:return torch.device(f'cuda:{i}')return torch.device('cpu')def try_all_gpus():devices = [torch.device(f'cuda:{i}')for i in range(torch.cuda.device_count())]return devices if devices else [torch.device('cpu')]device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

張量和網絡模型都可以通過 .cuda(device) 函數移動到 GPU 上:

import torch
from torch import nnnet = nn.Sequential(nn.Linear(2, 64),nn.ReLU(),nn.Linear(64, 32)
)
X = torch.randn(size=(4, 2))
loss = nn.MSELoss()device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')net.cuda(device=device)
X.cuda(device=device)
loss.cuda(device=device)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711548.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711548.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711548.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Beego 1.12.3的簡單website實現

參考 用Beego開發web應用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官網 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源碼的角度分析Vue2數據雙向綁定原理

什么是雙向綁定 我們先從單向綁定切入&#xff0c;其實單向綁定非常簡單&#xff0c;就是把Model綁定到View&#xff0c;當我們用JavaScript代碼更新Model時&#xff0c;View就會自動更新。那么雙向綁定就可以從此聯想到&#xff0c;即在單向綁定的基礎上&#xff0c;用戶更新…

微信開發者工具-代碼管理和碼云Github遠程倉庫集成

目錄 思考&#xff1a;IDE如何進行代碼管理 代碼管理方式 一、自身提供服務 二、Git 擴展 1、環境準備 2、創建項目代碼 3、進行項目Git初始化 4、在碼云新建遠程倉庫 5、將項目進行遠程倉庫關聯 三、SVN擴展 四、代碼管理 思考&#xff1a;IDE如何進行代碼管理 初識開…

服務器部署測試環境回顧與改進建議

任務概述&#xff1a; 原計劃在2小時內完成的任務&#xff0c;由于遇到一系列挑戰&#xff0c;最終耗時1.5天。任務目標是在無外網環境的服務器上建立測試環境&#xff0c;涉及將SSD硬盤數據遷移至服務器、SSH連接、運行測試程序并監控服務器功耗。 高效實施策略&#xff1a;…

fs讀取目錄、文件

fs讀取文件 process.cwd() 是 Node.js 中的一個方法&#xff0c;它返回 Node.js 進程的當前工作目錄。這個工作目錄通常是啟動 Node.js 進程時所在的目錄。 const fs require(fs); const path require(path);// 讀取指定目錄 const configPath path.join(process.cwd(), c…

StarRocks實戰——貝殼找房數倉實踐

目錄 前言 一、StarRocks在貝殼的應用現狀 1.1 歷史的數據分析架構 1.2 OLAP選型 1.2.1 離線場景 1.2.2 實時場景 1.2.3 StarRocks 的引入 二、StarRocks 在貝殼的分析實踐 2.1 指標分析 2.2 實時業務 2.3 可視化分析 三、未來規劃 3.1 StarRocks集群的穩定性 3…

PMP考試培訓費用多少錢?

PMP考試的相關費用包括報名費用、培訓費用和證書續證費用三個部分。 一、PMP考試報名費用&#xff1a; 首次報考費用為3900元&#xff0c;如果未通過考試可以在英文報名有效期內進行補考報名&#xff0c;補考費用為2500元。 付費方式是在項目管理學會官方網站上提交報考資料…

企業數字化轉型的第一步:由被動多云向主動多云轉變

隨著經濟環境、市場形勢、技術發展、用戶需求等諸多因素的變化&#xff0c;數字化轉型為企業進一步提升效率和競爭力、提供更加豐富的個性化產品和服務、進行業務場景創新、探尋新的增長機會和運營模式提供了嶄新的途徑。越來越多的企業意識到&#xff0c;數字化轉型已不是企業…

第1篇 Linux Docker安裝rabbitmq

Docker安裝RabbitMq 1、搜索rabbitmq鏡像 docker search rabbitmq2、下載rabbitmq鏡像 docker pull rabbitmq3、運行rabbitmq服務 docker run -d --name rabbitmq --restart always -p 15672:15672 -p 5672:5672 rabbitmq4、訪問rabbitmq http://192.168.1.x:15672 5、rab…

亞信安慧AntDB:打破數據孤島,實現實時處理

AntDB數據庫以其獨特的創新能力在分布式數據庫領域引領潮流。其中&#xff0c;融合統一與實時處理是其兩大核心創新能力&#xff0c;為其贏得廣泛關注與贊譽。融合統一意味著AntDB能夠將多種不同類型的數據庫融合為一體&#xff0c;實現數據的統一管理與處理&#xff0c;極大地…

電視盒子什么品牌好?資深數碼粉強推口碑電視盒子推薦

我對各類數碼產品是非常熟悉的&#xff0c;尤其是電視盒子&#xff0c;用過超十五款了&#xff0c;涵蓋了各個主流品牌&#xff0c;最近看到很多朋友在討論不知道電視盒子什么品牌好&#xff0c;我這次要來分享的就是口碑最好的五款電視盒子推薦給各位不懂如何選電視盒子的新手…

AI、AIGC、AGI、ChatGPT它們的區別?

今天咱們聊點熱門話題&#xff0c;來點科普時間——AI、AIGC、AGI和ChatGPT到底是啥&#xff1f;這幾個詞聽起來好像挺神秘的&#xff0c;但其實它們就在我們生活中。讓我們一起探索這些術語的奧秘&#xff01; AI&#xff08;人工智能&#xff09;&#xff1a;先說說AI&#…

數倉技術選型特點

高性能&#xff1a;用全并行的MPP架構數據庫&#xff0c;業務數據被分散存儲在多個節點上&#xff0c;數據分析任務被推送到數據所在位置就近執行&#xff0c;并行地完成大規模的數據處理工作&#xff0c;實現對數據處理的快速響應。 易擴展&#xff1a;Shared-Nothing開放架構…

電梯物聯網之梯控相機方案-防止電瓶車進電梯

梯控現狀 隨著電梯產品在智能化建筑的日益普及,對于電梯的智能化管理 安全性需求 的要求越來越迫切。尤其今年來隨著電瓶車的大量普及&#xff0c;發起多起樓道、轎廂電瓶車著火惡性事件&#xff0c; 造成了極大的社會 負面影響。控制電瓶車進入單元門&#xff0c;樓道以及電梯…

Vue官網“食用指南”

把Vue官網當做一個工具來用&#xff0c;有問題&#xff0c;先來官網查一查。 官網中常用的板塊 官網&#xff1a;https://cn.vuejs.org/上手后&#xff0c;最常用的模塊是【快速上手】【API】。所以務必要知道這兩個模塊在哪里&#xff0c;怎么使用。![image.png](https://img…

/proc/cpuinfo文件內容詳解

/proc/cpuinfo 文件包含了有關系統 CPU 的信息&#xff0c;每一行代表一個屬性及其對應的值。以下是一些常見的屬性及其含義&#xff1a; 1. processor&#xff1a;表示 CPU 的物理編號&#xff0c;通常從 0 開始遞增。 2. vendor_id&#xff1a;CPU 廠商的名稱&#xff0c;如…

藍橋杯 砝碼稱重 dp/dfs

題目鏈接&#xff1a; https://www.lanqiao.cn/problems/1447/learning/?subject_code1&group_code4&match_num12&match_flow1&origincup 思想&#xff1a;dfs暴力枚舉過一半的分 代碼&#xff1a; #include<bits/stdc.h> using namespace std;#def…

快速開發一個鴻蒙的頁面

文章目錄 前言常用組件快速開啟簡單的鴻蒙頁面總結 一、前言 鴻蒙要想快速上手&#xff0c;那么就需要對基礎的組件使用比較熟悉&#xff0c;這里就羅列開發中常見的基礎組件的使用。 只要是寫android的&#xff0c;對于這些組件的使用還是能很快上手的&#xff0c;只要多多…

01-prometheus監控系統-安裝部署prometheus

一、準備環境 主機名ip配置prometheus-server3110.0.0.311核1g-20GBprometheus-server3210.0.0.311核1g-20GBprometheus-server3310.0.0.311核1g-20GB 二、下載/上傳軟件包 1&#xff0c;軟件包地址 這里給大家準備了百度云盤的安裝包&#xff1b; 鏈接&#xff1a;https:/…

FRM模型十二:極值理論

目錄 極值理論介紹GEVPOT 代碼實現 極值理論介紹 在風險管理中&#xff0c;將事件分為高頻高損、高頻低損、低頻高損、低頻低損。其中低頻高損是一種非常棘手的損失事件&#xff0c;常出現在市場大跌、金融體系崩潰、金融危機以及自然災害等事件中。 由于很難給極端事件一個準…