昇思25天學習打卡營第2天|初學入門

昇思25天學習打卡營第2天


文章目錄

  • 昇思25天學習打卡營第2天
  • 網絡構建
    • 定義模型類
    • 模型層
      • nn.Flatten
      • nn.Dense
      • nn.ReLU
      • nn.SequentialCell
      • nn.Softmax
    • 模型參數
  • 函數式自動微分
    • 函數與計算圖
    • 微分函數與梯度計算
    • Stop Gradient
    • Auxiliary data
    • 神經網絡梯度計算
  • 問題集合
  • 打卡記錄


網絡構建

神經網絡模型是由神經網絡層和Tensor操作構成的,mindspore.nn提供了常見神經網絡層的實現,在MindSpore中,Cell類是構建所有網絡的基類,也是網絡的基本單元。一個神經網絡模型表示為一個Cell,它由不同的子Cell構成。使用這樣的嵌套結構,可以簡單地使用面向對象編程的思維,對神經網絡結構進行構建和管理。

下面我們將構建一個用于Mnist數據集分類的神經網絡模型。

%%capture captured_output
# 實驗環境已經預裝了mindspore==2.2.14,如需更換mindspore版本,可更改下面mindspore的版本號
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
import mindspore
from mindspore import nn, ops

定義模型類

當我們定義神經網絡時,可以繼承nn.Cell類,在__init__方法中進行子Cell的實例化和狀態管理,在construct方法中實現Tensor操作。

construct意為神經網絡(計算圖)構建,相關內容詳見使用靜態圖加速。

class Network(nn.Cell):def __init__(self):super().__init__()self.flatten = nn.Flatten()self.dense_relu_sequential = nn.SequentialCell(nn.Dense(28*28, 512, weight_init="normal", bias_init="zeros"),nn.ReLU(),nn.Dense(512, 512, weight_init="normal", bias_init="zeros"),nn.ReLU(),nn.Dense(512, 10, weight_init="normal", bias_init="zeros"))def construct(self, x):x = self.flatten(x)logits = self.dense_relu_sequential(x)return logits

構建完成后,實例化Network對象,并查看其結構。

model = Network()
print(model)結果輸出:
Network<(flatten): Flatten<>(dense_relu_sequential): SequentialCell<(0): Dense<input_channels=784, output_channels=512, has_bias=True>(1): ReLU<>(2): Dense<input_channels=512, output_channels=512, has_bias=True>(3): ReLU<>(4): Dense<input_channels=512, output_channels=10, has_bias=True>>>

我們構造一個輸入數據,直接調用模型,可以獲得一個十維的Tensor輸出,其包含每個類別的原始預測值。

model.construct()方法不可直接調用。

X = ops.ones((1, 28, 28), mindspore.float32)
logits = model(X)
# print logits
logits結果輸出:
Tensor(shape=[1, 10], dtype=Float32, value=
[[-4.94648516e-03,  6.39686594e-04,  3.57396412e-03 ... -4.10500448e-03, -7.01633748e-03,  6.29030075e-03]])

在此基礎上,我們通過一個nn.Softmax層實例來獲得預測概率。

pred_probab = nn.Softmax(axis=1)(logits)
y_pred = pred_probab.argmax(1)
print(f"Predicted class: {y_pred}")結果輸出:
Predicted class: [5]

模型層

本節中我們分解上節構造的神經網絡模型中的每一層。首先我們構造一個shape為(3, 28, 28)的隨機數據(3個28x28的圖像),依次通過每一個神經網絡層來觀察其效果。

input_image = ops.ones((3, 28, 28), mindspore.float32)
print(input_image.shape)結果輸出:
(3, 28, 28)

nn.Flatten

實例化nn.Flatten層,將28x28的2D張量轉換為784大小的連續數組。

flatten = nn.Flatten()
flat_image = flatten(input_image)
print(flat_image.shape)結果輸出:
(3, 784)

nn.Dense

nn.Dense為全連接層,其使用權重和偏差對輸入進行線性變換。

layer1 = nn.Dense(in_channels=28*28, out_channels=20)
hidden1 = layer1(flat_image)
print(hidden1.shape)結果輸出:
(3, 20)

nn.ReLU

nn.ReLU層給網絡中加入非線性的激活函數,幫助神經網絡學習各種復雜的特征。

print(f"Before ReLU: {hidden1}\n\n")
hidden1 = nn.ReLU()(hidden1)
print(f"After ReLU: {hidden1}")結果輸出:
Before ReLU: [[-0.37948617 -0.8374544  -0.22633247 -0.64436615 -0.2843644   0.11379201-0.3698791   0.04172596  0.96715826  0.43453223 -0.5601988  -0.360088830.01049499  0.01675031  0.20502056 -1.1604757   1.7001557  -0.02686205-0.7600101   1.0095801 ][-0.37948617 -0.8374544  -0.22633247 -0.64436615 -0.2843644   0.11379201-0.3698791   0.04172596  0.96715826  0.43453223 -0.5601988  -0.360088830.01049499  0.01675031  0.20502056 -1.1604757   1.7001557  -0.02686205-0.7600101   1.0095801 ][-0.37948617 -0.8374544  -0.22633247 -0.64436615 -0.2843644   0.11379201-0.3698791   0.04172596  0.96715826  0.43453223 -0.5601988  -0.360088830.01049499  0.01675031  0.20502056 -1.1604757   1.7001557  -0.02686205-0.7600101   1.0095801 ]]After ReLU: [[0.         0.         0.         0.         0.         0.113792010.         0.04172596 0.96715826 0.43453223 0.         0.0.01049499 0.01675031 0.20502056 0.         1.7001557  0.0.         1.0095801 ][0.         0.         0.         0.         0.         0.113792010.         0.04172596 0.96715826 0.43453223 0.         0.0.01049499 0.01675031 0.20502056 0.         1.7001557  0.0.         1.0095801 ][0.         0.         0.         0.         0.         0.113792010.         0.04172596 0.96715826 0.43453223 0.         0.0.01049499 0.01675031 0.20502056 0.         1.7001557  0.0.         1.0095801 ]]

nn.SequentialCell

nn.SequentialCell是一個有序的Cell容器。輸入Tensor將按照定義的順序通過所有Cell。我們可以使用SequentialCell來快速組合構造一個神經網絡模型。

seq_modules = nn.SequentialCell(flatten,layer1,nn.ReLU(),nn.Dense(20, 10)
)logits = seq_modules(input_image)
print(logits.shape)結果輸出:
(3, 10)

nn.Softmax

最后使用nn.Softmax將神經網絡最后一個全連接層返回的logits的值縮放為[0, 1],表示每個類別的預測概率。axis指定的維度數值和為1。

softmax = nn.Softmax(axis=1)
pred_probab = softmax(logits)

模型參數

網絡內部神經網絡層具有權重參數和偏置參數(如nn.Dense),這些參數會在訓練過程中不斷進行優化,可通過 model.parameters_and_names() 來獲取參數名及對應的參數詳情。

print(f"Model structure: {model}\n\n")for name, param in model.parameters_and_names():print(f"Layer: {name}\nSize: {param.shape}\nValues : {param[:2]} \n")結果輸出:Model structure: Network<(flatten): Flatten<>(dense_relu_sequential): SequentialCell<(0): Dense<input_channels=784, output_channels=512, has_bias=True>(1): ReLU<>(2): Dense<input_channels=512, output_channels=512, has_bias=True>(3): ReLU<>(4): Dense<input_channels=512, output_channels=10, has_bias=True>>>Layer: dense_relu_sequential.0.weight
Size: (512, 784)
Values : [[-0.01491369  0.00353318 -0.00694948 ...  0.01226766 -0.000144230.00544263][ 0.00212971  0.0019974  -0.00624789 ... -0.01214037  0.00118004-0.01594325]] Layer: dense_relu_sequential.0.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.2.weight
Size: (512, 512)
Values : [[ 0.00565423  0.00354313  0.00637383 ... -0.00352688  0.002629490.01157355][-0.01284141  0.00657666 -0.01217057 ...  0.00318963  0.00319115-0.00186801]] Layer: dense_relu_sequential.2.bias
Size: (512,)
Values : [0. 0.] Layer: dense_relu_sequential.4.weight
Size: (10, 512)
Values : [[ 0.0087168  -0.00381866 -0.00865665 ... -0.00273731 -0.003916230.00612853][-0.00593031  0.0008721  -0.0060081  ... -0.00271535 -0.00850481-0.00820513]] Layer: dense_relu_sequential.4.bias
Size: (10,)
Values : [0. 0.]

更多內置神經網絡層詳見mindspore.nn API。

函數式自動微分

神經網絡的訓練主要使用反向傳播算法,模型預測值(logits)與正確標簽(label)送入損失函數(loss function)獲得loss,然后進行反向傳播計算,求得梯度(gradients),最終更新至模型參數(parameters)。自動微分能夠計算可導函數在某點處的導數值,是反向傳播算法的一般化。自動微分主要解決的問題是將一個復雜的數學運算分解為一系列簡單的基本運算,該功能對用戶屏蔽了大量的求導細節和過程,大大降低了框架的使用門檻。

MindSpore使用函數式自動微分的設計理念,提供更接近于數學語義的自動微分接口gradvalue_and_grad。下面我們使用一個簡單的單層線性變換模型進行介紹。

%%capture captured_output
# 實驗環境已經預裝了mindspore==2.2.14,如需更換mindspore版本,可更改下面mindspore的版本號
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
import numpy as np
import mindspore
from mindspore import nn
from mindspore import ops
from mindspore import Tensor, Parameter

函數與計算圖

計算圖是用圖論語言表示數學函數的一種方式,也是深度學習框架表達神經網絡模型的統一方法。我們將根據下面的計算圖構造計算函數和神經網絡。
compute-graph
在這個模型中,𝑥 為輸入,𝑦 為正確值,𝑤 和 𝑏 是我們需要優化的參數。

x = ops.ones(5, mindspore.float32)  # input tensor
y = ops.zeros(3, mindspore.float32)  # expected output
w = Parameter(Tensor(np.random.randn(5, 3), mindspore.float32), name='w') # weight
b = Parameter(Tensor(np.random.randn(3,), mindspore.float32), name='b') # bias

我們根據計算圖描述的計算過程,構造計算函數。
其中,binary_cross_entropy_with_logits 是一個損失函數,計算預測值和目標值之間的二值交叉熵損失。

def function(x, y, w, b):z = ops.matmul(x, w) + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))return loss

執行計算函數,可以獲得計算的loss值。

loss = function(x, y, w, b)
print(loss)結果輸出:
1.0899742

微分函數與梯度計算

為了優化模型參數,需要求參數對loss的導數: ? loss ? ? w \frac{\partial \operatorname{loss}}{\partial w} ?w?loss? ? loss ? ? b \frac{\partial \operatorname{loss}}{\partial b} ?b?loss?,此時我們調用mindspore.grad函數,來獲得function的微分函數。

這里使用了grad函數的兩個入參,分別為:

  • fn:待求導的函數。
  • grad_position:指定求導輸入位置的索引。

由于我們對 w w w b b b求導,因此配置其在function入參對應的位置(2, 3)

使用grad獲得微分函數是一種函數變換,即輸入為函數,輸出也為函數。

grad_fn = mindspore.grad(function, (2, 3))

執行微分函數,即可獲得 w w w b b b對應的梯度。

grads = grad_fn(x, y, w, b)
print(grads)結果輸出:
(Tensor(shape=[5, 3], dtype=Float32, value=
[[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]))

Stop Gradient

通常情況下,求導時會求loss對參數的導數,因此函數的輸出只有loss一項。當我們希望函數輸出多項時,微分函數會求所有輸出項對參數的導數。此時如果想實現對某個輸出項的梯度截斷,或消除某個Tensor對梯度的影響,需要用到Stop Gradient操作。

這里我們將function改為同時輸出loss和z的function_with_logits,獲得微分函數并執行。

def function_with_logits(x, y, w, b):z = ops.matmul(x, w) + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))return loss, z
grad_fn = mindspore.grad(function_with_logits, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)結果輸出:
(Tensor(shape=[5, 3], dtype=Float32, value=
[[ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00],[ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00],[ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00],[ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00],[ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00]]), Tensor(shape=[3], dtype=Float32, value= [ 1.13657820e+00,  1.29819274e+00,  1.12972713e+00]))

可以看到求得 w w w b b b對應的梯度值發生了變化。此時如果想要屏蔽掉z對梯度的影響,即仍只求參數對loss的導數,可以使用ops.stop_gradient接口,將梯度在此處截斷。我們將function實現加入stop_gradient,并執行。

def function_stop_gradient(x, y, w, b):z = ops.matmul(x, w) + bloss = ops.binary_cross_entropy_with_logits(z, y, ops.ones_like(z), ops.ones_like(z))return loss, ops.stop_gradient(z)
grad_fn = mindspore.grad(function_stop_gradient, (2, 3))
grads = grad_fn(x, y, w, b)
print(grads)結果輸出:
(Tensor(shape=[5, 3], dtype=Float32, value=
[[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]))

可以看到,求得 w w w b b b對應的梯度值與初始function求得的梯度值一致。

Auxiliary data

Auxiliary data意為輔助數據,是函數除第一個輸出項外的其他輸出。通常我們會將函數的loss設置為函數的第一個輸出,其他的輸出即為輔助數據。

gradvalue_and_grad提供has_aux參數,當其設置為True時,可以自動實現前文手動添加stop_gradient的功能,滿足返回輔助數據的同時不影響梯度計算的效果。

下面仍使用function_with_logits,配置has_aux=True,并執行。

grad_fn = mindspore.grad(function_with_logits, (2, 3), has_aux=True)
grads, (z,) = grad_fn(x, y, w, b)
print(grads, z)結果輸出:
(Tensor(shape=[5, 3], dtype=Float32, value=
[[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01])) [-0.3650626   2.1383815  -0.45075506]

可以看到,求得 w w w b b b對應的梯度值與初始function求得的梯度值一致,同時z能夠作為微分函數的輸出返回。

神經網絡梯度計算

前述章節主要根據計算圖對應的函數介紹了MindSpore的函數式自動微分,但我們的神經網絡構造是繼承自面向對象編程范式的nn.Cell。接下來我們通過Cell構造同樣的神經網絡,利用函數式自動微分來實現反向傳播。

首先我們繼承nn.Cell構造單層線性變換神經網絡。這里我們直接使用前文的 w w w b b b作為模型參數,使用mindspore.Parameter進行包裝后,作為內部屬性,并在construct內實現相同的Tensor操作。

# Define model
class Network(nn.Cell):def __init__(self):super().__init__()self.w = wself.b = bdef construct(self, x):z = ops.matmul(x, self.w) + self.breturn z

接下來我們實例化模型和損失函數。

# Instantiate model
model = Network()
# Instantiate loss function
loss_fn = nn.BCEWithLogitsLoss()

完成后,由于需要使用函數式自動微分,需要將神經網絡和損失函數的調用封裝為一個前向計算函數。

# Define forward function
def forward_fn(x, y):z = model(x)loss = loss_fn(z, y)return loss

完成后,我們使用value_and_grad接口獲得微分函數,用于計算梯度。

由于使用Cell封裝神經網絡模型,模型參數為Cell的內部屬性,此時我們不需要使用grad_position指定對函數輸入求導,因此將其配置為None。對模型參數求導時,我們使用weights參數,使用model.trainable_params()方法從Cell中取出可以求導的參數。

grad_fn = mindspore.value_and_grad(forward_fn, None, weights=model.trainable_params())
loss, grads = grad_fn(x, y)
print(grads)結果輸出:
(Tensor(shape=[5, 3], dtype=Float32, value=
[[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01],[ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]]), Tensor(shape=[3], dtype=Float32, value= [ 1.36578202e-01,  2.98192710e-01,  1.29727080e-01]))

執行微分函數,可以看到梯度值和前文function求得的梯度值一致。

問題集合

問題1:
【MindSpore】Ascend環境運行mindspore腳本報:Malloc device memory failed…
error1
解決方案傳送門
當【解決方案傳送門】中的方案1切換未被占用的device不可行時,可以采用方案2,同樣通過如下命令可以查詢到哪些進程占用了。

npu-smi info

npu-smi info
見圖可知是進程號為315的進程占用了大部分Process memory,通過kill {pid} 殺死進程即可。

after kill

打卡記錄

函數式自動微分打卡記錄

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

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

相關文章

橋接模式與適配器模式

一、共性和區別 橋接設計模式和適配器設計模式的共同點和明顯&#xff0c;它們都是使兩種不同的類配合工。 二者的區別在于&#xff0c;適配器模式是將已有的兩個不同接口接口組合到一起&#xff0c;使得適配器同時擁有兩個不同接口的功能&#xff0c;其目的是使兩個不兼…

Spring Boot與微服務治理框架的集成方法

Spring Boot與微服務治理框架的集成方法 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在當今快速發展的軟件開發領域&#xff0c;微服務架構因其靈活性、可…

華為DCN之:SDN和NFV

1. SDN概述 1.1 SDN的起源 SDN&#xff08;Software Defined Network&#xff09;即軟件定義網絡。是由斯坦福大學Clean Slate研究組提出的一種新型網絡創新架構。其核心理念通過將網絡設備控制平面與數據平面分離&#xff0c;從而實現了網絡控制平面的集中控制&#xff0c;為…

移動網絡捕獲在數字化轉型中的重要性

數字化轉型重新定義了企業運營和與客戶互動的方式。它為組織提供價值的方式帶來了根本性的轉變&#xff0c;使流程更易于訪問、更高效、更具協作性和更安全。然而&#xff0c;跟上不斷發展的數字環境可能是一項挑戰&#xff0c;而未能接受數字化轉型的企業則面臨被淘汰的風險。…

表達式二叉樹的應用

在計算機科學的廣闊領域中,數據結構是構建高效程序和算法的基石。其中,表達式二叉樹(Expression Tree)是一種特殊而強大的數據結構,它將數學表達式的解析和計算轉化為直觀的圖形表示,不僅簡化了復雜的運算過程,還為編譯器設計、計算器應用以及符號數學軟件提供了堅實的基…

(八)EBO和glDrawElements

EBO EBO(Element Buffer Object)&#xff1a;元素緩沖對象&#xff0c;用于存儲頂點繪制順序索引號的GPU顯存區域 unsigned int indices[] {0, 1, 2,2, 1, 3};//EBO創建和綁定GLuint ebo 0;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferD…

【MindSpore學習打卡】應用實踐-計算機視覺-ShuffleNet圖像分類:從理論到實踐

在當今的深度學習領域&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;已經成為圖像分類任務的主流方法。然而&#xff0c;隨著網絡深度和復雜度的增加&#xff0c;計算資源的消耗也顯著增加&#xff0c;特別是在移動設備和嵌入式系統中&#xff0c;這種資源限制尤為突出。…

25計算機考研,這些學校雙非閉眼入,性價比超高!

計算機考研&#xff0c;好的雙非院校也很多&#xff01; 對于一些二本準備考研的同學來說&#xff0c;沒必要一直盯著985/211這些院校&#xff0c;競爭激烈不說&#xff0c;容易當陪跑&#xff0c;下面這些就是不錯的雙非院校&#xff1a; 燕山大學南京郵電大學南京信息工程大…

WPS-Word文檔表格分頁

一、問題描述 這種情況不好描述 就是像這種表格內容&#xff0c;但是會有離奇的分頁的情況。這種情況以前的錯誤解決辦法就是不斷地調整表格的內容以及間隔顯得很亂&#xff0c;于是今天去查了解決辦法&#xff0c;現在學會了記錄一下避免以后忘記了。 二、解決辦法 首先記…

《昇思25天學習打卡營第5天 | mindspore 網絡構建 Cell 常見用法》

1. 背景&#xff1a; 使用 mindspore 學習神經網絡&#xff0c;打卡第五天&#xff1b; 2. 訓練的內容&#xff1a; 使用 mindspore 的 nn.Cell 構建常見的網絡使用方法&#xff1b; 3. 常見的用法小節&#xff1a; 支持一系列常用的 nn 的操作 3.1 nn.Cell 網絡構建&…

【FFmpeg】關鍵結構體的初始化和釋放(AVFormatContext、AVIOContext等)

目錄 1.AVFormatContext1.1 初始化&#xff08;avformat_alloc_context&#xff09;1.2 釋放&#xff08;avformat_free_context&#xff09; 2.AVIOContext2.1 初始化&#xff08;avio_alloc_context&#xff09;2.2 釋放&#xff08;avio_context_free&#xff09; 3. AVStre…

8.SQL注入-基于insert,update利用案例

SQL注入-基于insert/update利用案例 sql語句正常插入表中的數據 insert into member(username,pw,sex,phonenum,address,email) values(xiaoqiang,1111,1,2,3,4); select * from member;例如插入小強數據&#xff0c;如圖所示&#xff1a; 采用or這個運算符&#xff0c;構造…

實測有效:Win11右鍵默認顯示更多

Win11最大的變化之一莫過于右鍵菜單發生了變化&#xff0c;最大的問題是什么&#xff0c;是右鍵菜單很多時候需要點兩次&#xff0c;實在是反人類 第一步 復制以下命令直接運行&#xff1a; reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905ba…

python_zabbix

zabbix官網地址&#xff1a;19. API19. APIhttps://www.zabbix.com/documentation/4.2/zh/manual/api 每個版本可以有些差異&#xff0c;選擇目前的版本在查看對于的api接口#token接口代碼 import requests apiurl "http://zabbix地址/api_jsonrpc.php" data {&quo…

web的學習和開發

這個使同步和異步的區別 今天主要就是學了一些前端&#xff0c;搞了一些前端的頁面&#xff0c;之后準備學一下后端。 我寫的這個項目使百度貼吧&#xff0c;還沒有寫er圖。 先看一下主界面是什么樣子的。 這個是主界面&#xff0c;將來后面的主要功能點基本上全部是放在這個上…

推動能源綠色低碳發展,風機巡檢進入國產超高清+AI時代

全球綠色低碳能源數字轉型發展正在進入一個重要窗口期。風電作為一種清潔能源&#xff0c;在碳中和過程中扮演重要角色&#xff0c;但風電場運維卻是一件十足的“苦差事”。 傳統的風機葉片人工巡檢方式主要依靠巡檢人員利用高倍望遠鏡檢查、高空繞行下降目測檢查(蜘蛛人)、葉…

STM32——Modbus協議

一、Modbus協議簡介&#xff1a; 1.modbus介紹&#xff1a; Modbus是一種串行通信協議&#xff0c;是Modicon公司&#xff08;現在的施耐德電氣 Schneider Electric&#xff09;于1979年為使用可編程邏輯控制器&#xff08;PLC&#xff09;通信而發表。Modbus已經成為工業領域…

PythonConda系列(親測有效):【解決方案】Collecting package metadata (current_repodata.json): failed

【解決方案】Collecting package metadata (current_repodata.json&#xff09;: failed 問題描述解決方案小結參考文獻 問題描述 在cmd下運行&#xff1a;conda install pylint -y&#xff0c;報錯如下&#xff1a; C:\Users\apr> conda install --name apr pylint -y Co…

PDF壓縮工具選哪個?6款免費PDF壓縮工具分享

PDF文件已經成為一種常見的文檔格式。然而&#xff0c;PDF文件的體積有時可能非常龐大&#xff0c;尤其是在包含大量圖像或復雜格式的情況下。選擇一個高效的PDF壓縮工具就顯得尤為重要。小編今天給大家整理了2024年6款市面上反響不錯的PDF壓縮文件工具。輕松幫助你找到最適合自…

漆包線行業生產管理革新:萬界星空科技MES系統解決方案

一、引言 在科技日新月異的今天&#xff0c;萬界星空科技憑借其在智能制造領域的深厚積累&#xff0c;為漆包線行業量身打造了一套先進的生產管理執行系統&#xff08;MES&#xff09;解決方案。隨著市場競爭的加劇&#xff0c;漆包線作為電氣設備的核心材料&#xff0c;其生產…