邯鄲有沒有專門做寫字樓的網(wǎng)站博達網(wǎng)站建設流程
鶴壁市浩天電氣有限公司
2026/01/22 06:28:55
邯鄲有沒有專門做寫字樓的網(wǎng)站,博達網(wǎng)站建設流程,平面設計師培訓,宣傳冊設計樣本浙大疏錦行
一、圖像數(shù)據(jù)介紹
1.1灰度圖像
圖像數(shù)據(jù)
相較于結構化數(shù)據(jù)#xff08;表格數(shù)據(jù)#xff09;他的特點在于他每個樣本的的形狀并不是(特征數(shù)#xff0c;)#xff0c;而是(寬#xff0c;高#xff0c;通道數(shù))
?
# 先繼續(xù)之前的代碼
import torch
import tor…浙大疏錦行一、圖像數(shù)據(jù)介紹1.1灰度圖像圖像數(shù)據(jù)相較于結構化數(shù)據(jù)表格數(shù)據(jù)他的特點在于他每個樣本的的形狀并不是(特征數(shù))而是(寬高通道數(shù))? # 先繼續(xù)之前的代碼 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加載數(shù)據(jù)的工具 from torchvision import datasets, transforms # torchvision 是一個用于計算機視覺的庫datasets 和 transforms 是其中的模塊 import matplotlib.pyplot as plt # 設置隨機種子確保結果可復現(xiàn) torch.manual_seed(42) # 1. 數(shù)據(jù)預處理該寫法非常類似于管道pipeline # transforms 模塊提供了一系列常用的圖像預處理操作 # 先歸一化再標準化 transform transforms.Compose([ transforms.ToTensor(), # 轉(zhuǎn)換為張量并歸一化到[0,1] transforms.Normalize((0.1307,), (0.3081,)) # MNIST數(shù)據(jù)集的均值和標準差這個值很出名所以直接使用 ]) import matplotlib.pyplot as plt # 2. 加載MNIST數(shù)據(jù)集如果沒有會自動下載 train_dataset datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset datasets.MNIST( root./data, trainFalse, transformtransform ) ?# 隨機選擇一張圖片可以重復運行每次都會隨機選擇 sample_idx torch.randint(0, len(train_dataset), size(1,)).item() # 隨機選擇一張圖片的索引 # len(train_dataset) 表示訓練集的圖片數(shù)量size(1,)表示返回一個索引torch.randint() 函數(shù)用于生成一個指定范圍內(nèi)的隨機數(shù),item() 方法將張量轉(zhuǎn)換為 Python 數(shù)字 image, label train_dataset[sample_idx] # 獲取圖片和標簽 # 可視化原始圖像需要反歸一化 def imshow(img): img img * 0.3081 0.1307 # 反標準化 npimg img.numpy() plt.imshow(npimg[0], cmapgray) # 顯示灰度圖像 plt.show() print(fLabel: {label}) imshow(image)結構化數(shù)據(jù)如表格的形狀通常是 (樣本數(shù), 特征數(shù))例如 (1000, 5) 表示 1000 個樣本每個樣本有 5 個特征。圖像數(shù)據(jù)的形狀更復雜需要保留空間信息高度、寬度、通道因此不能直接用一維向量表示。其中顏色信息往往是最開始輸入數(shù)據(jù)的通道的含義因為每個顏色可以用紅綠藍三原色表示因此一般輸入數(shù)據(jù)的通道數(shù)是 3。MNIST 數(shù)據(jù)集是手寫數(shù)字的 灰度圖像每個像素點的取值范圍為 0-255黑白程度因此 通道數(shù)為 1。圖像尺寸統(tǒng)一為 28×28 像素。1.2彩色圖像在 PyTorch 中圖像數(shù)據(jù)的形狀通常遵循 (通道數(shù), 高度, 寬度) 的格式即 Channel First 格式這與常見的 (高度, 寬度, 通道數(shù))Channel Last如 NumPy 數(shù)組不同。---注意順序關系注意點1. 如果用matplotlib庫來畫圖需要轉(zhuǎn)換下順序我們后續(xù)介紹2. 模型輸入通常需要 批次維度Batch Size形狀變?yōu)?(批次大小, 通道數(shù), 高度, 寬度)。例如批量輸入 10 張 MNIST 圖像時形狀為 (10, 1, 28, 28)。# 打印一張彩色圖像用cifar-10數(shù)據(jù)集 import torch import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as np # 設置隨機種子確保結果可復現(xiàn) torch.manual_seed(42) # 定義數(shù)據(jù)預處理步驟 transform transforms.Compose([ transforms.ToTensor(), # 轉(zhuǎn)換為張量并歸一化到[0,1] transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) # 標準化處理 ]) # 加載CIFAR-10訓練集 trainset torchvision.datasets.CIFAR10( root./data, trainTrue, downloadTrue, transformtransform ) # 創(chuàng)建數(shù)據(jù)加載器 trainloader torch.utils.data.DataLoader( trainset, batch_size4, shuffleTrue ) # CIFAR-10的10個類別 classes (plane, car, bird, cat, deer, dog, frog, horse, ship, truck) # 隨機選擇一張圖片 sample_idx torch.randint(0, len(trainset), size(1,)).item() image, label trainset[sample_idx] # 打印圖片形狀 print(f圖像形狀: {image.shape}) # 輸出: torch.Size([3, 32, 32]) print(f圖像類別: {classes[label]}) # 定義圖像顯示函數(shù)適用于CIFAR-10彩色圖像 def imshow(img): img img / 2 0.5 # 反標準化處理將圖像范圍從[-1,1]轉(zhuǎn)回[0,1] npimg img.numpy() plt.imshow(np.transpose(npimg, (1, 2, 0))) # 調(diào)整維度順序(通道,高,寬) → (高,寬,通道) plt.axis(off) # 關閉坐標軸顯示 plt.show() # 顯示圖像 imshow(image)注意因為這里設計到圖像的顯示所以就需要調(diào)整維度順序(通道,高,寬) → (高,寬,通道)二、圖像相關的神經(jīng)網(wǎng)絡的定義2.1 黑白圖像模型的定義# 先歸一化再標準化 transform transforms.Compose([ transforms.ToTensor(), # 轉(zhuǎn)換為張量并歸一化到[0,1] transforms.Normalize((0.1307,), (0.3081,)) # MNIST數(shù)據(jù)集的均值和標準差這個值很出名所以直接使用 ]) import matplotlib.pyplot as plt # 2. 加載MNIST數(shù)據(jù)集如果沒有會自動下載 train_dataset datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset datasets.MNIST( root./data, trainFalse, transformtransform ) # 定義兩層MLP神經(jīng)網(wǎng)絡 class MLP(nn.Module): def __init__(self): super(MLP, self).__init__() self.flatten nn.Flatten() # 將28x28的圖像展平為784維向量 self.layer1 nn.Linear(784, 128) # 第一層784個輸入128個神經(jīng)元 self.relu nn.ReLU() # 激活函數(shù) self.layer2 nn.Linear(128, 10) # 第二層128個輸入10個輸出對應10個數(shù)字類別 def forward(self, x): x self.flatten(x) # 展平圖像 x self.layer1(x) # 第一層線性變換 x self.relu(x) # 應用ReLU激活函數(shù) x self.layer2(x) # 第二層線性變換輸出logits return x # 初始化模型 model MLP() device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) # 將模型移至GPU如果可用 from torchsummary import summary # 導入torchsummary庫 print(
模型結構信息) summary(model, input_size(1, 28, 28)) # 輸入尺寸為MNIST圖像尺寸我們關注和之前結構化MLP的差異1. 輸入需要展平操作MLP 的輸入層要求輸入是一維向量但 MNIST 圖像是二維結構28×28 像素形狀為 [1, 28, 28]通道 × 高 × 寬。nn.Flatten()展平操作 將二維圖像 “拉成” 一維向量78428×28 個元素使其符合全連接層的輸入格式。其中不定義這個flatten方法直接在前向傳播的過程中用 x x.view(-1, 28 * 28) 將圖像展平為一維向量也可以實現(xiàn)2. 輸入數(shù)據(jù)的尺寸包含了通道數(shù)input_size(1, 28, 28)3. 參數(shù)的計算- 第一層 layer1全連接層權重參數(shù)輸入維度 × 輸出維度 784 × 128 100,352偏置參數(shù)輸出維度 128合計100,352 128 100,480- 第二層 layer2全連接層權重參數(shù)輸入維度 × 輸出維度 128 × 10 1,280偏置參數(shù)輸出維度 10合計1,280 10 1,290- 總參數(shù)100,480layer1 1,290layer2 101,7702.2 彩色圖像模型的定義class MLP(nn.Module): def __init__(self, input_size3072, hidden_size128, num_classes10): super(MLP, self).__init__() # 展平層將3×32×32的彩色圖像轉(zhuǎn)為一維向量 # 輸入尺寸計算3通道 × 32高 × 32寬 3072 self.flatten nn.Flatten() # 全連接層 self.fc1 nn.Linear(input_size, hidden_size) # 第一層 self.relu nn.ReLU() self.fc2 nn.Linear(hidden_size, num_classes) # 輸出層 def forward(self, x): x self.flatten(x) # 展平[batch, 3, 32, 32] → [batch, 3072] x self.fc1(x) # 線性變換[batch, 3072] → [batch, 128] x self.relu(x) # 激活函數(shù) x self.fc2(x) # 輸出層[batch, 128] → [batch, 10] return x # 初始化模型 model MLP() device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) # 將模型移至GPU如果可用 from torchsummary import summary # 導入torchsummary庫 print(
模型結構信息) summary(model, input_size(3, 32, 32)) # CIFAR-10 彩色圖像3×32×32- 第一層 layer1全連接層權重參數(shù)輸入維度 × 輸出維度 3072 × 128 393,216偏置參數(shù)輸出維度 128合計393,216 128 393,344- 第二層 layer2全連接層權重參數(shù)輸入維度 × 輸出維度 128 × 10 1,280偏置參數(shù)輸出維度 10合計1,280 10 1,290- 總參數(shù)393,344layer1 1,290layer2 394,6342.3 模型定義與batchsize的關系實際定義中輸入圖像還存在batchsize這一維度在 PyTorch 中模型定義和輸入尺寸的指定不依賴于 batch_size無論設置多大的 batch_size模型結構和輸入尺寸的寫法都是不變的。class MLP(nn.Module): def __init__(self): super().__init__() self.flatten nn.Flatten() # nn.Flatten()會將每個樣本的圖像展平為 784 維向量但保留 batch 維度。 self.layer1 nn.Linear(784, 128) self.relu nn.ReLU() self.layer2 nn.Linear(128, 10) def forward(self, x): x self.flatten(x) # 輸入[batch_size, 1, 28, 28] → [batch_size, 784] x self.layer1(x) # [batch_size, 784] → [batch_size, 128] x self.relu(x) x self.layer2(x) # [batch_size, 128] → [batch_size, 10] return xPyTorch 模型會自動處理 batch 維度即第一維無論 batch_size 是多少模型的計算邏輯都不變。batch_size 是在數(shù)據(jù)加載階段定義的與模型結構無關。summary(model, input_size(1, 28, 28))中的input_size不包含 batch 維度只需指定樣本的形狀通道 × 高 × 寬。三、顯存占用的主要組成部分在面對數(shù)據(jù)集過大的情況下由于無法一次性將數(shù)據(jù)全部加入到顯存中所以采取了分批次加載這種方式。即一次只加載一部分數(shù)據(jù)保證在顯存的范圍內(nèi)。那么顯存設置多少合適呢如果設置的太小那么每個batchsize的訓練不足以發(fā)揮顯卡的能力浪費計算資源如果設置的太大會出現(xiàn)OOTout of memory顯存一般被以下內(nèi)容占用1. 模型參數(shù)與梯度模型的權重Parameters和對應的梯度Gradients會占用顯存尤其是深度神經(jīng)網(wǎng)絡如 Transformer、ResNet 等一個 1 億參數(shù)的模型如 BERT-base單精度float32參數(shù)占用約 400MB1e8×4Byte加上梯度則翻倍至 800MB每個權重參數(shù)都有其對應的梯度。2. 部分優(yōu)化器如 Adam會為每個參數(shù)存儲動量Momentum和平方梯度Square Gradient進一步增加顯存占用通常為參數(shù)大小的 2-3 倍3. 其他開銷。3.1 模型參數(shù)與梯度FP32 精度參數(shù)總量101,770 個參數(shù)- **1字節(jié)Byte 8位bit**是計算機存儲的最小尋址單位。- 位bit是二進制數(shù)的最小單位0或1例如0b1010表示4位二進制數(shù)。- 1KB1024字節(jié)1MB1024KB1,048,576字節(jié)常見數(shù)據(jù)類型的字節(jié)占用- MNIST數(shù)據(jù)集的原始圖像像素值為**0-255的整數(shù)**uint8類型占1字節(jié)表示灰度值0黑255白。- 但PyTorch的transforms.ToTensor()會將其**歸一化到[0, 1]范圍**并轉(zhuǎn)換為 float32類型浮點型更適合神經(jīng)網(wǎng)絡計算。單精度float32參數(shù)占用101,770 × 4 Byte ≈ 403 KB梯度是損失函數(shù)對模型參數(shù)的導數(shù)?Loss/?Weight用于指示參數(shù)更新的方向和幅度。梯度是損失函數(shù)對模型參數(shù)的導數(shù)?Loss/?Weight用于指示參數(shù)更新的方向和幅度。因此在默認情況下梯度的數(shù)據(jù)類型和數(shù)目與參數(shù)相同。梯度占用反向傳播時與參數(shù)相同合計約 806 KB3.2 優(yōu)化器狀態(tài)SGD- SGD優(yōu)化器**不存儲額外動量**因此無額外顯存占用。- SGD 隨機梯度下降最基礎的優(yōu)化器直接沿梯度反方向更新參數(shù)。- 參數(shù)更新公式w w - learning_rate * gradientAdam- Adam優(yōu)化器自適應學習率優(yōu)化器結合了動量Momentum和梯度平方的指數(shù)移動平均。- 每個參數(shù)存儲動量m和平方梯度v占用約 101,770 × 8 Byte ≈ 806 KB- 動量m每個參數(shù)對應一個動量值數(shù)據(jù)類型與參數(shù)相同float32占用 403 KB。- 梯度平方v每個參數(shù)對應一個梯度平方值數(shù)據(jù)類型與參數(shù)相同float32占用 403 KB。3.3 數(shù)據(jù)批量batch_size的顯存占用- 單張圖像尺寸1×28×28通道×高×寬歸一化轉(zhuǎn)換為張量后為float32類型- 單張圖像顯存占用1×28×28×4 Byte 3,136 Byte ≈ 3 KB- 批量數(shù)據(jù)占用batch_size × 單張圖像占用- 例如batch_size64 時數(shù)據(jù)占用為 64×3 KB ≈ 192 KB- batch_size1024 時數(shù)據(jù)占用為 1024×3 KB ≈ 3 MB3.4. 前向/反向傳播中間變量- 對于兩層MLP中間變量如layer1的輸出占用較小- batch_size×128維向量batch_size×128×4 Byte batch_size×512 Byte- 例如batch_size1024時中間變量約 512 KB以SGD為例此時其他參數(shù)占用固定batchsize會影響顯存占用在 PyTorch 中在使用DataLoader加載數(shù)據(jù)時如果不指定batch_size參數(shù)默認值是1即每次迭代返回一個樣本。這與一次性使用全部數(shù)據(jù)進行訓練是完全不同的概念。如果想要一次性使用全部數(shù)據(jù)進行訓練需要手動將batch_size設置為數(shù)據(jù)集的大小但對于大型數(shù)據(jù)集這樣做通常會導致內(nèi)存不足因為一次性將所有數(shù)據(jù)加載到內(nèi)存中可能會超出硬件的內(nèi)存限制。大規(guī)模數(shù)據(jù)時通常從16開始測試然后逐漸增加確保代碼運行正常且不報錯直到出現(xiàn) 內(nèi)存不足OOM報錯 或訓練效果下降此時選擇略小于該值的 batch_size。訓練時候搭配 nvidia-smi 監(jiān)控顯存占用合適的 batch_size 硬件顯存允許的最大值 × 0.8預留安全空間并通過訓練效果驗證調(diào)整。補充說明 batchsize對于訓練的影響在深度學習中使用較大的 batch_size批量大小相比單樣本訓練batch_size1有以下核心優(yōu)勢- 并行計算能力最大化減小訓練時間且大幅減少更新次數(shù)- 梯度方向更準確單樣本訓練的梯度僅基于單個數(shù)據(jù)點可能包含大量噪聲尤其是數(shù)據(jù)分布不均或存在異常值時。大 batch_size 的梯度是多個樣本的平均值能抵消單個樣本的隨機性梯度方向更接近真實分布的 “全局最優(yōu)方向”。會讓訓練過程更穩(wěn)定波動更小