PyTorch 入門學習

目錄

PyTorch 定義

核心作用

應用場景

Pytorch 基本語法

1. 張量的創建

2.?張量的類型轉換

3. 張量數值計算

4. 張量運算函數

5. 張量索引操作

6. 張量形狀操作

7. 張量拼接操作

8. 自動微分模塊

9. 案例-線性回歸案例


PyTorch 定義

PyTorch 是一個基于 Python 深度學習框架,由 Facebook(現 Meta)的 AI 研究團隊開發并維護。它專注于 深度學習張量計算它將數據封裝成張量(Tensor)來進行處理。PyTorch 中的張量就是元素為同一種數據 類型的多維矩陣。在 PyTorch 中,張量以 "類" 的形式封裝起來,對張量的一些運算、處理的方法被封裝在類中。
Pytorch的安裝:
# 清華鏡像
pip install torch==2.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
其他的鏡像源:

# 阿里云鏡像
https://mirrors.aliyun.com/pypi/simple/

# 豆瓣鏡像
https://pypi.doubanio.com/simple/

# 中科大鏡像
https://pypi.mirrors.ustc.edu.cn/simple/


核心作用

  1. 張量計算(Tensor Computations)
    PyTorch 提供高效的 Tensor 庫(類似 NumPy),支持 GPU 加速,能夠處理高維數組的數學運算(如矩陣乘法、卷積等),是構建神經網絡的數學基礎。

  2. 自動微分(Autograd)
    通過 autograd 模塊,PyTorch 可以自動計算張量的梯度(導數),這是訓練神經網絡的核心功能(如反向傳播)。

  3. 動態計算圖(Dynamic Computation Graph)
    與 TensorFlow 的靜態圖不同,PyTorch 使用動態圖機制(即 "Define-by-Run"),允許在代碼運行時動態構建計算圖。這使得調試更直觀,靈活性更高,尤其適合研究場景。

  4. 深度學習模型構建
    提供 torch.nn 模塊,包含預定義的神經網絡層(如全連接層、卷積層、RNN 等),簡化了復雜模型的搭建過程。

  5. 部署與生產化
    支持通過 TorchScriptONNX 格式將模型導出到生產環境(如移動端、服務器端),并與 C++ 無縫集成。


應用場景

  • 學術研究:PyTorch 的靈活性和易用性使其成為學術界的主流工具,大量論文代碼基于 PyTorch 實現。

  • 自然語言處理(NLP):如 Transformer、BERT 等模型的實現。

  • 計算機視覺(CV):圖像分類、目標檢測、生成對抗網絡(GAN)等。

  • 強化學習:與 OpenAI Gym 等工具結合,訓練智能體。

  • 工業原型開發:快速迭代和部署模型。


Pytorch 基本語法

1. 張量的創建
import torch
import numpy as np"""
創建張量的方式
? torch.tensor 根據指定數據創建張量
? torch.Tensor 根據形狀創建張量, 其也可用來創建指定數據的張量
"""
# 1.torch.tensor() 根據指定數據創建張量
# 0維張量:標量(scalar)
print(torch.tensor(10))
# 1維張量:向量(vector)
print(torch.tensor([10,10]))
# 2維張量:矩陣(matrix)
print(torch.tensor([[10,10],[10,10],[10,10]]))
# 多維張量
print(torch.tensor([[[10,10],[10,10],[10,10]]]))# numpy 數組, 由于 data 為 float64, 下面代碼也使用該類型
data_np=np.random.rand(2,3)
print(data_np)
print(torch.tensor(data_np))data =[[10.,20,30],[20,30,40]]
print(data)
print(torch.tensor(data))#2.torch.Tensor() 根據指定形狀創建張量,也可以用來創建指定數據的張量
#創建2行3列的張量, 默認 dtype 為 float32
data = torch.Tensor(2, 3)
print(data)
# 注意: 如果傳遞列表, 則創建包含指定元素的張量
print(torch.Tensor([2]))
print(torch.Tensor([[2, 3, 4], [5, 6, 7]]))"""
創建線性和隨機張量
? torch.arrange() 和 torch.linspace() 創建線性張量
? torch.randn() 創建隨機張量
"""
#創建線性
# 1. 在指定區間按照步長生成元素 [start, end, step)
data = torch.arange(0, 10, 2)
print(data)
# 2. 在指定區間按照元素個數生成 [start, end, num]
data = torch.linspace(0, 11, 10)
print(data)#torch.randn() 創建隨機張量
# 1. 創建隨機張量
data = torch.randn(2, 3) # 創建2行3列張量
print(data)"""
創建01張量
? torch.zeros() 創建全0張量
? torch.ones() 創建全1張量
? torch.full() 創建全為指定值張量
"""
#創建0、1、指定值張量
# 1. 創建指定形狀全0張量
data = torch.zeros(2, 3)
print(data)
# 2. 創建指定形狀全1張量
# torch.ones()創建全1張量
data = torch.ones(2, 3)
print(data)
# 3. 創建指定形狀指定值的張量
# torch.full()創建全為指定值張量
data = torch.full([2, 3], 10)
print(data)"""
張量元素類型轉換
data.type(torch.DoubleTensor) 
? data.double()
"""
#張量的類型轉換
#data.type(torch.DoubleTensor)
data = torch.full([2, 3], 10)
print(data.dtype)
# 將 data 元素類型轉換為 float64 類型
data = data.type(torch.DoubleTensor)
print(data.dtype)
# 轉換為其他類型
data = data.type(torch.IntTensor)
data = data.type(torch.LongTensor)
data = data.type(torch.FloatTensor)# data.double()
data = torch.full([2, 3], 10)
print(data.dtype)
# 將 data 元素類型轉換為 float64 類型
data = data.double()
print(data.dtype)
# 轉換為其他類型
data = data.int()
data = data.long()
data = data.float()
2.?張量的類型轉換
import numpy as np
import torch"""
張量轉換為NumPy數組
? data_tensor.numpy()
"""
#使用Tensor.numpy()函數可以將張量轉換為ndarray數組
# 1. 將張量轉換為 numpy 數組
data_tensor = torch.tensor([2, 3, 4])
# 使用張量對象中的 numpy 函數進行轉換
data_numpy = data_tensor.numpy()
print(type(data_tensor))
print(type(data_numpy))
print(data_numpy)"""
NumPy數組轉換為張量
? 使用 from_numpy 可以將 ndarray 數組轉換為 Tensor。torch.from_numpy(data_numpy)
? 使用 torch.tensor 可以將 ndarray 數組轉換為 Tensor。torch.tensor(data_numpy)
"""
#使用from_numpy()可以將ndarray數組轉換為Tensor
data_numpy = np.array([2, 3, 4])
# 將 numpy 數組轉換為張量類型
# 1. from_numpy
# 2. torch.tensor(ndarray)
data_tensor = torch.from_numpy(data_numpy)
print(data_tensor)
print(data_numpy)# 使用torch.tensor()可以將ndarray數組轉換為Tensor。
data_numpy = np.array([2, 3, 4])
data_tensor = torch.tensor(data_numpy)
print(data_tensor)
print(data_numpy)"""
標量張量和數字轉換
? data.item()
"""
# 當張量只包含一個元素時, 可以通過 item() 函數提取出該值
data = torch.tensor([30,])
print(data.item())
data = torch.tensor(30)
print(data.item())
3. 張量數值計算

張量基本運算

import torch"""
張量基本運算
加減乘除取負號:
? add、sub、mul、div、neg等函數
? add_、sub_、mul_、div_、neg_等函數(其中帶下劃線的版本會修改原數據)
"""
data = torch.randint(0, 10, [2, 3])
print(data)
# 1. 不修改原數據
new_data = data.add(10) # 等價 new_data = data + 10
print(new_data)
# 2. 直接修改原數據 注意: 帶下劃線的函數為修改原數據本身
data.add_(10) # 等價 data += 10
print(data)
# 3. 其他函數
print(data.sub(100))
print(data.mul(100))
print(data.div(100))
print(data.neg())
點乘運算
點乘指(Hadamard)的是兩個同維數組對應位置的元素相乘,使用 mul 和運算符 * 實現。
"""
張量的點乘運算
? mul和運算符*
"""
data1 = torch.tensor([[1, 2], [3, 4]])
data2 = torch.tensor([[5, 6], [7, 8]])
# 第一種方式
data = torch.mul(data1, data2)
print(data)
# 第二種方式
data = data1 * data2
print(data)

乘法運算

數組乘法運算要求第一個數組 shape: (n, m),第二個數組 shape: (m, p), 兩個數組乘法運算 shape 為: (n, p)。
1. 運算符 @ 用于進行兩個矩陣的乘積運算
2. torch.matmul 中輸入的 shape 不同的張量, 對應的維度必須符合數組乘法的運算規則
"""
矩陣乘法運算
? 運算符@用于進行兩個矩陣的乘法運算
? torch.matmul 對應的維度必須符合矩陣運算規則
"""
# 乘法運算
data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
data2 = torch.tensor([[5, 6], [7, 8]])
# 方式一:
data3 = data1 @ data2
print("data3-->", data3)
# 方式二:
data4 = torch.matmul(data1, data2)
print("data4-->", data4)
4. 張量運算函數
import torch"""
張量運算函數
Sum,mean,sqrt,pow,exp,log等
"""data = torch.randint(0, 10, [2, 3], dtype=torch.float64)
print(data)
# 1. 計算均值
# 注意: tensor 必須為 Float 或者 Double 類型
print(data.mean())
# 2. 計算總和
print(data.sum())
# 3. 計算平方
print(torch.pow(data, 2))
# 4. 計算平方根
print(data.sqrt())
# 5. 指數計算, e^n 次方
print(data.exp())
# 6. 對數計算
print(data.log()) # 以 e 為底
print(data.log2())
print(data.log10())
5. 張量索引操作
索引操作
在操作張量時,經常需要去獲取某些元素就進行處理或者修改操作,我們需要了解在torch中的索引操作。?
import torch# 數據準備
# 隨機生成數據
data = torch.randint(0, 10, [4, 5])
print(data)"""
? 簡單行列索引的使用
"""
print(data[0])
print(data[:, 0])"""
? 列表索引的使用
"""
# 返回 (0, 1)、(1, 2) 兩個位置的元素
print(data[[0, 1], [1, 2]])
# 返回 0、1 行的 1、2 列共4個元素
print(data[[[0], [1]], [1, 2]])"""
? 范圍索引的使用
"""
# 前3行的前2列數據
print(data[:3, :2])
# 第2行到最后的前2列數據
print(data[2:, :2])"""
? 多維索引的使用
"""
data = torch.randint(0, 10, [3, 4, 5])
print(data)
# 獲取0軸上的第一個數據
print(data[0, :, :])
# 獲取1軸上的第一個數據
print(data[:, 0, :])
# 獲取2軸上的第一個數據
print(data[:, :, 0])
6. 張量形狀操作
reshape()函數
reshape 函數可以在保證張量數據不變的前提下改變數據的維度,將其轉換成指定的形狀。
"""
1.reshape 函數可以在保證張量數據不變的前提下改變數
據的維度
"""
data = torch.tensor([[10, 20, 30], [40, 50, 60]])
# 1. 使用 shape 屬性或者 size 方法都可以獲得張量的形狀
print(data.shape)
print(data.size)
# 2. 使用 reshape 函數修改張量形狀
new_data = data.reshape(1, 6)
print(new_data)
print(new_data.shape)
squeeze()和unsqueeze()函數
squeeze 函數刪除形狀為 1 的維度(降維),unsqueeze 函數添加形狀為1的維度(升維)。
"""
2.squeeze 和 unsqueeze 函數可以用來減少或者增加維
度
"""
mydata1 = torch.tensor([1, 2, 3, 4, 5])
print('mydata1--->', mydata1.shape, mydata1) # 一個普通的數組 1維數據
mydata2 = mydata1.unsqueeze(dim=0)
print('在0維度上 拓展維度:', mydata2, mydata2.shape) #1*5
mydata3 = mydata1.unsqueeze(dim=1)
print('在1維度上 拓展維度:', mydata3, mydata3.shape) #5*1
mydata4 = mydata1.unsqueeze(dim=-1)
print('在-1維度上 拓展維度:', mydata4, mydata4.shape) #5*1
mydata5 = mydata4.squeeze()
print('壓縮維度:', mydata5, mydata5.shape) #1*5
transpose()和permute()函數
transpose 函數可以實現交換張量形狀的指定維度, 例如: 一個張量的形狀為 (2, 3, 4) 可以通過 transpose 函數把 3 和4 進行交換, 將張量的形狀變為 (2, 4, 3) 。 permute 函數可以一次交換更多的維度。
"""
3.transpose 函數可以實現交換張量形狀的指定維度, 
permute 可以一次交換更多的維度
"""
data = torch.tensor(np.random.randint(0, 10, [3, 4, 5]))
print(data)
print('data shape:', data.size())
# 1 交換1和2維度
mydata2 = torch.transpose(data, 1, 2)
print('mydata2.shape--->', mydata2.shape)
# 2 將data 的形狀修改為 (4, 5, 3), 需要變換多次
mydata3 = torch.transpose(data, 0, 1)
mydata4 = torch.transpose(mydata3, 1, 2)
print('mydata4.shape--->', mydata4.shape)
# 3 使用 permute 函數將形狀修改為 (4, 5, 3)
# 3-1 方法1
mydata5 = torch.permute(data, [1, 2, 0])
print('mydata5.shape--->', mydata5.shape)
# 3-2 方法2
mydata6 = data.permute([1, 2, 0])
print('mydata6.shape--->', mydata6.shape)
view()和contiguous()函數
view 函數也可以用于修改張量的形狀,只能用于存儲在整塊內存中的張量。在 PyTorch 中,有些張量是由不同的數據塊組成的,它們并沒有存儲在整塊的內存中,view 函數無法對這樣的張量進行變形處理。
"""
4.view 函數也可以用于修改張量的形狀, 但是它要求被轉
換的張量內存必須連續,所以一般配合 contiguous 函數使
用
"""
# 1 若要使用view函數, 需要使用contiguous() 變成連續以后再使用view函數
# 2 判斷張量是否使用整塊內存
data = torch.tensor( [[10, 20, 30],[40, 50, 60]])
print('data--->', data, data.shape)
# 1 判斷是否使用整塊內存
print(data.is_contiguous()) # True
# 2 view
mydata2 = data.view(3, 2)
print('mydata2--->', mydata2, mydata2.shape)
7. 張量拼接操作
torch.cat()
torch.cat()函數可以將兩個張量根據指定的維度拼接起來,不改變維度數
import torch
"""
1.cat()函數可以將張量按照指定的維度拼接起來
"""
data1 = torch.randint(0, 10, [1, 2, 3])
data2 = torch.randint(0, 10, [1, 2, 3])
print(data1)
print(data2)
# 1. 按0維度拼接
new_data = torch.cat([data1, data2], dim=0)
print(new_data.shape)
# 2. 按1維度拼接
new_data = torch.cat([data1, data2], dim=1)
print(new_data.shape)
# 3. 按2維度拼接
new_data = torch.cat([data1, data2], dim=2)
print(new_data.shape)
8. 自動微分模塊
????????訓練神經網絡時,最常用的算法就是反向傳播。在該算法中,參數(模型權重)會根據損失函數關于對應 參數的梯度進行調整。為了計算這些梯度,PyTorch內置了名為 torch.autograd 的微分引擎。它支持任 意計算圖的自動梯度計算。
????????
使用 backward 方法、grad 屬性來實現梯度的計算和訪問。
import torch"""
1. 當X為標量時梯度的計算
"""
def test01():x = torch.tensor(5)# 目標值y = torch.tensor(0.)# 設置要更新的權重和偏置的初始值w = torch.tensor(1., requires_grad=True, dtype=torch.float32)b = torch.tensor(3., requires_grad=True, dtype=torch.float32)# 設置網絡的輸出值z = x * w + b  # 矩陣乘法# 設置損失函數,并進行損失的計算loss = torch.nn.MSELoss()loss = loss(z, y)# 自動微分loss.backward()# 打印 w,b 變量的梯度# backward 函數計算的梯度值會存儲在張量的 grad 變量中print("W的梯度:", w.grad)print("b的梯度", b.grad)
test01()"""
2. 當X為矩陣時梯度的計算
"""
def test02():# 輸入張量 2*5x = torch.ones(2,5)# 目標值是 2*3y = torch.zeros(2,3)# 設置要更新的權重和偏置的初始值w = torch.randn(5, 3,requires_grad=True)b = torch.randn(3, requires_grad=True)# 設置網絡的輸出值z = torch.matmul(x, w) + b # 矩陣乘法# 設置損失函數,并進行損失的計算loss = torch.nn.MSELoss()loss = loss(z, y)# 自動微分loss.backward()# 打印 w,b 變量的梯度# backward 函數計算的梯度值會存儲在張量的 grad 變量中print("W的梯度:", w.grad)print("b的梯度", b.grad)
test02()
9. 案例-線性回歸案例

線性回歸:一種用于建立輸入特征(X)與連續型輸出(y)之間線性關系的監督學習模型。

模型公式

  • w:權重(斜率),控制每個特征的影響力
  • b:偏置(截距),調整整體偏移

目標:找到最佳的 w 和 b,使預測值最接近真實值。


損失函數:用于衡量模型預測值與真實值之間的差異。

在線性回歸中,常用的損失函數是均方誤差(MSE),即所有樣本預測值與真實值差的平方的平均值。

均方誤差(MSE)公式


梯度下降:是一種優化算法,用于找到損失函數的最小值。通過計算損失函數關于參數的梯度(導數),然后沿著梯度的反方向更新參數,逐步逼近最小值。

參數更新公式

梯度計算(以MSE為例)

  • 關鍵參數

    • 學習率(ηη):控制步長,過大易震蕩,過小收斂慢

    • 迭代次數:決定更新輪次


線性回歸,損失函數和梯度下降,三者的協同工作流程

  1. 初始化參數:隨機設置 ww 和 bb 的初始值

  2. 前向傳播:計算預測值 y^=wX+by^?=wX+b

  3. 損失計算:通過MSE評估預測誤差

  4. 梯度計算:求損失對 ww 和 bb 的偏導數

  5. 參數更新:沿負梯度方向調整 ww 和 bb

  6. 重復2-5步:直到損失收斂或達到最大迭代次數


實例演示(房價預測)
場景:用房屋面積(xx)預測房價(yy)

  • 數據

    面積(㎡)房價(萬元)
    80320
    100400
    120480

步驟

  1. 假設模型:

  2. 初始化:設 w=3, b=50
  3. 預測值:

    • 第一樣本:

  4. 計算損失:

  5. 計算梯度:

  6. 更新參數(設 η=0.0001η=0.0001):


在pytorch中進行模型構建的整個流程一般分為四個步驟:
  • 準備訓練集數據
  • 構建要使用的模型
  • 設置損失函數和優化器
  • 模型訓練

代碼案例

import torch
from torch.utils.data import TensorDataset # 構造數據集對象
from torch.utils.data import DataLoader # 數據加載器
from torch import nn # nn模塊中有平方損失函數和假設函數
from torch import optim # optim模塊中有優化器函數
from sklearn.datasets import make_regression # 創建線性回歸模型數據集
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False # 用來正常顯示負號# 構建數據集
def create_dataset():x,y,coef=make_regression(n_samples=100,n_features=1,noise=10,coef=True,bias=1.5,random_state=0)x = torch.tensor(x)y = torch.tensor(y)return x,y,coef# 構造數據集
x, y, coef = create_dataset()
# 構造數據集對象
dataset = TensorDataset(x, y)
# 構造數據加載器
# dataset=:數據集對象
# batch_size=:批量訓練樣本數據
# shuffle=:樣本數據是否進行亂序
dataloader = DataLoader(dataset=dataset, batch_size=16, shuffle=True)
# 構造模型
# in_features指的是輸入張量的大小size
# out_features指的是輸出張量的大小size
model = nn.Linear(in_features=1, out_features=1)# 損失和優化器
# 構造平方損失函數
criterion = nn.MSELoss()
# 構造優化函數
optimizer = optim.SGD(params=model.parameters(), lr=1e-2)epochs = 100
# 損失的變化
loss_epoch = []
total_loss=0.0
train_sample=0.0
for _ in range(epochs):for train_x, train_y in dataloader:# 將一個batch的訓練數據送入模型y_pred = model(train_x.type(torch.float32))# 計算損失值loss = criterion(y_pred, train_y.reshape(-1, 1).type(torch.float32))total_loss += loss.item()train_sample += len(train_y)# 梯度清零optimizer.zero_grad()# 自動微分(反向傳播)loss.backward()# 更新參數optimizer.step()# 獲取每個batch的損失loss_epoch.append(total_loss/train_sample)# 繪制損失變化曲線
plt.plot(range(epochs), loss_epoch)
plt.title('損失變化曲線')
plt.grid()
plt.show()# 繪制擬合直線
plt.scatter(x, y)
x = torch.linspace(x.min(), x.max(), 1000)
y1 = torch.tensor([v * model.weight + model.bias for v in x])
y2 = torch.tensor([v * coef + 1.5 for v in x])
plt.plot(x, y1, label='訓練')
plt.plot(x, y2, label='真實')
plt.grid()
plt.legend()
plt.show()

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

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

相關文章

Hive SQL 精進系列:REGEXP_REPLACE 函數的用法

目錄 一、引言二、REGEXP_REPLACE 函數基礎2.1 基本語法參數詳解2.2 簡單示例 三、REGEXP_REPLACE 函數的應用場景3.1 去除特殊字符3.2 統一字符串格式 四、REGEXP_REPLACE 與 REPLACE 函數的對比4.1 功能差異4.2 適用場景 五、REGEXP_REPLACE 與 REGEXP 函數的對比5.1 功能差異…

從0開始搭建微服務架構特別篇SpringCloud網關聚合knife4j

前言:總所周知項目開發接口測試需要knife4j,但是,微服務架構中微服務很多,模塊地址很多,需要統一管理api測試,就需要聚合在網關統一調用,本章,就說明如何通過網關聚合使用knife4j。 …

Spring Cloud 中的服務注冊與發現: Eureka詳解

1. 背景 1.1 問題描述 我們如果通過 RestTamplate 進行遠程調用時,URL 是寫死的,例如: String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 當機器更換或者新增機器時,這個 URL 就需要相應地變…

網頁制作15-Javascipt時間特效の記錄網頁停留時間

01效果圖: 02運用: window.setTimeout()刷新function()函數document.forms():表單if條件語句window.alert()窗口警示 03、操作代碼:…

【Rust基礎】排序和分組

排序 簡單排序 整數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //?assert_eq!(list, vec![1, 2, 3, 4, 5]); }小數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//? 不能直接使用sort,因為f32和f64未實現O…

C++ std::list超詳細指南:基礎實踐(手搓list)

目錄 一.核心特性 1.雙向循環鏈表結構 2.頭文件:#include 3.時間復雜度 4.內存特性 二.構造函數 三.list iterator的使用 1.學習list iterator之前我們要知道iterator的區分 ?編輯 2.begin()end() 3.rbegin()rend() 四.list關鍵接口 1.empty() 2. size…

996引擎 - 紅點系統

996引擎 - 紅點系統 總結NPC 紅點(TXT紅點)Lua 紅點1. Red_Point.lua2. UI_Ex.lua參考資料以下內容是在三端 lua 環境下測試的 總結 紅點系統分幾個部分組成。 M2中設置變量推送。 配置紅點表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填寫 ids 列。 主界面掛載…

C語言——變量與常量

C語言中的變量與常量:簡潔易懂的指南 在C語言編程中,變量和常量是最基本的概念之一。理解它們的區別和使用方法對于編寫高效、可維護的代碼至關重要。本文將詳細介紹C語言中的變量和常量,并通過圖表和代碼示例幫助你更好地理解。 目錄 什么…

PySide(PyQt),使用types.MethodType動態定義事件

以PySide(PyQt)的圖片項為例,比如一個視窗的場景底圖是一個QGraphicsPixmapItem,需要修改它的鼠標滾輪事件,以實現鼠標滾輪縮放顯示的功能。為了達到這個目的,可以重新定義一個QGraphicsPixmapItem類,并重寫它的wheelE…

K8S學習之基礎三十一:k8s中RBAC 的核心概念

Kubernetes (k8s) 中的 RBAC(Role-Based Access Control,基于角色的訪問控制)是一種用于管理用戶和服務賬戶對集群資源訪問權限的機制。RBAC 允許管理員通過定義角色(Role)和角色綁定(RoleBinding&#xff…

【eNSP實戰】三層交換機使用ACL實現網絡安全

拓圖 要求: vlan1可以訪問Internetvlan2和vlan3不能訪問Internet和vlan1vlan2和vlan3之間可以互相訪問PC配置如圖所示,這里不展示 LSW1接口vlan配置 vlan batch 10 20 30 # interface Vlanif1ip address 192.168.40.2 255.255.255.0 # interface Vla…

軟考系統架構師 — 1 考點分析

目錄 1 考點總結 1 考點總結 章節 內容 真題考察 緒論 1. 緒論 不考 計算機相關知識 2. 計算機系統基礎知識,新增計算機硬件、嵌入式、計算機語言、系統工程 對應計算機組成結構、操作系統、數據庫、計算機網絡、多媒體等知識點,整體分值在 10 …

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟:

在Eclipse 中使用 MyBatis 進行開發,通常需要以下步驟: 1. 創建 Maven 項目 首先,在 Eclipse 中創建一個 Maven 項目。如果你還沒有安裝 Maven 插件,可以通過 Eclipse Marketplace 安裝 Maven 插件。 打開 Eclipse,選…

錯誤記錄: git 無法連接到github

錯誤記錄: git 無法連接到github 今天, 新建了一個github倉庫, 但從本地怎么都push不上去.并報錯 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository e…

k8s 配置兩個deployment主機級別互斥部署

在 Kubernetes 中,要實現兩個 Deployment 的 Pod 在主機級別互斥部署,可以使用 podAntiAffinity 配置。通過設置 podAntiAffinity,可以確保兩個 Deployment 的 Pod 不會被調度到同一節點上。 實現步驟 定義 Deployment: 為每個…

Unity中WolrdSpace下的UI展示在上層

一、問題描述 Unity 中 Canvas使用World Space布局的UI,想讓它不被3d物體遮擋,始終顯示在上層。 二、解決方案 使用shader解決 在 UI 的材質中禁用深度測試(ZTest),強制 UI 始終渲染在最上層。 Shader "Custo…

五子棋小游戲-簡單開發版

一、需求分析 開發一個基于 Pygame 庫的五子棋小游戲,允許兩名玩家在棋盤上輪流落子,當有一方達成五子連珠時游戲結束,顯示獲勝信息,并提供退出游戲和重新開始游戲的操作選項。 1.棋盤顯示 : 顯示一個 15x15 的五子棋…

基于C#的以太網通訊實現:TcpClient異步通訊詳解

基于C#的以太網通訊實現:TcpClient異步通訊詳解 在現代工業控制和物聯網應用中,以太網通訊是一種常見的數據傳輸方式。本文將介紹如何使用C#實現基于TCP協議的以太網通訊,并通過異步編程提高通訊效率。我們將使用TcpClient類來實現客戶端與服…

小秋的矩陣

0小秋的矩陣 - 藍橋云課 問題描述 給你一個 n 行 m 列只包含 0 和 1 的矩陣,求它的所有子矩陣中,是方陣而且恰好包含 k 個 0 的數量。 方陣是行數和列數相等的矩陣。 子矩陣是從一個矩陣當中選取某些行和某些列交叉位置所組成的新矩陣(保…

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包

晶晨S905L3芯片_原機安卓4升級安卓9.0_通刷線刷固件包 線刷方法:(新手參考借鑒一下) 1、準備好一根雙公頭USB線刷刷機線,長度30-50CM長度最佳,同時準備一臺電腦; 2、電腦上安裝好刷機工具Amlogic USB Bu…