Day40 訓練和測試的規范寫法

目錄

一、彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中

單通道圖片的規范寫法

彩色圖片的規范寫法

二、展平操作:除第一個維度batchsize外全部展平

圖像任務中的張量形狀

NLP任務中的張量形狀

1.?Flatten操作

2.?view/reshape操作

總結

三、dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout


一、彩色和灰度圖片測試和訓練的規范寫法:封裝在函數中

圖像數據的格式以及模型定義的過程,和之前結構化數據的略有不同,主要差異體現在2處

  1. 模型定義的時候需要展平圖像
  2. 由于數據過大,需要將數據集進行分批次處理,這往往涉及到了dataset和dataloader來規范代碼的組織

現在把注意力放在訓練和測試代碼的規范寫法上

單通道圖片的規范寫法

# 先繼續之前的代碼
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
import warnings
# 忽略警告信息
warnings.filterwarnings("ignore")
# 設置隨機種子,確保結果可復現
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")

?

# 1. 數據預處理
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差
])# 2. 加載MNIST數據集
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 3. 創建數據加載器
batch_size = 64  # 每批處理64個樣本
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義模型、損失函數和優化器
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()
model = model.to(device)  # 將模型移至GPU(如果可用)# from torchsummary import summary  # 導入torchsummary庫
# print("\n模型結構信息:")
# summary(model, input_size=(1, 28, 28))  # 輸入尺寸為MNIST圖像尺寸criterion = nn.CrossEntropyLoss()  # 交叉熵損失函數,適用于多分類問題
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam優化器
# 5. 訓練模型(記錄每個 iteration 的損失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 設置為訓練模式# 新增:記錄每個 iteration 的損失all_iter_losses = []  # 存儲所有 batch 的損失iter_indices = []     # 存儲 iteration 序號(從1開始)for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):# enumerate() 是 Python 內置函數,用于遍歷可迭代對象(如列表、元組)并同時獲取索引和值。# batch_idx:當前批次的索引(從 0 開始)# (data, target):當前批次的樣本數據和對應的標簽,是一個元組,這是因為dataloader內置的getitem方法返回的是一個元組,包含數據和標簽。# 只需要記住這種固定寫法即可data, target = data.to(device), target.to(device)  # 移至GPU(如果可用)optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向傳播loss = criterion(output, target)  # 計算損失loss.backward()  # 反向傳播optimizer.step()  # 更新參數# 記錄當前 iteration 的損失(注意:這里直接使用單 batch 損失,而非累加平均)iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)  # iteration 序號從1開始# 統計準確率和損失running_loss += loss.item() #將loss轉化為標量值并且累加到running_loss中,計算總損失_, predicted = output.max(1) # output:是模型的輸出(logits),形狀為 [batch_size, 10](MNIST 有 10 個類別)# 獲取預測結果,max(1) 返回每行(即每個樣本)的最大值和對應的索引,這里我們只需要索引total += target.size(0) # target.size(0) 返回當前批次的樣本數量,即 batch_size,累加所有批次的樣本數,最終等于訓練集的總樣本數correct += predicted.eq(target).sum().item() # 返回一個布爾張量,表示預測是否正確,sum() 計算正確預測的數量,item() 將結果轉換為 Python 數字# 每100個批次打印一次訓練信息(可選:同時打印單 batch 損失)if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')# 測試、打印 epoch 結果epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')# 繪制所有 iteration 的損失曲線plot_iter_losses(all_iter_losses, iter_indices)# 保留原 epoch 級曲線(可選)# plot_metrics(train_losses, test_losses, train_accuracies, test_accuracies, epochs)return epoch_test_acc  # 返回最終測試準確率

?之前用mlp訓練鳶尾花數據集的時候并沒有用函數的形式來封裝訓練和測試過程,這樣寫會讓代碼更加具有邏輯-----隔離參數和內容。

  1. 后續直接修改參數就行,不需要去找到對應操作的代碼
  2. 方便復用,未來有多模型對比時,就可以復用這個函數

這里先不寫早停策略,因為規范的早停策略需要用到驗證集,一般還需要劃分測試集

  1. 劃分數據集:訓練集(用于訓練)、驗證集(用于早停和調參)、測試集(用于最終報告性能)。
  2. 在訓練過程中,使用驗證集觸發早停。
  3. 訓練結束后,僅用測試集運行一次測試函數,得到最終準確率。

測試函數和繪圖函數均被封裝在了train函數中,但是test和繪圖函數在定義train函數之后,這是因為在 Python 中,函數定義的順序不影響調用,只要在調用前已經完成定義即可。

# 6. 測試模型(不變)
def test(model, test_loader, criterion, device):model.eval()  # 設置為評估模式test_loss = 0correct = 0total = 0with torch.no_grad():  # 不計算梯度,節省內存和計算資源for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()avg_loss = test_loss / len(test_loader)accuracy = 100. * correct / totalreturn avg_loss, accuracy  # 返回損失和準確率

如果打印每一個bitchsize的損失和準確率,會看的更加清晰,更加直觀?

# 7. 繪制每個 iteration 的損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('每個 Iteration 的訓練損失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()
# 8. 執行訓練和測試(設置 epochs=2 驗證效果)
epochs = 2  
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")

?

?下面是所有代碼的整合版本

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 1. 數據預處理
transform = transforms.Compose([transforms.ToTensor(),  # 轉換為張量并歸一化到[0,1]transforms.Normalize((0.1307,), (0.3081,))  # MNIST數據集的均值和標準差
])# 2. 加載MNIST數據集
train_dataset = datasets.MNIST(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.MNIST(root='./data',train=False,transform=transform
)# 3. 創建數據加載器
batch_size = 64  # 每批處理64個樣本
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義模型、損失函數和優化器
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# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化模型
model = MLP()
model = model.to(device)  # 將模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss()  # 交叉熵損失函數,適用于多分類問題
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam優化器# 5. 訓練模型(記錄每個 iteration 的損失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 設置為訓練模式# 新增:記錄每個 iteration 的損失all_iter_losses = []  # 存儲所有 batch 的損失iter_indices = []     # 存儲 iteration 序號(從1開始)for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)  # 移至GPU(如果可用)optimizer.zero_grad()  # 梯度清零output = model(data)  # 前向傳播loss = criterion(output, target)  # 計算損失loss.backward()  # 反向傳播optimizer.step()  # 更新參數# 記錄當前 iteration 的損失(注意:這里直接使用單 batch 損失,而非累加平均)iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)  # iteration 序號從1開始# 統計準確率和損失(原邏輯保留,用于 epoch 級統計)running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 每100個批次打印一次訓練信息(可選:同時打印單 batch 損失)if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')# 原 epoch 級邏輯(測試、打印 epoch 結果)不變epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totalepoch_test_loss, epoch_test_acc = test(model, test_loader, criterion, device)print(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')# 繪制所有 iteration 的損失曲線plot_iter_losses(all_iter_losses, iter_indices)# 保留原 epoch 級曲線(可選)# plot_metrics(train_losses, test_losses, train_accuracies, test_accuracies, epochs)return epoch_test_acc  # 返回最終測試準確率# 6. 測試模型
def test(model, test_loader, criterion, device):model.eval()  # 設置為評估模式test_loss = 0correct = 0total = 0with torch.no_grad():  # 不計算梯度,節省內存和計算資源for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()avg_loss = test_loss / len(test_loader)accuracy = 100. * correct / totalreturn avg_loss, accuracy  # 返回損失和準確率# 7.繪制每個 iteration 的損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('每個 Iteration 的訓練損失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 8. 執行訓練和測試(設置 epochs=2 驗證效果)
epochs = 2  
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")

?

?

彩色圖片的規范寫法

彩色的通道也是在第一步被直接展平,其他代碼一致

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import numpy as np# 設置中文字體支持
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 1. 數據預處理
transform = transforms.Compose([transforms.ToTensor(),                # 轉換為張量transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 標準化處理
])# 2. 加載CIFAR-10數據集
train_dataset = datasets.CIFAR10(root='./data',train=True,download=True,transform=transform
)test_dataset = datasets.CIFAR10(root='./data',train=False,transform=transform
)# 3. 創建數據加載器
batch_size = 64
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False)# 4. 定義MLP模型(適應CIFAR-10的輸入尺寸)
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.flatten = nn.Flatten()  # 將3x32x32的圖像展平為3072維向量self.layer1 = nn.Linear(3072, 512)  # 第一層:3072個輸入,512個神經元self.relu1 = nn.ReLU()self.dropout1 = nn.Dropout(0.2)  # 添加Dropout防止過擬合self.layer2 = nn.Linear(512, 256)  # 第二層:512個輸入,256個神經元self.relu2 = nn.ReLU()self.dropout2 = nn.Dropout(0.2)self.layer3 = nn.Linear(256, 10)  # 輸出層:10個類別def forward(self, x):# 第一步:將輸入圖像展平為一維向量x = self.flatten(x)  # 輸入尺寸: [batch_size, 3, 32, 32] → [batch_size, 3072]# 第一層全連接 + 激活 + Dropoutx = self.layer1(x)   # 線性變換: [batch_size, 3072] → [batch_size, 512]x = self.relu1(x)    # 應用ReLU激活函數x = self.dropout1(x) # 訓練時隨機丟棄部分神經元輸出# 第二層全連接 + 激活 + Dropoutx = self.layer2(x)   # 線性變換: [batch_size, 512] → [batch_size, 256]x = self.relu2(x)    # 應用ReLU激活函數x = self.dropout2(x) # 訓練時隨機丟棄部分神經元輸出# 第三層(輸出層)全連接x = self.layer3(x)   # 線性變換: [batch_size, 256] → [batch_size, 10]return x  # 返回未經過Softmax的logits# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 初始化模型
model = MLP()
model = model.to(device)  # 將模型移至GPU(如果可用)criterion = nn.CrossEntropyLoss()  # 交叉熵損失函數
optimizer = optim.Adam(model.parameters(), lr=0.001)  # Adam優化器# 5. 訓練模型(記錄每個 iteration 的損失)
def train(model, train_loader, test_loader, criterion, optimizer, device, epochs):model.train()  # 設置為訓練模式# 記錄每個 iteration 的損失all_iter_losses = []  # 存儲所有 batch 的損失iter_indices = []     # 存儲 iteration 序號for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)  # 移至GPUoptimizer.zero_grad()  # 梯度清零output = model(data)  # 前向傳播loss = criterion(output, target)  # 計算損失loss.backward()  # 反向傳播optimizer.step()  # 更新參數# 記錄當前 iteration 的損失iter_loss = loss.item()all_iter_losses.append(iter_loss)iter_indices.append(epoch * len(train_loader) + batch_idx + 1)# 統計準確率和損失running_loss += iter_loss_, predicted = output.max(1)total += target.size(0)correct += predicted.eq(target).sum().item()# 每100個批次打印一次訓練信息if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch+1}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')# 計算當前epoch的平均訓練損失和準確率epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / total# 測試階段model.eval()  # 設置為評估模式test_loss = 0correct_test = 0total_test = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += criterion(output, target).item()_, predicted = output.max(1)total_test += target.size(0)correct_test += predicted.eq(target).sum().item()epoch_test_loss = test_loss / len(test_loader)epoch_test_acc = 100. * correct_test / total_testprint(f'Epoch {epoch+1}/{epochs} 完成 | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')# 繪制所有 iteration 的損失曲線plot_iter_losses(all_iter_losses, iter_indices)return epoch_test_acc  # 返回最終測試準確率# 6. 繪制每個 iteration 的損失曲線
def plot_iter_losses(losses, indices):plt.figure(figsize=(10, 4))plt.plot(indices, losses, 'b-', alpha=0.7, label='Iteration Loss')plt.xlabel('Iteration(Batch序號)')plt.ylabel('損失值')plt.title('每個 Iteration 的訓練損失')plt.legend()plt.grid(True)plt.tight_layout()plt.show()# 7. 執行訓練和測試
epochs = 20  # 增加訓練輪次以獲得更好效果
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")# # 保存模型
# torch.save(model.state_dict(), 'cifar10_mlp_model.pth')
# # print("模型已保存為: cifar10_mlp_model.pth")

?

二、展平操作:除第一個維度batchsize外全部展平

在PyTorch中處理張量(Tensor)時,以下是關于展平(Flatten)、維度調整(如view/reshape)等操作的關鍵點,這些操作通常不會影響第一個維度(即批量維度batch_size):

圖像任務中的張量形狀

輸入張量的形狀通常為:
(batch_size, channels, height, width)
例如:(batch_size, 3, 28, 28)
其中,batch_size?代表一次輸入的樣本數量。

NLP任務中的張量形狀

輸入張量的形狀可能為:
(batch_size, sequence_length)
此時,batch_size?同樣是第一個維度。

1.?Flatten操作

  • 功能:將張量展平為一維數組,但保留批量維度。
  • 示例
    • 輸入形狀(batch_size, 3, 28, 28)(圖像數據)
    • Flatten后形狀(batch_size, 3×28×28)?=?(batch_size, 2352)
    • 說明:第一個維度batch_size不變,后面的所有維度被展平為一個維度。

2.?view/reshape操作

  • 功能:調整張量維度,但必須顯式保留或指定批量維度。
  • 示例
    • 輸入形狀(batch_size, 3, 28, 28)
    • 調整為(batch_size, -1)
    • 結果:展平為兩個維度,保留batch_size,第二個維度自動計算為3×28×28=2352

總結

  • 批量維度不變性:無論進行flatten、view還是reshape操作,第一個維度batch_size通常保持不變。
  • 動態維度指定:使用-1讓PyTorch自動計算該維度的大小,但需確保其他維度的指定合理,避免形狀不匹配錯誤。

三、dropout操作:訓練階段隨機丟棄神經元,測試階段eval模式關閉dropout

由于深度mlp的參數過多,為了避免過擬合在這里引入了dropout這個操作,他可以在訓練階段隨機丟棄一些神經元,避免過擬合情況。dropout的取值也是超參數。

在測試階段,由于開啟了eval模式,會自動關閉dropout。

可以繼續調用這個函數來復用(繼續彩色圖片)

# 7. 執行訓練和測試
epochs = 20  # 增加訓練輪次以獲得更好效果
print("開始訓練模型...")
final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")

此時會發現MLP(多層感知機)在圖像任務上表現較差(即使增加深度和輪次也只能達到 50-55% 準確率),主要原因與圖像數據的空間特性和MLP 的結構缺陷密切相關。

  1. MLP 的每一層都是全連接層,輸入圖像會被展平為一維向量(如 CIFAR-10 的 32x32x3 圖像展平為 3072 維向量)。圖像中相鄰像素通常具有強相關性(如邊緣、紋理),但 MLP 將所有像素視為獨立特征,無法利用局部空間結構。例如,識別 “汽車輪胎” 需要鄰近像素的組合信息,而 MLP 需通過大量參數單獨學習每個像素的關聯,效率極低。
  2. 深層 MLP 的參數規模呈指數級增長,容易過擬合

所以接下來將會學習CNN架構,CNN架構的參數規模相對較小,且訓練速度更快,而且CNN架構可以解決圖像識別問題,而MLP不能。

@浙大疏錦行?

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

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

相關文章

Linux 文件 I/O 與標準 I/O 緩沖機制詳解

一、什么是標準 I/O?(FILE* 接口) 標準 I/O 是 C 標準庫為我們提供的一套高級文件操作接口,核心基于結構體 FILE,常見函數如: fopen() / fclose() fread() / fwrite() fprintf() / fscanf() fflush() /…

C++的前世今生-C++11

C98(ISO/IEC 14882:1998) C98 是 C 的第一個標準化版本(ISO/IEC 14882:1998),它正式確立了 C 的核心語言特性和標準庫。以下是 C98 的主要特性總結: 一、核心語言特性** 模板(Templates&…

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么 詞編碼模型的訓練本質是通過數據驅動的方式,將離散的文本符號映射為連續的語義向量。 一、訓練機制:從符號到向量的映射邏輯 1. 核心目標 將單詞/子詞(Token)映射為低維向量,使語義相關的詞在向量空間中距離更近…

【Linux指南】文件管理高級操作(復制、移動、查找)

引言 在Linux系統管理中,文件的復制、移動與查找是比基礎操作更進階的核心技能,它們構成了高效管理文件系統的"三駕馬車"。當我們需要備份重要數據、重構目錄結構或在龐大的文件系統中定位目標文件時,cp、mv、find等命令將成為最得…

【棧】-----【小C的記事本】

小C的記事本 題目描述 小C最近學會了 Java 小程序的開發,他很開心,于是想做一個簡單的記事本程序練練手。 他希望他的記事本包含以下功能: append(str):向記事本插入字符串 str(英文字符)。delete(k)&am…

技能系統詳解(2)——特效表現

特效會有個EffectManager用于統一管理所有特效,技能特效只是各類特效中的一種 EffectManager需要提供特效的創建,返回被封裝為EffectHandle 每類特效都有各種不同的配置參數,這些配置參數會傳遞給EffectManager用于生成EffectHandler 為支…

12.OpenCV—基礎入門

01讀取圖像 02創建空白圖像 03保存圖像 04更改圖像亮度 05更改圖像對比度 06灰度直方圖均衡 07彩色直方圖均衡 08五種濾波方式 09形態學操作 10仿射變換 11角度縮放仿射變換 12透視變換 13坐標映射 14模板匹配 15多模板匹配 16查找輪廓線 17輪廓線匹配 17繪制…

【Python】Python之什么是生成器?什么是迭代器?

目錄 專欄導讀前言什么是迭代器(Iterator)?迭代器的定義迭代器協議可迭代對象 vs 迭代器自定義迭代器迭代器的優勢 什么是生成器(Generator)?生成器的定義生成器函數生成器表達式復雜的生成器示例生成器的狀…

Python中實現簡單爬蟲并處理數據

在當今數據驅動的時代,能夠從互聯網上高效地抓取信息變得越來越重要。Python因其簡潔易學的特性,成為了編寫網絡爬蟲的首選語言之一。接下來,我將介紹如何使用Python來實現一個基礎的網絡爬蟲,并對收集到的數據進行初步處理。 首先…

免費wordpress主題網

免費WordPress主題網 WP模板牛 WP模板牛是一個提供免費WordPress主題的網站,用戶可以在這里找到大量高質量的模板,適用于各種網站類型。該網站致力于為用戶提供簡單、高效的建站體驗。 官網鏈接: https://wpniu.com 建站哥模板 建站哥模板…

為什么需要MyBatis-Plus條件構造器?

目錄 前言 一、傳統SQL編寫的痛點 二、條件構造器的核心優勢 1. 防SQL注入(安全性) 2. 面向對象編程(可讀性) 3. 動態條件構建(靈活性) 4. 數據庫無關性(可移植性) 三、典型應…

【從零學習JVM|第九篇】常見的垃圾回收算法和垃圾回收器

前言: 我們知道在堆內存中,會有自動的垃圾回收功能,那今天這篇文章將會向你介紹,這個功能實現的方式,還有實現的對象,接下來就由我來給你們詳細介紹垃圾回收的算法和實現算法的回收器。 目錄 前言&#…

品牌竄貨治理解決方案

在渠道網絡的暗潮中,竄貨猶如隱秘的漩渦,某知名白酒品牌曾因區域竄貨導致終端價格體系崩潰,半年內損失超3億元。竄貨行為不僅破壞市場秩序,更會引發信任危機。隨著電商平臺的多元化與分銷層級的復雜化,品牌方亟需構建一…

車載電子電器架構 --- 法律和標準對電子電氣架構的影響

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

一種通用跨平臺實現SEH的解決方案

一. 前言 眾所周知,在軟件的代碼中,處理軟件本身的邏輯只要大約1/3的代碼,另外2/3的代碼實際上是在處理各種各樣的異常情況。 這些異常情況一方面是因為不同用戶之間不同的硬件軟件環境要處理。另一方面是程序中可能出現的bug。比較典型的情…

25.6.19學習總結

什么是堆(Heap)? 堆是一種特殊的樹形數據結構,它滿足以下兩個主要屬性: 結構性(完全二叉樹): 堆總是一個完全二叉樹 (Complete Binary Tree)。這意味著,除了最后一層&am…

【前后前】導入Excel文件閉環模型:Vue3前端上傳Excel文件,【Java后端接收、解析、返回數據】,Vue3前端接收展示數據

【前后前】導入Excel文件閉環模型&#xff1a;Vue3前端上傳Excel文件&#xff0c;【Java后端接收、解析、返回數據】&#xff0c;Vue3前端接收展示數據 一、Vue3前端上傳&#xff08;導入&#xff09;Excel文件 ReagentInDialog.vue <script setup lang"ts" na…

網絡基礎入門:從OSI模型到TCP/IP協議詳解

網絡基礎入門&#xff1a;從OSI模型到TCP/IP協議詳解 一、網絡基礎概念與OSI七層模型 1.1 網絡通信的本質 計算機網絡的核心是將抽象語言轉換為二進制數據進行傳輸與計算&#xff0c;這一過程涉及多層抽象與轉換&#xff1a; 應用層&#xff1a;人機交互—抽象語言------編…

Linux致命漏洞CVE-2025-6018和CVE-2025-6019

Qualys 最近披露了兩個影響主流 Linux 發行版的本地權限提升 (LPE) 漏洞&#xff0c;分別是 CVE-2025-6018 和 CVE-2025-6019。這兩個漏洞可以被串聯利用&#xff0c;使得非特權用戶在幾秒鐘內獲得系統的 root 權限&#xff0c;從而實現對系統的完全控制。 一、漏洞詳情 這兩…

【Docker基礎】Docker鏡像管理:docker push詳解

目錄 引言 1 Docker鏡像推送基礎概念 1.1 什么是Docker鏡像推送 1.2 鏡像倉庫概述 1.3 鏡像標簽與版本控制 2 docker push命令詳解 2.1 基本語法 2.2 常用參數選項 2.3 實際命令示例 2.4 推送流程 2.5 步驟描述 3 鏡像推送實踐示例 3.1 登錄管理 3.2 標簽管理 3…