DAY 39 圖像數據與顯存

知識點回顧

  1. 圖像數據的格式:灰度和彩色數據
  2. 模型的定義
  3. 顯存占用的4種地方
    1. 模型參數+梯度參數
    2. 優化器參數
    3. 數據批量所占顯存
    4. 神經元輸出中間狀態
  4. batchisize和訓練的關系

一、 圖像數據的介紹

1.1 灰度圖像

從這里開始我們進入到了圖像數據相關的部分,也是默認你有之前復試班計算機視覺相關的知識,但是一些基礎的概念我仍然會提。

昨天我們介紹了minist這個經典的手寫數據集,作為圖像數據,相較于結構化數據(表格數據)他的特點在于他每個樣本的的形狀并不是(特征數,),而是(寬,高,通道數)

# 先繼續之前的代碼
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader , Dataset # DataLoader 是 PyTorch 中用于加載數據的工具
from torchvision import datasets, transforms # torchvision 是一個用于計算機視覺的庫,datasets 和 transforms 是其中的模塊
import matplotlib.pyplot as plt
# 設置隨機種子,確保結果可復現
torch.manual_seed(42)# 1. 數據預處理,該寫法非常類似于管道pipeline
# transforms 模塊提供了一系列常用的圖像預處理操作# 先歸一化,再標準化
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差,這個值很出名,所以直接使用
])
import matplotlib.pyplot as plt# 2. 加載MNIST數據集,如果沒有會自動下載
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 隨機選擇一張圖片,可以重復運行,每次都會隨機選擇
sample_idx = torch.randint(0, len(train_dataset), size=(1,)).item() # 隨機選擇一張圖片的索引
# len(train_dataset) 表示訓練集的圖片數量;size=(1,)表示返回一個索引;torch.randint() 函數用于生成一個指定范圍內的隨機數,item() 方法將張量轉換為 Python 數字
image, label = train_dataset[sample_idx] # 獲取圖片和標簽
# 可視化原始圖像(需要反歸一化)
def imshow(img):img = img * 0.3081 + 0.1307  # 反標準化npimg = img.numpy()plt.imshow(npimg[0], cmap='gray') # 顯示灰度圖像plt.show()print(f"Label: {label}")
imshow(image)# 打印下圖片的形狀
image.shape#torch.Size([1, 28, 28])

上述是昨天的代碼,我們介紹了圖像數據的預處理,這是我們首次接觸圖像數據,他和之前的結構化數據有什么差異點呢?

結構化數據(如表格)的形狀通常是 (樣本數, 特征數),例如 (1000, 5) 表示 1000 個樣本,每個樣本有 5 個特征。圖像數據的形狀更復雜,需要保留空間信息(高度、寬度、通道),因此不能直接用一維向量表示。其中顏色信息往往是最開始輸入數據的通道的含義,因為每個顏色可以用紅綠藍三原色表示,因此一般輸入數據的通道數是 3。

維度索引含義數值說明
0通道數(Channels)1?表示這是一張灰度圖(僅有一個顏色通道,如黑白照片)。
如果是彩色圖(如RGB),通道數為?3
1高度(Height)28?表示圖像的垂直像素數為28像素。
2寬度(Width)28?表示圖像的水平像素數為28像素。

MNIST 數據集是手寫數字的 灰度圖像,每個像素點的取值范圍為 0-255(黑白程度),因此 通道數為 1。圖像尺寸統一為 28×28 像素。

1.2 彩色圖像

在 PyTorch 中,圖像數據的形狀通常遵循 (通道數, 高度, 寬度) 的格式(即 Channel First 格式),這與常見的 (高度, 寬度, 通道數)(Channel Last,如 NumPy 數組)不同。—注意順序關系,

注意點:

  1. 如果用matplotlib庫來畫圖,需要轉換下順序,我們后續介紹
  2. 模型輸入通常需要 批次維度(Batch Size),形狀變為 (批次大小, 通道數, 高度, 寬度)。例如,批量輸入 10 張 MNIST 圖像時,形狀為 (10, 1, 28, 28)。
# 打印一張彩色圖像,用cifar-10數據集
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np# 設置隨機種子確保結果可復現
torch.manual_seed(42)
# 定義數據預處理步驟
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 標準化處理
])# 加載CIFAR-10訓練集
trainset = torchvision.datasets.CIFAR10(root='./data',train=True,download=True,transform=transform
)# 創建數據加載器
trainloader = torch.utils.data.DataLoader(trainset,batch_size=4,shuffle=True
)# 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]}")# 定義圖像顯示函數(適用于CIFAR-10彩色圖像)
def imshow(img):img = img / 2 + 0.5  # 反標準化處理,將圖像范圍從[-1,1]轉回[0,1]npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))  # 調整維度順序:(通道,高,寬) → (高,寬,通道)plt.axis('off')  # 關閉坐標軸顯示plt.show()# 顯示圖像
imshow(image)

注意,因為這里設計到圖像的顯示,所以就需要調整維度順序:(通道,高,寬) → (高,寬,通道)

二、 圖像相關的神經網絡的定義

考慮課程內容的推進,今日的內容只提定義,不涉及訓練和測試過程

2.1 黑白圖像模型的定義

# 先歸一化,再標準化
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差,這個值很出名,所以直接使用
])
import matplotlib.pyplot as plt# 2. 加載MNIST數據集,如果沒有會自動下載
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 定義兩層MLP神經網絡
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個神經元self.relu = nn.ReLU()  # 激活函數self.layer2 = nn.Linear(128, 10)  # 第二層:128個輸入,10個輸出(對應10個數字類別)def forward(self, x):x = self.flatten(x)  # 展平圖像x = self.layer1(x)   # 第一層線性變換x = self.relu(x)     # 應用ReLU激活函數x = self.layer2(x)   # 第二層線性變換,輸出logitsreturn 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("\n模型結構信息:")
summary(model, input_size=(1, 28, 28))  # 輸入尺寸為MNIST圖像尺寸

模型結構信息:
----------------------------------------------------------------
? ? ? ? Layer (type) ? ? ? ? ? ? ? Output Shape ? ? ? ? Param #
================================================================
? ? ? ? ? ?Flatten-1 ? ? ? ? ? ? ? ? ?[-1, 784] ? ? ? ? ? ? ? 0
? ? ? ? ? ?Linear-2? ? ? ? ? ? ? ? ? ?[-1, 128]? ? ? ? ? ? ? 100,480
? ? ? ? ? ?ReLU-3? ? ? ? ? ? ? ? ? ? [-1, 128] ? ? ? ? ? ? ? 0
? ? ? ? ? ?Linear-4? ? ? ? ? ? ? ? ? ?[-1, 10]? ? ? ? ? ? ? ? ?1,290
================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.00
Forward/backward pass size (MB): 0.01
Params size (MB): 0.39
Estimated Total Size (MB): 0.40
------------------------------------------------------------

我們關注和之前結構化MLP的差異

  1. 輸入需要展平操作

MLP 的輸入層要求輸入是一維向量,但 MNIST 圖像是二維結構(28×28 像素),形狀為 [1, 28, 28](通道 × 高 × 寬)。nn.Flatten()展平操作 將二維圖像 “拉成” 一維向量(784=28×28 個元素),使其符合全連接層的輸入格式。

其中不定義這個flatten方法,直接在前向傳播的過程中用 x = x.view(-1, 28 * 28) 將圖像展平為一維向量也可以實現

  1. 輸入數據的尺寸包含了通道數input_size=(1, 28, 28)

  2. 參數的計算

  • 第一層 layer1(全連接層)

權重參數:輸入維度 × 輸出維度 = 784 × 128 = 100,352

偏置參數:輸出維度 = 128

合計:100,352 + 128 = 100,480

  • 第二層 layer2(全連接層)

權重參數:輸入維度 × 輸出維度 = 128 × 10 = 1,280

偏置參數:輸出維度 = 10
合計:1,280 + 10 = 1,290

  • 總參數:100,480(layer1) + 1,290(layer2) = 101,770

2.2 彩色圖像模型的定義

class MLP(nn.Module):def __init__(self, input_size=3072, hidden_size=128, num_classes=10):super(MLP, self).__init__()# 展平層:將3×32×32的彩色圖像轉為一維向量# 輸入尺寸計算:3通道 × 32高 × 32寬 = 3072self.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)     # 激活函數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("\n模型結構信息:")
summary(model, input_size=(3, 32, 32))  # CIFAR-10 彩色圖像(3×32×32)

模型結構信息:
----------------------------------------------------------------
? ? ? ? Layer (type) ? ? ? ? ? ? ? Output Shape ? ? ? ? Param #
================================================================
? ? ? ? ? ?Flatten-1 ? ? ? ? ? ? ? ? [-1, 3072] ? ? ? ? ? ? ? 0
? ? ? ? ? ? Linear-2 ? ? ? ? ? ? ? ? ?[-1, 128] ? ? ? ? 393,344
? ? ? ? ? ? ? ReLU-3 ? ? ? ? ? ? ? ? ?[-1, 128] ? ? ? ? ? ? ? 0
? ? ? ? ? ? Linear-4 ? ? ? ? ? ? ? ? ? [-1, 10] ? ? ? ? ? 1,290
================================================================
Total params: 394,634
Trainable params: 394,634
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.01
Forward/backward pass size (MB): 0.03
Params size (MB): 1.51
Estimated Total Size (MB): 1.54
----------------------------------------------------------------

  • 第一層 layer1(全連接層)

權重參數:輸入維度 × 輸出維度 = 3072 × 128 = 393,216

偏置參數:輸出維度 = 128

合計:393,216 + 128 = 393,344

  • 第二層 layer2(全連接層)

權重參數:輸入維度 × 輸出維度 = 128 × 10 = 1,280

偏置參數:輸出維度 = 10

合計:1,280 + 10 = 1,290

  • 總參數:393,344(layer1) + 1,290(layer2) = 394,634

2.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 x

PyTorch 模型會自動處理 batch 維度(即第一維),無論 batch_size 是多少,模型的計算邏輯都不變。batch_size 是在數據加載階段定義的,與模型結構無關。

summary(model, input_size=(1, 28, 28))中的input_size不包含 batch 維度,只需指定樣本的形狀(通道 × 高 × 寬)。

總結:batch_size與模型定義的關系**

組件是否涉及batch_size示例代碼
模型定義? 完全無關class MLP(nn.Module)?中無需提及batch_size
torchsummary? 只需要樣本形狀(不含batch維度)summary(model, input_size=(1, 28, 28))
DataLoader? 在此設置batch_sizeDataLoader(dataset, batch_size=64)
訓練循環? 數據自動以batch形式輸入模型for data, target in train_loader: ...

三、顯存占用的主要組成部分

昨天說到了在面對數據集過大的情況下,由于無法一次性將數據全部加入到顯存中,所以采取了分批次加載這種方式。即一次只加載一部分數據,保證在顯存的范圍內。

那么顯存設置多少合適呢?如果設置的太小,那么每個batchsize的訓練不足以發揮顯卡的能力,浪費計算資源;如果設置的太大,會出現OOT(out of memory)

顯存一般被以下內容占用:

  1. 模型參數與梯度:模型的權重(Parameters)和對應的梯度(Gradients)會占用顯存,尤其是深度神經網絡(如 Transformer、ResNet 等),一個 1 億參數的模型(如 BERT-base),單精度(float32)參數占用約 400MB(1e8×4Byte),加上梯度則翻倍至 800MB(每個權重參數都有其對應的梯度)。

  2. 部分優化器(如 Adam)會為每個參數存儲動量(Momentum)和平方梯度(Square Gradient),進一步增加顯存占用(通常為參數大小的 2-3 倍)

  3. 其他開銷。

下面以手寫數據集為例

from torch.utils.data import DataLoader# 定義訓練集的數據加載器,并指定batch_size
train_loader = DataLoader(dataset=train_dataset,  # 加載的數據集batch_size=64,          # 每次加載64張圖像shuffle=True            # 訓練時打亂數據順序
)# 定義測試集的數據加載器(通常batch_size更大,減少測試時間)
test_loader = DataLoader(dataset=test_dataset,batch_size=1000,shuffle=False
)

手寫數據集(MNIST)和當前 MLP 模型,顯存占用的計算可以簡化為以下幾個部分。

3.1 模型參數與梯度(FP32 精度)

參數總量:101,770 個參數

  • 1字節(Byte)= 8位(bit),是計算機存儲的最小尋址單位。
  • 位(bit)是二進制數的最小單位(0或1),例如0b1010表示4位二進制數。
  • 1KB=1024字節;1MB=1024KB=1,048,576字節

常見數據類型的字節占用

數據類型位數(bit)字節(Byte)數值范圍(近似)
float32(單精度浮點數)324±1.7×10^38
float64(雙精度浮點數)648±1.8×10^308
uint8(無符號8位整數)810~255
  • MNIST數據集的原始圖像像素值為0-255的整數(uint8類型,占1字節),表示灰度值(0=黑,255=白)。
  • 但PyTorch的transforms.ToTensor()會將其歸一化到[0, 1]范圍,并轉換為?float32類型(浮點型更適合神經網絡計算)。

計算示例:單張MNIST圖像的顯存占用

  1. 原始像素值(uint8,未轉換時)

    • 尺寸:28×28像素
    • 單像素占用:1字節(uint8)
    • 總占用:28×28×1 = 784字節 ≈ 0.766 KB
  2. 轉換為float32張量后

    • 尺寸:1×28×28(通道×高×寬)
    • 單像素占用:4字節(float32)
    • 總占用:1×28×28×4 = 3136字節 ≈ 3.06 KB

單精度(float32)參數占用:101,770 × 4 Byte ≈ 403 KB

梯度是損失函數對模型參數的導數(?Loss/?Weight),用于指示參數更新的方向和幅度。梯度是損失函數對模型參數的導數(?Loss/?Weight),用于指示參數更新的方向和幅度。因此在默認情況下,梯度的數據類型和數目與參數相同。

梯度占用(反向傳播時):與參數相同,合計約 806 KB

3.2?優化器狀態

SGD
  • SGD優化器不存儲額外動量,因此無額外顯存占用。
  • SGD 隨機梯度下降,最基礎的優化器,直接沿梯度反方向更新參數。
  • 參數更新公式:w = w - learning_rate * gradient
Adam
  • Adam優化器:自適應學習率優化器,結合了動量(Momentum)和梯度平方的指數移動平均。
  • 每個參數存儲動量(m)和平方梯度(v),占用約?101,770 × 8 Byte ≈ 806 KB
  • 動量(m):每個參數對應一個動量值,數據類型與參數相同(float32),占用 403 KB。
  • 梯度平方(v):每個參數對應一個梯度平方值,數據類型與參數相同(float32),占用 403 KB。

3.3?數據批量(batch_size)的顯存占用

  • 單張圖像尺寸1×28×28(通道×高×寬),歸一化轉換為張量后為float32類型
    • 單張圖像顯存占用:1×28×28×4 Byte = 3,136 Byte ≈ 3 KB
  • 批量數據占用batch_size × 單張圖像占用
    • 例如:batch_size=64?時,數據占用為?64×3 KB ≈ 192 KB
    • batch_size=1024?時,數據占用為?1024×3 KB ≈ 3 MB

3.4.?前向/反向傳播中間變量

  • 對于兩層MLP,中間變量(如layer1的輸出)占用較小:
    • batch_size×128維向量:batch_size×128×4 Byte = batch_size×512 Byte
    • 例如batch_size=1024時,中間變量約?512 KB

以SGD為例,此時其他參數占用固定,batchsize會影響顯存占用

batch_size數據占用中間變量總顯存占用(近似)
64192 KB32 KB~1 MB
256768 KB128 KB~1.7 MB
10243 MB512 KB~4.5 MB
409612 MB2 MB~15 MB

在 PyTorch 中,在使用DataLoader加載數據時,如果不指定batch_size參數,默認值是1

,即每次迭代返回一個樣本。這與一次性使用全部數據進行訓練是完全不同的概念。如果想要一次性使用全部數據進行訓練,需要手動將batch_size設置為數據集的大小,但對于大型數據集,這樣做通常會導致內存不足,因為一次性將所有數據加載到內存中可能會超出硬件的內存限制。

大規模數據時,通常從16開始測試,然后逐漸增加,確保代碼運行正常且不報錯,直到出現 內存不足(OOM)報錯 或訓練效果下降,此時選擇略小于該值的 batch_size。

訓練時候搭配 nvidia-smi 監控顯存占用,合適的 batch_size = 硬件顯存允許的最大值 × 0.8(預留安全空間),并通過訓練效果驗證調整。

補充說明: batchsize對于訓練的影響

在深度學習中,使用較大的 batch_size(批量大小)相比單樣本訓練(batch_size=1)有以下核心優勢

  • 并行計算能力最大化,減小訓練時間;且大幅減少更新次數
  • 梯度方向更準確,單樣本訓練的梯度僅基于單個數據點,可能包含大量噪聲(尤其是數據分布不均或存在異常值時)。大 batch_size 的梯度是多個樣本的平均值,能抵消單個樣本的隨機性,梯度方向更接近真實分布的 “全局最優方向”。會讓訓練過程更穩定,波動更小
場景計算過程參數更新方式
batch_size=1計算1個樣本的損失? L_1? → 反向傳播得到梯度? g_1?直接用 g_1? 更新參數
batch_size=12計算12個樣本的損失? L_1, L_2, …, L_{12}? → 分別求梯度 g_1, g_2, …, g_{12} → 計算平均梯度
gˉ={g_1 + g_2 + … + g_{12}}/12
用平均梯度?gˉ 更新參數

@浙大疏錦行

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

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

相關文章

從大數據視角理解時序數據庫選型:為何選擇 Apache IoTDB?

目錄一、什么是時序數據庫?為什么你需要它?🔧典型應用場景:二、時序數據庫選型維度有哪些?三、為什么推薦 Apache IoTDB?🧠 Apache 頂級項目,工業 IoT 場景原生支持🚀 性…

[ MySQL 數據庫 ] 環境安裝配置和使用

目錄 一. 數據庫(DataBase) 1.定義: 2. 常見的數據庫產品: 3. MySQL數據庫 (1). 介紹 : (2). cmd命令行方式連接 MySQL (3). MySQL的常用命令 二. MySQL數據庫 環境安裝及配置 三. SQL 1.定義 : 2. DDL (1)數據庫 (2)數據表 1. 字段(列)和記錄(行) 2. 表特征 3.…

Numpy科學計算與數據分析:Numpy布爾索引與花式索引實戰

Numpy高級索引 學習目標 通過本課程,學員將掌握Numpy中布爾索引和花式索引的使用方法,能夠靈活運用這些高級索引技術進行復雜的數據操作和處理。 相關知識點 Numpy高級索引 學習內容 1 Numpy高級索引 1.1 布爾索引 布爾索引是Numpy中一種非常強大…

【Linux】patch補丁的生成與使用方法總結

引言 在 Linux 和開源世界中,patch 是一個極其強大且常用的工具。它允許開發者和系統管理員以增量方式修改文件,特別適用于源代碼的更新、錯誤修復、功能補丁的分發與應用。 目錄 引言 一、patch介紹 二、生成補丁文件 三、補丁文件內容解析 四、p…

雜談 001 · VScode / Copilot 25.08 更新

原文鏈接https://www.castamerego.com/blog/talk-001 2025.08.08 , VS code 發布八月更新,同一天 Copilot 也更新了 GPT-5, 淺體驗一下 VS code 更新 發行說明更新頁面內跳轉顯示 AI 比例頁面內跳轉 Copilot 更新 對話回溯 checkpoints頁面內跳轉進度列表頁面內…

微軟發布Project Ire項目:可自主檢測惡意軟件的人工智能系統

微軟Project Ire項目利用AI自主逆向工程并分類軟件性質微軟近日公布了Project Ire項目,這是一個能夠自主進行逆向工程并分類軟件性質的人工智能(AI)系統。該系統由大型語言模型(LLM)驅動,通過使用反編譯器等…

k8s核心組件——kubelet詳解

🚀Kubernetes 核心組件解析:什么是 Kubelet?它的作用是什么? 在 Kubernetes(K8s)集群中,Kubelet 是最重要的 Node 組件之一,它負責管理和維護 Pod 的生命周期,確保容器在…

C++ 部署LSTM(.onnx)

0、 背景 在工業自動化控制領域,預測某些變量是否關鍵。根據工廠的數據,訓練好模型之后,將其轉我通用的onnx 模型,并實現高效的推理。 模型訓練 import numpy as np from para import * from data_utils import MyDataset from da…

深度學習-卷積神經網絡CNN-1×1卷積層

1x1卷積核,又稱為網中網(Network in Network):NIN卷積的本質是有效提取相鄰像素間的相關特征,而11的卷積顯然沒有此作用。它失去了卷積層的特有能力——在高度和寬度維度上,識別相鄰元素間相互作用的能力。…

使用 Python 異步爬蟲抓取豆瓣電影Top250排行榜

導讀 在現代網絡爬蟲開發中,面對 海量網頁數據、慢速響應的網絡接口,傳統的同步爬蟲方式已經不能滿足高效抓取需求。本文將手把手帶你構建一個 基于 aiohttp + asyncio 的異步爬蟲系統,實戰目標是抓取豆瓣電影 Top250 排行榜中的電影名稱、評分和詳情頁地址。 目錄 導讀 …

云原生開發全面解析:從核心理念到實踐挑戰與解決方案

1. 云原生開發的核心理念與定義 云原生(Cloud Native)是一種基于云計算環境設計和運行應用程序的方法論,其三大技術支柱為容器化、微服務和聲明式API。根據CNCF定義,云原生技術通過標準化接口和自動化管理,使應用具備…

WebForms 實例

WebForms 實例 引言 WebForms 是 ASP.NET 技術中的一種重要技術,它允許開發者以表單的形式創建動態網頁。本文將通過具體的實例,深入探討 WebForms 的基本概念、實現方法以及在實際項目中的應用。 WebForms 簡介 WebForms 是一種用于創建動態網頁的框架,它允許開發者以類…

Java 之 多態

一、多態 多態故名思義,多種狀態。比如Animal 這個類中,eat 方法是 公共的方法,但是當 People,Dog , Cat,繼承時,我們知道人要吃的是米飯,狗要吃的是狗糧,貓要吃的是貓糧。所以當不同類型的引用…

文件結構樹的├、└、─ 符號

目錄一、├、└、─符號的背景二、├、└、─ 符號的含義2.1 ├ 帶豎線的分支符號2.2 └不帶豎線的分支符號2.3 ─橫線符號三、Windows系統中生成目錄樹一、├、└、─符號的背景 我們在編程中,可能會經常遇到一些特殊符號├、└、─。這并非偶然,二十由…

微軟XBOX游戲部門大裁員

近日有報道稱,微軟正計劃對Xbox游戲部門進行另外一次裁員,影響的將是整個團隊,而不是特定崗位或者部門,大概10%至20%的Xbox團隊成員受到影響,這是微軟這次對Xbox業務重組的一部分。 據報道,微軟已經開始新…

【關于Java 8 的新特性】

問:“Java 8 有啥新東西?” 你憋了半天,只說出一句:“嗯……有 Lambda 表達式。”別慌!Java 8 可不只是“語法糖”那么簡單。它是一次真正讓 Java 從“老派”走向“現代” 的大升級!一、Lambda 表達式&…

《嵌入式數據結構筆記(六):二叉樹》

1. ??樹數據結構的基本定義和屬性??樹是一種重要的非線性數據結構,用于表示層次關系。??基本定義??:樹是由 n(n ≥ 0)個結點組成的有限集合。當 n 0 時,稱為空樹;當 n > 0 時,樹必須…

sqlite的sql語法與技術架構研究

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu) 參考:參考提示詞與豆包AI交互輸出內容。 sqlite作為最常用的本地數據庫,其支持的sql語法也比較全面,歷經了二十多年經久不衰,其技術架構設計也是非常優秀的。 一&#xff1a…

Javascript中的一些常見設計模式

1. 單例模式(Singleton Pattern) 核心思想 一個類只能有一個實例,并提供一個全局訪問點。 場景 全局緩存Vuex / Redux 中的 store瀏覽器中的 localStorage 管理類 示例 const Singleton (function () {let instance;function createInstance…

2025 年最佳 AI 代理:工具、框架和平臺比較

目錄 什么是 AI Agents 應用 最佳 AI Agents:綜合列表 LangGraph AutoGen CrewAI OpenAI Agents SDK Google Agent Development Kit (ADK) 最佳no-code和open-source AI Agents Dify AutoGPT n8n Rasa BotPress 最佳預構建企業 AI agents Devin AI …