python打卡day50

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# 定義通道注意力
class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio=16):"""通道注意力機制初始化參數:in_channels: 輸入特征圖的通道數ratio: 降維比例,用于減少參數量,默認為16"""super().__init__()# 全局平均池化,將每個通道的特征圖壓縮為1x1,保留通道間的平均值信息self.avg_pool = nn.AdaptiveAvgPool2d(1)# 全局最大池化,將每個通道的特征圖壓縮為1x1,保留通道間的最顯著特征self.max_pool = nn.AdaptiveMaxPool2d(1)# 共享全連接層,用于學習通道間的關系# 先降維(除以ratio),再通過ReLU激活,最后升維回原始通道數self.fc = nn.Sequential(nn.Linear(in_channels, in_channels // ratio, bias=False),  # 降維層nn.ReLU(),  # 非線性激活函數nn.Linear(in_channels // ratio, in_channels, bias=False)   # 升維層)# Sigmoid函數將輸出映射到0-1之間,作為各通道的權重self.sigmoid = nn.Sigmoid()def forward(self, x):"""前向傳播函數參數:x: 輸入特征圖,形狀為 [batch_size, channels, height, width]返回:調整后的特征圖,通道權重已應用"""# 獲取輸入特征圖的維度信息,這是一種元組的解包寫法b, c, h, w = x.shape# 對平均池化結果進行處理:展平后通過全連接網絡avg_out = self.fc(self.avg_pool(x).view(b, c))# 對最大池化結果進行處理:展平后通過全連接網絡max_out = self.fc(self.max_pool(x).view(b, c))# 將平均池化和最大池化的結果相加并通過sigmoid函數得到通道權重attention = self.sigmoid(avg_out + max_out).view(b, c, 1, 1)# 將注意力權重與原始特征相乘,增強重要通道,抑制不重要通道return x * attention #這個運算是pytorch的廣播機制## 空間注意力模塊
class SpatialAttention(nn.Module):def __init__(self, kernel_size=7):super().__init__()self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# 通道維度池化avg_out = torch.mean(x, dim=1, keepdim=True)  # 平均池化:(B,1,H,W)max_out, _ = torch.max(x, dim=1, keepdim=True)  # 最大池化:(B,1,H,W)pool_out = torch.cat([avg_out, max_out], dim=1)  # 拼接:(B,2,H,W)attention = self.conv(pool_out)  # 卷積提取空間特征return x * self.sigmoid(attention)  # 特征與空間權重相乘## CBAM模塊
class CBAM(nn.Module):def __init__(self, in_channels, ratio=16, kernel_size=7):super().__init__()self.channel_attn = ChannelAttention(in_channels, ratio)self.spatial_attn = SpatialAttention(kernel_size)def forward(self, x):x = self.channel_attn(x)x = self.spatial_attn(x)return ximport 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  # 解決負號顯示問題# 檢查GPU是否可用
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"使用設備: {device}")# 數據預處理(與原代碼一致)
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),transforms.RandomHorizontalFlip(),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),transforms.RandomRotation(15),transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])# 加載數據集(與原代碼一致)
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)
test_dataset = datasets.CIFAR10(root='./data', train=False, transform=test_transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

使用設備: cuda

import torch
import torchvision.models as models
from torchinfo import summary #之前的內容說了,推薦用他來可視化模型結構,信息最全# 加載 VGG16(預訓練)
model = models.vgg16(pretrained=True)
model.eval()# 輸出模型結構和參數概要
summary(model, input_size=(1, 3, 224, 224))
==========================================================================================
Layer (type:depth-idx)                   Output Shape              Param #
==========================================================================================
VGG                                      [1, 1000]                 --
├─Sequential: 1-1                        [1, 512, 7, 7]            --
│    └─Conv2d: 2-1                       [1, 64, 224, 224]         1,792
│    └─ReLU: 2-2                         [1, 64, 224, 224]         --
│    └─Conv2d: 2-3                       [1, 64, 224, 224]         36,928
│    └─ReLU: 2-4                         [1, 64, 224, 224]         --
│    └─MaxPool2d: 2-5                    [1, 64, 112, 112]         --
│    └─Conv2d: 2-6                       [1, 128, 112, 112]        73,856
│    └─ReLU: 2-7                         [1, 128, 112, 112]        --
│    └─Conv2d: 2-8                       [1, 128, 112, 112]        147,584
│    └─ReLU: 2-9                         [1, 128, 112, 112]        --
│    └─MaxPool2d: 2-10                   [1, 128, 56, 56]          --
│    └─Conv2d: 2-11                      [1, 256, 56, 56]          295,168
│    └─ReLU: 2-12                        [1, 256, 56, 56]          --
│    └─Conv2d: 2-13                      [1, 256, 56, 56]          590,080
│    └─ReLU: 2-14                        [1, 256, 56, 56]          --
│    └─Conv2d: 2-15                      [1, 256, 56, 56]          590,080
│    └─ReLU: 2-16                        [1, 256, 56, 56]          --
│    └─MaxPool2d: 2-17                   [1, 256, 28, 28]          --
│    └─Conv2d: 2-18                      [1, 512, 28, 28]          1,180,160
│    └─ReLU: 2-19                        [1, 512, 28, 28]          --
│    └─Conv2d: 2-20                      [1, 512, 28, 28]          2,359,808
│    └─ReLU: 2-21                        [1, 512, 28, 28]          --
│    └─Conv2d: 2-22                      [1, 512, 28, 28]          2,359,808
│    └─ReLU: 2-23                        [1, 512, 28, 28]          --
│    └─MaxPool2d: 2-24                   [1, 512, 14, 14]          --
│    └─Conv2d: 2-25                      [1, 512, 14, 14]          2,359,808
│    └─ReLU: 2-26                        [1, 512, 14, 14]          --
│    └─Conv2d: 2-27                      [1, 512, 14, 14]          2,359,808
│    └─ReLU: 2-28                        [1, 512, 14, 14]          --
│    └─Conv2d: 2-29                      [1, 512, 14, 14]          2,359,808
│    └─ReLU: 2-30                        [1, 512, 14, 14]          --
│    └─MaxPool2d: 2-31                   [1, 512, 7, 7]            --
├─AdaptiveAvgPool2d: 1-2                 [1, 512, 7, 7]            --
├─Sequential: 1-3                        [1, 1000]                 --
│    └─Linear: 2-32                      [1, 4096]                 102,764,544
│    └─ReLU: 2-33                        [1, 4096]                 --
│    └─Dropout: 2-34                     [1, 4096]                 --
│    └─Linear: 2-35                      [1, 4096]                 16,781,312
│    └─ReLU: 2-36                        [1, 4096]                 --
│    └─Dropout: 2-37                     [1, 4096]                 --
│    └─Linear: 2-38                      [1, 1000]                 4,097,000
==========================================================================================
Total params: 138,357,544
Trainable params: 138,357,544
Non-trainable params: 0
Total mult-adds (G): 15.48
==========================================================================================
Input size (MB): 0.60
Forward/backward pass size (MB): 108.45
Params size (MB): 553.43
Estimated Total Size (MB): 662.49
==========================================================================================
import torch
import torch.nn as nn
from torchvision import models# 自定義VGG16模型,插入CBAM模塊
class VGG16_CBAM(nn.Module):def __init__(self, num_classes=10, pretrained=True, cbam_ratio=16, cbam_kernel=7):super().__init__()# 加載預訓練VGG16self.backbone = models.vgg16(pretrained=pretrained).features# 在特定卷積層后添加CBAM模塊self.cbam_layer1 = CBAM(in_channels=64, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_layer2 = CBAM(in_channels=128, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_layer3 = CBAM(in_channels=256, ratio=cbam_ratio, kernel_size=cbam_kernel)self.cbam_layer4 = CBAM(in_channels=512, ratio=cbam_ratio, kernel_size=cbam_kernel)# 修改分類頭self.avgpool = nn.AdaptiveAvgPool2d((7, 7))self.classifier = nn.Sequential(nn.Linear(512 * 7 * 7, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, 4096),nn.ReLU(True),nn.Dropout(),nn.Linear(4096, num_classes),)def forward(self, x):# 主干特征提取for i in range(4):  # 第一個CBAM在第四個卷積層后x = self.backbone[i](x)x = self.cbam_layer1(x)for i in range(4, 9):  # 第二個CBAM在第九個卷積層后x = self.backbone[i](x)x = self.cbam_layer2(x)for i in range(9, 16):  # 第三個CBAM在第十六和第四個CBAM在第二十三個卷積層后x = self.backbone[i](x)x = self.cbam_layer3(x)for i in range(16, 23):x = self.backbone[i](x)x = self.cbam_layer4(x)# 全局平均池化 + 分類x = self.avgpool(x)x = torch.flatten(x, 1)x = self.classifier(x)return x# 初始化模型并移至設備
model = VGG16_CBAM().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', patience=3, factor=0.5)
import time# ======================================================================
# 4. 結合了分階段策略和詳細打印的訓練函數
# ======================================================================
def set_trainable_layers(model, trainable_parts):print(f"\n---> 解凍以下部分并設為可訓練: {trainable_parts}")for name, param in model.named_parameters():param.requires_grad = Falsefor part in trainable_parts:if part in name:param.requires_grad = Truebreakdef train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs):optimizer = None# 初始化歷史記錄列表,與你的要求一致all_iter_losses, iter_indices = [], []train_acc_history, test_acc_history = [], []train_loss_history, test_loss_history = [], []for epoch in range(1, epochs + 1):epoch_start_time = time.time()# --- 動態調整學習率和凍結層 ---if epoch == 1:print("\n" + "="*50 + "\n🚀 **階段 1:訓練注意力模塊和分類頭**\n" + "="*50)set_trainable_layers(model, ["cbam", "classifier"])optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)  # 降低初始學習率elif epoch == 6:print("\n" + "="*50 + "\n?? **階段 2:解凍高層卷積層**\n" + "="*50)set_trainable_layers(model, ["cbam", "classifier", "backbone.24", "backbone.28"])  # 解凍最后兩個卷積塊optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=5e-5)elif epoch == 21:print("\n" + "="*50 + "\n🛰? **階段 3:解凍所有層,進行全局微調**\n" + "="*50)for param in model.parameters(): param.requires_grad = Trueoptimizer = optim.Adam(model.parameters(), lr=1e-5)# --- 訓練循環 ---model.train()running_loss, correct, total = 0.0, 0, 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.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 - 1) * 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個batch打印一次if (batch_idx + 1) % 100 == 0:print(f'Epoch: {epoch}/{epochs} | Batch: {batch_idx+1}/{len(train_loader)} 'f'| 單Batch損失: {iter_loss:.4f} | 累計平均損失: {running_loss/(batch_idx+1):.4f}')epoch_train_loss = running_loss / len(train_loader)epoch_train_acc = 100. * correct / totaltrain_loss_history.append(epoch_train_loss)train_acc_history.append(epoch_train_acc)# --- 測試循環 ---model.eval()test_loss, correct_test, total_test = 0, 0, 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_testtest_loss_history.append(epoch_test_loss)test_acc_history.append(epoch_test_acc)# 打印每個epoch的最終結果print(f'Epoch {epoch}/{epochs} 完成 | 耗時: {time.time() - epoch_start_time:.2f}s | 訓練準確率: {epoch_train_acc:.2f}% | 測試準確率: {epoch_test_acc:.2f}%')# 訓練結束后調用繪圖函數print("\n訓練完成! 開始繪制結果圖表...")plot_iter_losses(all_iter_losses, iter_indices)plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history)# 返回最終的測試準確率return epoch_test_acc# ======================================================================
# 5. 繪圖函數定義
# ======================================================================
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()def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss):epochs = range(1, len(train_acc) + 1)plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(epochs, train_acc, 'b-', label='訓練準確率')plt.plot(epochs, test_acc, 'r-', label='測試準確率')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.title('訓練和測試準確率')plt.legend(); plt.grid(True)plt.subplot(1, 2, 2)plt.plot(epochs, train_loss, 'b-', label='訓練損失')plt.plot(epochs, test_loss, 'r-', label='測試損失')plt.xlabel('Epoch')plt.ylabel('損失值')plt.title('訓練和測試損失')plt.legend(); plt.grid(True)plt.tight_layout()plt.show()# ======================================================================
# 6. 執行訓練
# ======================================================================
model = VGG16_CBAM().to(device)
criterion = nn.CrossEntropyLoss()
epochs = 50print("開始使用帶分階段微調策略的ResNet18+CBAM模型進行訓練...")
final_accuracy = train_staged_finetuning(model, criterion, train_loader, test_loader, device, epochs)
print(f"訓練完成!最終測試準確率: {final_accuracy:.2f}%")# torch.save(model.state_dict(), 'resnet18_cbam_finetuned.pth')
# print("模型已保存為: resnet18_cbam_finetuned.pth")
開始使用帶分階段微調策略的ResNet18+CBAM模型進行訓練...==================================================
🚀 **階段 1:訓練注意力模塊和分類頭**
==================================================---> 解凍以下部分并設為可訓練: ['cbam', 'classifier']
Epoch: 1/50 | Batch: 100/782 | 單Batch損失: 1.5561 | 累計平均損失: 1.9607
Epoch: 1/50 | Batch: 200/782 | 單Batch損失: 1.4757 | 累計平均損失: 1.6771
Epoch: 1/50 | Batch: 300/782 | 單Batch損失: 1.3365 | 累計平均損失: 1.5326
Epoch: 1/50 | Batch: 400/782 | 單Batch損失: 1.3983 | 累計平均損失: 1.4436
Epoch: 1/50 | Batch: 500/782 | 單Batch損失: 0.8634 | 累計平均損失: 1.3712
Epoch: 1/50 | Batch: 600/782 | 單Batch損失: 1.2394 | 累計平均損失: 1.3200
Epoch: 1/50 | Batch: 700/782 | 單Batch損失: 0.8161 | 累計平均損失: 1.2776
Epoch 1/50 完成 | 耗時: 95.49s | 訓練準確率: 55.13% | 測試準確率: 73.81%
Epoch: 2/50 | Batch: 100/782 | 單Batch損失: 1.1340 | 累計平均損失: 0.9804
Epoch: 2/50 | Batch: 200/782 | 單Batch損失: 1.2382 | 累計平均損失: 0.9886
Epoch: 2/50 | Batch: 300/782 | 單Batch損失: 1.0366 | 累計平均損失: 0.9789
Epoch: 2/50 | Batch: 400/782 | 單Batch損失: 0.8488 | 累計平均損失: 0.9731
Epoch: 2/50 | Batch: 500/782 | 單Batch損失: 0.9304 | 累計平均損失: 0.9663
Epoch: 2/50 | Batch: 600/782 | 單Batch損失: 0.8692 | 累計平均損失: 0.9565
Epoch: 2/50 | Batch: 700/782 | 單Batch損失: 0.9259 | 累計平均損失: 0.9492
Epoch 2/50 完成 | 耗時: 93.23s | 訓練準確率: 66.64% | 測試準確率: 76.95%
Epoch: 3/50 | Batch: 100/782 | 單Batch損失: 0.7439 | 累計平均損失: 0.8900
Epoch: 3/50 | Batch: 200/782 | 單Batch損失: 0.8751 | 累計平均損失: 0.8882
Epoch: 3/50 | Batch: 300/782 | 單Batch損失: 0.9008 | 累計平均損失: 0.8811
Epoch: 3/50 | Batch: 400/782 | 單Batch損失: 0.8706 | 累計平均損失: 0.8779
Epoch: 3/50 | Batch: 500/782 | 單Batch損失: 0.9341 | 累計平均損失: 0.8761
Epoch: 3/50 | Batch: 600/782 | 單Batch損失: 0.9934 | 累計平均損失: 0.8741
Epoch: 3/50 | Batch: 700/782 | 單Batch損失: 1.0965 | 累計平均損失: 0.8721
Epoch 3/50 完成 | 耗時: 93.84s | 訓練準確率: 69.24% | 測試準確率: 78.06%
Epoch: 4/50 | Batch: 100/782 | 單Batch損失: 0.7415 | 累計平均損失: 0.8234
Epoch: 4/50 | Batch: 200/782 | 單Batch損失: 0.8565 | 累計平均損失: 0.8316
Epoch: 4/50 | Batch: 300/782 | 單Batch損失: 0.6663 | 累計平均損失: 0.8400
Epoch: 4/50 | Batch: 400/782 | 單Batch損失: 0.8686 | 累計平均損失: 0.8337
Epoch: 4/50 | Batch: 500/782 | 單Batch損失: 0.6824 | 累計平均損失: 0.8323
Epoch: 4/50 | Batch: 600/782 | 單Batch損失: 0.8236 | 累計平均損失: 0.8332
Epoch: 4/50 | Batch: 700/782 | 單Batch損失: 0.6454 | 累計平均損失: 0.8309
Epoch 4/50 完成 | 耗時: 94.95s | 訓練準確率: 70.78% | 測試準確率: 79.24%
Epoch: 5/50 | Batch: 100/782 | 單Batch損失: 0.7504 | 累計平均損失: 0.7974
Epoch: 5/50 | Batch: 200/782 | 單Batch損失: 0.8141 | 累計平均損失: 0.7833
Epoch: 5/50 | Batch: 300/782 | 單Batch損失: 0.8299 | 累計平均損失: 0.7901
Epoch: 5/50 | Batch: 400/782 | 單Batch損失: 1.1897 | 累計平均損失: 0.7954
Epoch: 5/50 | Batch: 500/782 | 單Batch損失: 0.7235 | 累計平均損失: 0.7918
Epoch: 5/50 | Batch: 600/782 | 單Batch損失: 0.7812 | 累計平均損失: 0.7894
Epoch: 5/50 | Batch: 700/782 | 單Batch損失: 1.0576 | 累計平均損失: 0.7872
Epoch 5/50 完成 | 耗時: 93.63s | 訓練準確率: 72.14% | 測試準確率: 80.13%==================================================
?? **階段 2:解凍高層卷積層**
==================================================---> 解凍以下部分并設為可訓練: ['cbam', 'classifier', 'backbone.24', 'backbone.28']
Epoch: 6/50 | Batch: 100/782 | 單Batch損失: 0.9639 | 累計平均損失: 0.7345
Epoch: 6/50 | Batch: 200/782 | 單Batch損失: 0.5671 | 累計平均損失: 0.7398
Epoch: 6/50 | Batch: 300/782 | 單Batch損失: 1.0322 | 累計平均損失: 0.7428
Epoch: 6/50 | Batch: 400/782 | 單Batch損失: 0.9354 | 累計平均損失: 0.7363
Epoch: 6/50 | Batch: 500/782 | 單Batch損失: 0.7988 | 累計平均損失: 0.7340
Epoch: 6/50 | Batch: 600/782 | 單Batch損失: 0.7025 | 累計平均損失: 0.7381
Epoch: 6/50 | Batch: 700/782 | 單Batch損失: 0.6588 | 累計平均損失: 0.7375
Epoch 6/50 完成 | 耗時: 92.11s | 訓練準確率: 74.16% | 測試準確率: 80.82%
Epoch: 7/50 | Batch: 100/782 | 單Batch損失: 0.5994 | 累計平均損失: 0.7185
Epoch: 7/50 | Batch: 200/782 | 單Batch損失: 0.7812 | 累計平均損失: 0.7192
Epoch: 7/50 | Batch: 300/782 | 單Batch損失: 0.5821 | 累計平均損失: 0.7182
Epoch: 7/50 | Batch: 400/782 | 單Batch損失: 0.7363 | 累計平均損失: 0.7191
Epoch: 7/50 | Batch: 500/782 | 單Batch損失: 0.8393 | 累計平均損失: 0.7180
Epoch: 7/50 | Batch: 600/782 | 單Batch損失: 0.6314 | 累計平均損失: 0.7210
Epoch: 7/50 | Batch: 700/782 | 單Batch損失: 0.8020 | 累計平均損失: 0.7175
Epoch 7/50 完成 | 耗時: 92.17s | 訓練準確率: 74.72% | 測試準確率: 80.99%
Epoch: 8/50 | Batch: 100/782 | 單Batch損失: 0.7341 | 累計平均損失: 0.7157
Epoch: 8/50 | Batch: 200/782 | 單Batch損失: 0.5608 | 累計平均損失: 0.7029
Epoch: 8/50 | Batch: 300/782 | 單Batch損失: 0.5959 | 累計平均損失: 0.7036
Epoch: 8/50 | Batch: 400/782 | 單Batch損失: 0.7556 | 累計平均損失: 0.7071
Epoch: 8/50 | Batch: 500/782 | 單Batch損失: 0.7005 | 累計平均損失: 0.7057
Epoch: 8/50 | Batch: 600/782 | 單Batch損失: 0.5958 | 累計平均損失: 0.7054
Epoch: 8/50 | Batch: 700/782 | 單Batch損失: 0.5461 | 累計平均損失: 0.7055
Epoch 8/50 完成 | 耗時: 92.62s | 訓練準確率: 75.16% | 測試準確率: 82.00%
Epoch: 9/50 | Batch: 100/782 | 單Batch損失: 0.6607 | 累計平均損失: 0.6983
Epoch: 9/50 | Batch: 200/782 | 單Batch損失: 0.6213 | 累計平均損失: 0.6966
Epoch: 9/50 | Batch: 300/782 | 單Batch損失: 0.7511 | 累計平均損失: 0.6882
Epoch: 9/50 | Batch: 400/782 | 單Batch損失: 0.7870 | 累計平均損失: 0.6976
Epoch: 9/50 | Batch: 500/782 | 單Batch損失: 0.7935 | 累計平均損失: 0.6929
Epoch: 9/50 | Batch: 600/782 | 單Batch損失: 0.6186 | 累計平均損失: 0.6937
Epoch: 9/50 | Batch: 700/782 | 單Batch損失: 0.6287 | 累計平均損失: 0.6949
Epoch 9/50 完成 | 耗時: 91.92s | 訓練準確率: 75.34% | 測試準確率: 82.12%
Epoch: 10/50 | Batch: 100/782 | 單Batch損失: 0.6090 | 累計平均損失: 0.6847
Epoch: 10/50 | Batch: 200/782 | 單Batch損失: 0.7220 | 累計平均損失: 0.6883
Epoch: 10/50 | Batch: 300/782 | 單Batch損失: 0.5225 | 累計平均損失: 0.6812
Epoch: 10/50 | Batch: 400/782 | 單Batch損失: 0.7003 | 累計平均損失: 0.6837
Epoch: 10/50 | Batch: 500/782 | 單Batch損失: 0.5424 | 累計平均損失: 0.6824
Epoch: 10/50 | Batch: 600/782 | 單Batch損失: 0.6114 | 累計平均損失: 0.6855
Epoch: 10/50 | Batch: 700/782 | 單Batch損失: 0.6351 | 累計平均損失: 0.6839
Epoch 10/50 完成 | 耗時: 95.88s | 訓練準確率: 75.97% | 測試準確率: 82.60%
Epoch: 11/50 | Batch: 100/782 | 單Batch損失: 0.6751 | 累計平均損失: 0.6612
Epoch: 11/50 | Batch: 200/782 | 單Batch損失: 0.6527 | 累計平均損失: 0.6596
Epoch: 11/50 | Batch: 300/782 | 單Batch損失: 0.6667 | 累計平均損失: 0.6674
Epoch: 11/50 | Batch: 400/782 | 單Batch損失: 0.5971 | 累計平均損失: 0.6687
Epoch: 11/50 | Batch: 500/782 | 單Batch損失: 0.8421 | 累計平均損失: 0.6721
Epoch: 11/50 | Batch: 600/782 | 單Batch損失: 0.8855 | 累計平均損失: 0.6745
Epoch: 11/50 | Batch: 700/782 | 單Batch損失: 0.7721 | 累計平均損失: 0.6736
Epoch 11/50 完成 | 耗時: 95.56s | 訓練準確率: 76.21% | 測試準確率: 82.88%
Epoch: 12/50 | Batch: 100/782 | 單Batch損失: 0.5727 | 累計平均損失: 0.6698
Epoch: 12/50 | Batch: 200/782 | 單Batch損失: 0.7433 | 累計平均損失: 0.6617
Epoch: 12/50 | Batch: 300/782 | 單Batch損失: 0.7549 | 累計平均損失: 0.6537
Epoch: 12/50 | Batch: 400/782 | 單Batch損失: 0.6134 | 累計平均損失: 0.6547
Epoch: 12/50 | Batch: 500/782 | 單Batch損失: 0.6157 | 累計平均損失: 0.6568
Epoch: 12/50 | Batch: 600/782 | 單Batch損失: 0.5984 | 累計平均損失: 0.6584
Epoch: 12/50 | Batch: 700/782 | 單Batch損失: 0.4584 | 累計平均損失: 0.6605
Epoch 12/50 完成 | 耗時: 94.44s | 訓練準確率: 76.80% | 測試準確率: 82.91%
Epoch: 13/50 | Batch: 100/782 | 單Batch損失: 0.7270 | 累計平均損失: 0.6395
Epoch: 13/50 | Batch: 200/782 | 單Batch損失: 0.4586 | 累計平均損失: 0.6490
Epoch: 13/50 | Batch: 300/782 | 單Batch損失: 0.6169 | 累計平均損失: 0.6562
Epoch: 13/50 | Batch: 400/782 | 單Batch損失: 0.7299 | 累計平均損失: 0.6561
Epoch: 13/50 | Batch: 500/782 | 單Batch損失: 0.8272 | 累計平均損失: 0.6505
Epoch: 13/50 | Batch: 600/782 | 單Batch損失: 0.8096 | 累計平均損失: 0.6549
Epoch: 13/50 | Batch: 700/782 | 單Batch損失: 0.7126 | 累計平均損失: 0.6509
Epoch 13/50 完成 | 耗時: 97.75s | 訓練準確率: 77.02% | 測試準確率: 83.23%
Epoch: 14/50 | Batch: 100/782 | 單Batch損失: 0.6534 | 累計平均損失: 0.6501
Epoch: 14/50 | Batch: 200/782 | 單Batch損失: 0.8621 | 累計平均損失: 0.6367
Epoch: 14/50 | Batch: 300/782 | 單Batch損失: 0.7036 | 累計平均損失: 0.6420
Epoch: 14/50 | Batch: 400/782 | 單Batch損失: 0.8217 | 累計平均損失: 0.6397
Epoch: 14/50 | Batch: 500/782 | 單Batch損失: 0.7702 | 累計平均損失: 0.6411
Epoch: 14/50 | Batch: 600/782 | 單Batch損失: 0.7000 | 累計平均損失: 0.6394
Epoch: 14/50 | Batch: 700/782 | 單Batch損失: 0.3676 | 累計平均損失: 0.6403
Epoch 14/50 完成 | 耗時: 100.53s | 訓練準確率: 77.35% | 測試準確率: 83.64%
Epoch: 15/50 | Batch: 100/782 | 單Batch損失: 0.5342 | 累計平均損失: 0.6346
Epoch: 15/50 | Batch: 200/782 | 單Batch損失: 0.4884 | 累計平均損失: 0.6284
Epoch: 15/50 | Batch: 300/782 | 單Batch損失: 0.6588 | 累計平均損失: 0.6379
Epoch: 15/50 | Batch: 400/782 | 單Batch損失: 0.4437 | 累計平均損失: 0.6365
Epoch: 15/50 | Batch: 500/782 | 單Batch損失: 0.7628 | 累計平均損失: 0.6340
Epoch: 15/50 | Batch: 600/782 | 單Batch損失: 0.9489 | 累計平均損失: 0.6320
Epoch: 15/50 | Batch: 700/782 | 單Batch損失: 0.4534 | 累計平均損失: 0.6318
Epoch 15/50 完成 | 耗時: 97.04s | 訓練準確率: 77.67% | 測試準確率: 83.58%
Epoch: 16/50 | Batch: 100/782 | 單Batch損失: 0.5005 | 累計平均損失: 0.6163
Epoch: 16/50 | Batch: 200/782 | 單Batch損失: 0.5728 | 累計平均損失: 0.6197
Epoch: 16/50 | Batch: 300/782 | 單Batch損失: 0.7579 | 累計平均損失: 0.6189
Epoch: 16/50 | Batch: 400/782 | 單Batch損失: 0.6198 | 累計平均損失: 0.6197
Epoch: 16/50 | Batch: 500/782 | 單Batch損失: 0.8280 | 累計平均損失: 0.6188
Epoch: 16/50 | Batch: 600/782 | 單Batch損失: 0.6307 | 累計平均損失: 0.6220
Epoch: 16/50 | Batch: 700/782 | 單Batch損失: 0.7405 | 累計平均損失: 0.6217
Epoch 16/50 完成 | 耗時: 95.44s | 訓練準確率: 78.03% | 測試準確率: 83.61%
Epoch: 17/50 | Batch: 100/782 | 單Batch損失: 0.7000 | 累計平均損失: 0.6119
Epoch: 17/50 | Batch: 200/782 | 單Batch損失: 0.5694 | 累計平均損失: 0.6118
Epoch: 17/50 | Batch: 300/782 | 單Batch損失: 0.4480 | 累計平均損失: 0.6093
Epoch: 17/50 | Batch: 400/782 | 單Batch損失: 0.5957 | 累計平均損失: 0.6058
Epoch: 17/50 | Batch: 500/782 | 單Batch損失: 0.8769 | 累計平均損失: 0.6029
Epoch: 17/50 | Batch: 600/782 | 單Batch損失: 0.5457 | 累計平均損失: 0.6064
Epoch: 17/50 | Batch: 700/782 | 單Batch損失: 0.5370 | 累計平均損失: 0.6087
Epoch 17/50 完成 | 耗時: 98.79s | 訓練準確率: 78.32% | 測試準確率: 83.52%
Epoch: 18/50 | Batch: 100/782 | 單Batch損失: 0.3908 | 累計平均損失: 0.6177
Epoch: 18/50 | Batch: 200/782 | 單Batch損失: 0.6751 | 累計平均損失: 0.6205
Epoch: 18/50 | Batch: 300/782 | 單Batch損失: 0.7216 | 累計平均損失: 0.6166
Epoch: 18/50 | Batch: 400/782 | 單Batch損失: 0.5663 | 累計平均損失: 0.6165
Epoch: 18/50 | Batch: 500/782 | 單Batch損失: 0.5815 | 累計平均損失: 0.6161
Epoch: 18/50 | Batch: 600/782 | 單Batch損失: 0.7549 | 累計平均損失: 0.6141
Epoch: 18/50 | Batch: 700/782 | 單Batch損失: 0.5939 | 累計平均損失: 0.6143
Epoch 18/50 完成 | 耗時: 101.45s | 訓練準確率: 78.36% | 測試準確率: 83.74%
Epoch: 19/50 | Batch: 100/782 | 單Batch損失: 0.4253 | 累計平均損失: 0.5968
Epoch: 19/50 | Batch: 200/782 | 單Batch損失: 0.4800 | 累計平均損失: 0.5962
Epoch: 19/50 | Batch: 300/782 | 單Batch損失: 0.6604 | 累計平均損失: 0.5924
Epoch: 19/50 | Batch: 400/782 | 單Batch損失: 0.6934 | 累計平均損失: 0.5980
Epoch: 19/50 | Batch: 500/782 | 單Batch損失: 0.6824 | 累計平均損失: 0.6005
Epoch: 19/50 | Batch: 600/782 | 單Batch損失: 0.7236 | 累計平均損失: 0.6045
Epoch: 19/50 | Batch: 700/782 | 單Batch損失: 0.5636 | 累計平均損失: 0.6086
Epoch 19/50 完成 | 耗時: 108.51s | 訓練準確率: 78.63% | 測試準確率: 84.30%
Epoch: 20/50 | Batch: 100/782 | 單Batch損失: 0.8197 | 累計平均損失: 0.6068
Epoch: 20/50 | Batch: 200/782 | 單Batch損失: 0.6022 | 累計平均損失: 0.6033
Epoch: 20/50 | Batch: 300/782 | 單Batch損失: 0.5682 | 累計平均損失: 0.6032
Epoch: 20/50 | Batch: 400/782 | 單Batch損失: 0.6012 | 累計平均損失: 0.6032
Epoch: 20/50 | Batch: 500/782 | 單Batch損失: 0.7576 | 累計平均損失: 0.6014
Epoch: 20/50 | Batch: 600/782 | 單Batch損失: 0.6027 | 累計平均損失: 0.6026
Epoch: 20/50 | Batch: 700/782 | 單Batch損失: 0.5330 | 累計平均損失: 0.6036
Epoch 20/50 完成 | 耗時: 114.49s | 訓練準確率: 78.72% | 測試準確率: 84.37%==================================================
🛰? **階段 3:解凍所有層,進行全局微調**
==================================================
Epoch: 21/50 | Batch: 100/782 | 單Batch損失: 0.3482 | 累計平均損失: 0.5702
Epoch: 21/50 | Batch: 200/782 | 單Batch損失: 0.4764 | 累計平均損失: 0.5716
Epoch: 21/50 | Batch: 300/782 | 單Batch損失: 0.5167 | 累計平均損失: 0.5668
Epoch: 21/50 | Batch: 400/782 | 單Batch損失: 0.6438 | 累計平均損失: 0.5649
Epoch: 21/50 | Batch: 500/782 | 單Batch損失: 0.4732 | 累計平均損失: 0.5636
Epoch: 21/50 | Batch: 600/782 | 單Batch損失: 0.5195 | 累計平均損失: 0.5625
Epoch: 21/50 | Batch: 700/782 | 單Batch損失: 0.5012 | 累計平均損失: 0.5628
Epoch 21/50 完成 | 耗時: 122.71s | 訓練準確率: 80.16% | 測試準確率: 85.26%
Epoch: 22/50 | Batch: 100/782 | 單Batch損失: 0.4270 | 累計平均損失: 0.5091
Epoch: 22/50 | Batch: 200/782 | 單Batch損失: 0.5310 | 累計平均損失: 0.5192
Epoch: 22/50 | Batch: 300/782 | 單Batch損失: 0.5260 | 累計平均損失: 0.5256
Epoch: 22/50 | Batch: 400/782 | 單Batch損失: 0.3363 | 累計平均損失: 0.5242
Epoch: 22/50 | Batch: 500/782 | 單Batch損失: 0.5976 | 累計平均損失: 0.5202
Epoch: 22/50 | Batch: 600/782 | 單Batch損失: 0.5327 | 累計平均損失: 0.5190
Epoch: 22/50 | Batch: 700/782 | 單Batch損失: 0.5064 | 累計平均損失: 0.5183
Epoch 22/50 完成 | 耗時: 110.27s | 訓練準確率: 81.67% | 測試準確率: 85.72%
Epoch: 23/50 | Batch: 100/782 | 單Batch損失: 0.4734 | 累計平均損失: 0.4997
Epoch: 23/50 | Batch: 200/782 | 單Batch損失: 0.3616 | 累計平均損失: 0.4980
Epoch: 23/50 | Batch: 300/782 | 單Batch損失: 0.4213 | 累計平均損失: 0.4995
Epoch: 23/50 | Batch: 400/782 | 單Batch損失: 0.6570 | 累計平均損失: 0.5003
Epoch: 23/50 | Batch: 500/782 | 單Batch損失: 0.4213 | 累計平均損失: 0.4958
Epoch: 23/50 | Batch: 600/782 | 單Batch損失: 0.5556 | 累計平均損失: 0.4959
Epoch: 23/50 | Batch: 700/782 | 單Batch損失: 0.6496 | 累計平均損失: 0.4958
Epoch 23/50 完成 | 耗時: 112.06s | 訓練準確率: 82.42% | 測試準確率: 86.11%
Epoch: 24/50 | Batch: 100/782 | 單Batch損失: 0.4465 | 累計平均損失: 0.4760
Epoch: 24/50 | Batch: 200/782 | 單Batch損失: 0.5008 | 累計平均損失: 0.4768
Epoch: 24/50 | Batch: 300/782 | 單Batch損失: 0.4536 | 累計平均損失: 0.4759
Epoch: 24/50 | Batch: 400/782 | 單Batch損失: 0.3049 | 累計平均損失: 0.4769
Epoch: 24/50 | Batch: 500/782 | 單Batch損失: 0.3577 | 累計平均損失: 0.4750
Epoch: 24/50 | Batch: 600/782 | 單Batch損失: 0.3798 | 累計平均損失: 0.4762
Epoch: 24/50 | Batch: 700/782 | 單Batch損失: 0.5775 | 累計平均損失: 0.4741
Epoch 24/50 完成 | 耗時: 113.78s | 訓練準確率: 83.29% | 測試準確率: 86.35%
Epoch: 25/50 | Batch: 100/782 | 單Batch損失: 0.4324 | 累計平均損失: 0.4714
Epoch: 25/50 | Batch: 200/782 | 單Batch損失: 0.2862 | 累計平均損失: 0.4600
Epoch: 25/50 | Batch: 300/782 | 單Batch損失: 0.3771 | 累計平均損失: 0.4572
Epoch: 25/50 | Batch: 400/782 | 單Batch損失: 0.4873 | 累計平均損失: 0.4508
Epoch: 25/50 | Batch: 500/782 | 單Batch損失: 0.7972 | 累計平均損失: 0.4531
Epoch: 25/50 | Batch: 600/782 | 單Batch損失: 0.8058 | 累計平均損失: 0.4565
Epoch: 25/50 | Batch: 700/782 | 單Batch損失: 0.2774 | 累計平均損失: 0.4566
Epoch 25/50 完成 | 耗時: 103.64s | 訓練準確率: 83.95% | 測試準確率: 86.81%
Epoch: 26/50 | Batch: 100/782 | 單Batch損失: 0.6712 | 累計平均損失: 0.4371
Epoch: 26/50 | Batch: 200/782 | 單Batch損失: 0.4103 | 累計平均損失: 0.4424
Epoch: 26/50 | Batch: 300/782 | 單Batch損失: 0.4517 | 累計平均損失: 0.4400
Epoch: 26/50 | Batch: 400/782 | 單Batch損失: 0.3697 | 累計平均損失: 0.4349
Epoch: 26/50 | Batch: 500/782 | 單Batch損失: 0.3016 | 累計平均損失: 0.4301
Epoch: 26/50 | Batch: 600/782 | 單Batch損失: 0.5969 | 累計平均損失: 0.4334
Epoch: 26/50 | Batch: 700/782 | 單Batch損失: 0.3948 | 累計平均損失: 0.4336
Epoch 26/50 完成 | 耗時: 102.55s | 訓練準確率: 84.62% | 測試準確率: 86.85%
Epoch: 27/50 | Batch: 100/782 | 單Batch損失: 0.4172 | 累計平均損失: 0.4462
Epoch: 27/50 | Batch: 200/782 | 單Batch損失: 0.4054 | 累計平均損失: 0.4404
Epoch: 27/50 | Batch: 300/782 | 單Batch損失: 0.4281 | 累計平均損失: 0.4338
Epoch: 27/50 | Batch: 400/782 | 單Batch損失: 0.4494 | 累計平均損失: 0.4299
Epoch: 27/50 | Batch: 500/782 | 單Batch損失: 0.3262 | 累計平均損失: 0.4277
Epoch: 27/50 | Batch: 600/782 | 單Batch損失: 0.2885 | 累計平均損失: 0.4294
Epoch: 27/50 | Batch: 700/782 | 單Batch損失: 0.4365 | 累計平均損失: 0.4325
Epoch 27/50 完成 | 耗時: 103.16s | 訓練準確率: 84.64% | 測試準確率: 87.07%
Epoch: 28/50 | Batch: 100/782 | 單Batch損失: 0.6126 | 累計平均損失: 0.4087
Epoch: 28/50 | Batch: 200/782 | 單Batch損失: 0.3851 | 累計平均損失: 0.4107
Epoch: 28/50 | Batch: 300/782 | 單Batch損失: 0.4676 | 累計平均損失: 0.4102
Epoch: 28/50 | Batch: 400/782 | 單Batch損失: 0.4450 | 累計平均損失: 0.4129
Epoch: 28/50 | Batch: 500/782 | 單Batch損失: 0.3518 | 累計平均損失: 0.4121
Epoch: 28/50 | Batch: 600/782 | 單Batch損失: 0.4325 | 累計平均損失: 0.4126
Epoch: 28/50 | Batch: 700/782 | 單Batch損失: 0.5842 | 累計平均損失: 0.4139
Epoch 28/50 完成 | 耗時: 103.32s | 訓練準確率: 85.62% | 測試準確率: 87.29%
Epoch: 29/50 | Batch: 100/782 | 單Batch損失: 0.5007 | 累計平均損失: 0.4051
Epoch: 29/50 | Batch: 200/782 | 單Batch損失: 0.3324 | 累計平均損失: 0.3982
Epoch: 29/50 | Batch: 300/782 | 單Batch損失: 0.5501 | 累計平均損失: 0.3997
Epoch: 29/50 | Batch: 400/782 | 單Batch損失: 0.3742 | 累計平均損失: 0.3971
Epoch: 29/50 | Batch: 500/782 | 單Batch損失: 0.5271 | 累計平均損失: 0.4011
Epoch: 29/50 | Batch: 600/782 | 單Batch損失: 0.3696 | 累計平均損失: 0.4020
Epoch: 29/50 | Batch: 700/782 | 單Batch損失: 0.3654 | 累計平均損失: 0.4015
Epoch 29/50 完成 | 耗時: 102.87s | 訓練準確率: 85.88% | 測試準確率: 87.44%
Epoch: 30/50 | Batch: 100/782 | 單Batch損失: 0.4692 | 累計平均損失: 0.3938
Epoch: 30/50 | Batch: 200/782 | 單Batch損失: 0.3445 | 累計平均損失: 0.3896
Epoch: 30/50 | Batch: 300/782 | 單Batch損失: 0.2445 | 累計平均損失: 0.3936
Epoch: 30/50 | Batch: 400/782 | 單Batch損失: 0.3952 | 累計平均損失: 0.3956
Epoch: 30/50 | Batch: 500/782 | 單Batch損失: 0.5035 | 累計平均損失: 0.3930
Epoch: 30/50 | Batch: 600/782 | 單Batch損失: 0.4506 | 累計平均損失: 0.3912
Epoch: 30/50 | Batch: 700/782 | 單Batch損失: 0.2855 | 累計平均損失: 0.3894
Epoch 30/50 完成 | 耗時: 103.50s | 訓練準確率: 86.22% | 測試準確率: 87.91%
Epoch: 31/50 | Batch: 100/782 | 單Batch損失: 0.3252 | 累計平均損失: 0.3863
Epoch: 31/50 | Batch: 200/782 | 單Batch損失: 0.3754 | 累計平均損失: 0.3819
Epoch: 31/50 | Batch: 300/782 | 單Batch損失: 0.4529 | 累計平均損失: 0.3792
Epoch: 31/50 | Batch: 400/782 | 單Batch損失: 0.3839 | 累計平均損失: 0.3778
Epoch: 31/50 | Batch: 500/782 | 單Batch損失: 0.4228 | 累計平均損失: 0.3769
Epoch: 31/50 | Batch: 600/782 | 單Batch損失: 0.3096 | 累計平均損失: 0.3780
Epoch: 31/50 | Batch: 700/782 | 單Batch損失: 0.2523 | 累計平均損失: 0.3796
Epoch 31/50 完成 | 耗時: 102.88s | 訓練準確率: 86.63% | 測試準確率: 87.83%
Epoch: 32/50 | Batch: 100/782 | 單Batch損失: 0.3799 | 累計平均損失: 0.3841
Epoch: 32/50 | Batch: 200/782 | 單Batch損失: 0.5369 | 累計平均損失: 0.3804
Epoch: 32/50 | Batch: 300/782 | 單Batch損失: 0.3019 | 累計平均損失: 0.3819
Epoch: 32/50 | Batch: 400/782 | 單Batch損失: 0.2522 | 累計平均損失: 0.3775
Epoch: 32/50 | Batch: 500/782 | 單Batch損失: 0.3382 | 累計平均損失: 0.3769
Epoch: 32/50 | Batch: 600/782 | 單Batch損失: 0.2575 | 累計平均損失: 0.3773
Epoch: 32/50 | Batch: 700/782 | 單Batch損失: 0.3985 | 累計平均損失: 0.3769
Epoch 32/50 完成 | 耗時: 103.30s | 訓練準確率: 86.71% | 測試準確率: 87.94%
Epoch: 33/50 | Batch: 100/782 | 單Batch損失: 0.3768 | 累計平均損失: 0.3777
Epoch: 33/50 | Batch: 200/782 | 單Batch損失: 0.3702 | 累計平均損失: 0.3729
Epoch: 33/50 | Batch: 300/782 | 單Batch損失: 0.2169 | 累計平均損失: 0.3671
Epoch: 33/50 | Batch: 400/782 | 單Batch損失: 0.4155 | 累計平均損失: 0.3653
Epoch: 33/50 | Batch: 500/782 | 單Batch損失: 0.4082 | 累計平均損失: 0.3619
Epoch: 33/50 | Batch: 600/782 | 單Batch損失: 0.3635 | 累計平均損失: 0.3625
Epoch: 33/50 | Batch: 700/782 | 單Batch損失: 0.4254 | 累計平均損失: 0.3646
Epoch 33/50 完成 | 耗時: 103.02s | 訓練準確率: 87.13% | 測試準確率: 88.44%
Epoch: 34/50 | Batch: 100/782 | 單Batch損失: 0.2500 | 累計平均損失: 0.3530
Epoch: 34/50 | Batch: 200/782 | 單Batch損失: 0.2712 | 累計平均損失: 0.3456
Epoch: 34/50 | Batch: 300/782 | 單Batch損失: 0.2749 | 累計平均損失: 0.3504
Epoch: 34/50 | Batch: 400/782 | 單Batch損失: 0.2845 | 累計平均損失: 0.3498
Epoch: 34/50 | Batch: 500/782 | 單Batch損失: 0.2477 | 累計平均損失: 0.3483
Epoch: 34/50 | Batch: 600/782 | 單Batch損失: 0.2847 | 累計平均損失: 0.3499
Epoch: 34/50 | Batch: 700/782 | 單Batch損失: 0.3128 | 累計平均損失: 0.3524
Epoch 34/50 完成 | 耗時: 103.35s | 訓練準確率: 87.44% | 測試準確率: 88.36%
Epoch: 35/50 | Batch: 100/782 | 單Batch損失: 0.3254 | 累計平均損失: 0.3439
Epoch: 35/50 | Batch: 200/782 | 單Batch損失: 0.2342 | 累計平均損失: 0.3405
Epoch: 35/50 | Batch: 300/782 | 單Batch損失: 0.3152 | 累計平均損失: 0.3393
Epoch: 35/50 | Batch: 400/782 | 單Batch損失: 0.1746 | 累計平均損失: 0.3380
Epoch: 35/50 | Batch: 500/782 | 單Batch損失: 0.3170 | 累計平均損失: 0.3398
Epoch: 35/50 | Batch: 600/782 | 單Batch損失: 0.6826 | 累計平均損失: 0.3433
Epoch: 35/50 | Batch: 700/782 | 單Batch損失: 0.3968 | 累計平均損失: 0.3443
Epoch 35/50 完成 | 耗時: 103.32s | 訓練準確率: 87.64% | 測試準確率: 88.35%
Epoch: 36/50 | Batch: 100/782 | 單Batch損失: 0.1661 | 累計平均損失: 0.3338
Epoch: 36/50 | Batch: 200/782 | 單Batch損失: 0.4482 | 累計平均損失: 0.3327
Epoch: 36/50 | Batch: 300/782 | 單Batch損失: 0.3140 | 累計平均損失: 0.3292
Epoch: 36/50 | Batch: 400/782 | 單Batch損失: 0.1750 | 累計平均損失: 0.3329
Epoch: 36/50 | Batch: 500/782 | 單Batch損失: 0.3137 | 累計平均損失: 0.3364
Epoch: 36/50 | Batch: 600/782 | 單Batch損失: 0.1617 | 累計平均損失: 0.3342
Epoch: 36/50 | Batch: 700/782 | 單Batch損失: 0.2343 | 累計平均損失: 0.3372
Epoch 36/50 完成 | 耗時: 104.33s | 訓練準確率: 87.97% | 測試準確率: 88.76%
Epoch: 37/50 | Batch: 100/782 | 單Batch損失: 0.3910 | 累計平均損失: 0.3265
Epoch: 37/50 | Batch: 200/782 | 單Batch損失: 0.3187 | 累計平均損失: 0.3317
Epoch: 37/50 | Batch: 300/782 | 單Batch損失: 0.3435 | 累計平均損失: 0.3289
Epoch: 37/50 | Batch: 400/782 | 單Batch損失: 0.3511 | 累計平均損失: 0.3254
Epoch: 37/50 | Batch: 500/782 | 單Batch損失: 0.2155 | 累計平均損失: 0.3257
Epoch: 37/50 | Batch: 600/782 | 單Batch損失: 0.2409 | 累計平均損失: 0.3263
Epoch: 37/50 | Batch: 700/782 | 單Batch損失: 0.2960 | 累計平均損失: 0.3261
Epoch 37/50 完成 | 耗時: 103.14s | 訓練準確率: 88.32% | 測試準確率: 88.27%
Epoch: 38/50 | Batch: 100/782 | 單Batch損失: 0.2492 | 累計平均損失: 0.3325
Epoch: 38/50 | Batch: 200/782 | 單Batch損失: 0.2956 | 累計平均損失: 0.3241
Epoch: 38/50 | Batch: 300/782 | 單Batch損失: 0.3037 | 累計平均損失: 0.3215
Epoch: 38/50 | Batch: 400/782 | 單Batch損失: 0.3102 | 累計平均損失: 0.3198
Epoch: 38/50 | Batch: 500/782 | 單Batch損失: 0.4242 | 累計平均損失: 0.3176
Epoch: 38/50 | Batch: 600/782 | 單Batch損失: 0.3365 | 累計平均損失: 0.3198
Epoch: 38/50 | Batch: 700/782 | 單Batch損失: 0.4242 | 累計平均損失: 0.3210
Epoch 38/50 完成 | 耗時: 104.08s | 訓練準確率: 88.51% | 測試準確率: 88.98%
Epoch: 39/50 | Batch: 100/782 | 單Batch損失: 0.4183 | 累計平均損失: 0.3166
Epoch: 39/50 | Batch: 200/782 | 單Batch損失: 0.3139 | 累計平均損失: 0.3167
Epoch: 39/50 | Batch: 300/782 | 單Batch損失: 0.4980 | 累計平均損失: 0.3162
Epoch: 39/50 | Batch: 400/782 | 單Batch損失: 0.3789 | 累計平均損失: 0.3126
Epoch: 39/50 | Batch: 500/782 | 單Batch損失: 0.4513 | 累計平均損失: 0.3131
Epoch: 39/50 | Batch: 600/782 | 單Batch損失: 0.4489 | 累計平均損失: 0.3140
Epoch: 39/50 | Batch: 700/782 | 單Batch損失: 0.3007 | 累計平均損失: 0.3156
Epoch 39/50 完成 | 耗時: 102.95s | 訓練準確率: 88.86% | 測試準確率: 88.82%
Epoch: 40/50 | Batch: 100/782 | 單Batch損失: 0.1439 | 累計平均損失: 0.3015
Epoch: 40/50 | Batch: 200/782 | 單Batch損失: 0.3258 | 累計平均損失: 0.3043
Epoch: 40/50 | Batch: 300/782 | 單Batch損失: 0.2105 | 累計平均損失: 0.3051
Epoch: 40/50 | Batch: 400/782 | 單Batch損失: 0.3451 | 累計平均損失: 0.3054
Epoch: 40/50 | Batch: 500/782 | 單Batch損失: 0.3345 | 累計平均損失: 0.3070
Epoch: 40/50 | Batch: 600/782 | 單Batch損失: 0.4133 | 累計平均損失: 0.3075
Epoch: 40/50 | Batch: 700/782 | 單Batch損失: 0.2839 | 累計平均損失: 0.3076
Epoch 40/50 完成 | 耗時: 103.49s | 訓練準確率: 89.00% | 測試準確率: 88.85%
Epoch: 41/50 | Batch: 100/782 | 單Batch損失: 0.2864 | 累計平均損失: 0.3070
Epoch: 41/50 | Batch: 200/782 | 單Batch損失: 0.4049 | 累計平均損失: 0.3045
Epoch: 41/50 | Batch: 300/782 | 單Batch損失: 0.2045 | 累計平均損失: 0.3015
Epoch: 41/50 | Batch: 400/782 | 單Batch損失: 0.2675 | 累計平均損失: 0.2992
Epoch: 41/50 | Batch: 500/782 | 單Batch損失: 0.2869 | 累計平均損失: 0.3003
Epoch: 41/50 | Batch: 600/782 | 單Batch損失: 0.3276 | 累計平均損失: 0.3023
Epoch: 41/50 | Batch: 700/782 | 單Batch損失: 0.3760 | 累計平均損失: 0.3026
Epoch 41/50 完成 | 耗時: 103.35s | 訓練準確率: 89.10% | 測試準確率: 88.61%
Epoch: 42/50 | Batch: 100/782 | 單Batch損失: 0.2120 | 累計平均損失: 0.2860
Epoch: 42/50 | Batch: 200/782 | 單Batch損失: 0.3176 | 累計平均損失: 0.2866
Epoch: 42/50 | Batch: 300/782 | 單Batch損失: 0.2915 | 累計平均損失: 0.2922
Epoch: 42/50 | Batch: 400/782 | 單Batch損失: 0.1972 | 累計平均損失: 0.2966
Epoch: 42/50 | Batch: 500/782 | 單Batch損失: 0.2939 | 累計平均損失: 0.2947
Epoch: 42/50 | Batch: 600/782 | 單Batch損失: 0.3320 | 累計平均損失: 0.2949
Epoch: 42/50 | Batch: 700/782 | 單Batch損失: 0.1988 | 累計平均損失: 0.2965
Epoch 42/50 完成 | 耗時: 102.80s | 訓練準確率: 89.45% | 測試準確率: 89.00%
Epoch: 43/50 | Batch: 100/782 | 單Batch損失: 0.4522 | 累計平均損失: 0.2848
Epoch: 43/50 | Batch: 200/782 | 單Batch損失: 0.2352 | 累計平均損失: 0.2946
Epoch: 43/50 | Batch: 300/782 | 單Batch損失: 0.2566 | 累計平均損失: 0.2886
Epoch: 43/50 | Batch: 400/782 | 單Batch損失: 0.2981 | 累計平均損失: 0.2893
Epoch: 43/50 | Batch: 500/782 | 單Batch損失: 0.2021 | 累計平均損失: 0.2886
Epoch: 43/50 | Batch: 600/782 | 單Batch損失: 0.1517 | 累計平均損失: 0.2873
Epoch: 43/50 | Batch: 700/782 | 單Batch損失: 0.3852 | 累計平均損失: 0.2889
Epoch 43/50 完成 | 耗時: 103.68s | 訓練準確率: 89.68% | 測試準確率: 88.95%
Epoch: 44/50 | Batch: 100/782 | 單Batch損失: 0.2193 | 累計平均損失: 0.2935
Epoch: 44/50 | Batch: 200/782 | 單Batch損失: 0.3290 | 累計平均損失: 0.2912
Epoch: 44/50 | Batch: 300/782 | 單Batch損失: 0.2837 | 累計平均損失: 0.2898
Epoch: 44/50 | Batch: 400/782 | 單Batch損失: 0.2521 | 累計平均損失: 0.2884
Epoch: 44/50 | Batch: 500/782 | 單Batch損失: 0.3175 | 累計平均損失: 0.2885
Epoch: 44/50 | Batch: 600/782 | 單Batch損失: 0.3056 | 累計平均損失: 0.2850
Epoch: 44/50 | Batch: 700/782 | 單Batch損失: 0.3452 | 累計平均損失: 0.2846
Epoch 44/50 完成 | 耗時: 103.63s | 訓練準確率: 89.97% | 測試準確率: 88.95%
Epoch: 45/50 | Batch: 100/782 | 單Batch損失: 0.1738 | 累計平均損失: 0.2704
Epoch: 45/50 | Batch: 200/782 | 單Batch損失: 0.1968 | 累計平均損失: 0.2783
Epoch: 45/50 | Batch: 300/782 | 單Batch損失: 0.2569 | 累計平均損失: 0.2754
Epoch: 45/50 | Batch: 400/782 | 單Batch損失: 0.2075 | 累計平均損失: 0.2756
Epoch: 45/50 | Batch: 500/782 | 單Batch損失: 0.2608 | 累計平均損失: 0.2735
Epoch: 45/50 | Batch: 600/782 | 單Batch損失: 0.2700 | 累計平均損失: 0.2752
Epoch: 45/50 | Batch: 700/782 | 單Batch損失: 0.3428 | 累計平均損失: 0.2761
Epoch 45/50 完成 | 耗時: 103.74s | 訓練準確率: 90.25% | 測試準確率: 89.02%
Epoch: 46/50 | Batch: 100/782 | 單Batch損失: 0.3770 | 累計平均損失: 0.2868
Epoch: 46/50 | Batch: 200/782 | 單Batch損失: 0.2452 | 累計平均損失: 0.2830
Epoch: 46/50 | Batch: 300/782 | 單Batch損失: 0.1669 | 累計平均損失: 0.2769
Epoch: 46/50 | Batch: 400/782 | 單Batch損失: 0.1802 | 累計平均損失: 0.2792
Epoch: 46/50 | Batch: 500/782 | 單Batch損失: 0.3140 | 累計平均損失: 0.2773
Epoch: 46/50 | Batch: 600/782 | 單Batch損失: 0.3905 | 累計平均損失: 0.2782
Epoch: 46/50 | Batch: 700/782 | 單Batch損失: 0.2951 | 累計平均損失: 0.2761
Epoch 46/50 完成 | 耗時: 103.92s | 訓練準確率: 90.10% | 測試準確率: 89.14%
Epoch: 47/50 | Batch: 100/782 | 單Batch損失: 0.2697 | 累計平均損失: 0.2699
Epoch: 47/50 | Batch: 200/782 | 單Batch損失: 0.2045 | 累計平均損失: 0.2653
Epoch: 47/50 | Batch: 300/782 | 單Batch損失: 0.3354 | 累計平均損失: 0.2629
Epoch: 47/50 | Batch: 400/782 | 單Batch損失: 0.4930 | 累計平均損失: 0.2646
Epoch: 47/50 | Batch: 500/782 | 單Batch損失: 0.1635 | 累計平均損失: 0.2673
Epoch: 47/50 | Batch: 600/782 | 單Batch損失: 0.2259 | 累計平均損失: 0.2659
Epoch: 47/50 | Batch: 700/782 | 單Batch損失: 0.0627 | 累計平均損失: 0.2681
Epoch 47/50 完成 | 耗時: 102.96s | 訓練準確率: 90.42% | 測試準確率: 89.11%
Epoch: 48/50 | Batch: 100/782 | 單Batch損失: 0.2600 | 累計平均損失: 0.2642
Epoch: 48/50 | Batch: 200/782 | 單Batch損失: 0.2261 | 累計平均損失: 0.2606
Epoch: 48/50 | Batch: 300/782 | 單Batch損失: 0.1583 | 累計平均損失: 0.2632
Epoch: 48/50 | Batch: 400/782 | 單Batch損失: 0.4387 | 累計平均損失: 0.2640
Epoch: 48/50 | Batch: 500/782 | 單Batch損失: 0.1742 | 累計平均損失: 0.2640
Epoch: 48/50 | Batch: 600/782 | 單Batch損失: 0.3551 | 累計平均損失: 0.2625
Epoch: 48/50 | Batch: 700/782 | 單Batch損失: 0.2540 | 累計平均損失: 0.2642
Epoch 48/50 完成 | 耗時: 104.25s | 訓練準確率: 90.57% | 測試準確率: 89.42%
Epoch: 49/50 | Batch: 100/782 | 單Batch損失: 0.2321 | 累計平均損失: 0.2490
Epoch: 49/50 | Batch: 200/782 | 單Batch損失: 0.2713 | 累計平均損失: 0.2543
Epoch: 49/50 | Batch: 300/782 | 單Batch損失: 0.3475 | 累計平均損失: 0.2591
Epoch: 49/50 | Batch: 400/782 | 單Batch損失: 0.2733 | 累計平均損失: 0.2588
Epoch: 49/50 | Batch: 500/782 | 單Batch損失: 0.2290 | 累計平均損失: 0.2585
Epoch: 49/50 | Batch: 600/782 | 單Batch損失: 0.1909 | 累計平均損失: 0.2569
Epoch: 49/50 | Batch: 700/782 | 單Batch損失: 0.2724 | 累計平均損失: 0.2569
Epoch 49/50 完成 | 耗時: 102.96s | 訓練準確率: 90.82% | 測試準確率: 89.23%
Epoch: 50/50 | Batch: 100/782 | 單Batch損失: 0.1978 | 累計平均損失: 0.2481
Epoch: 50/50 | Batch: 200/782 | 單Batch損失: 0.2116 | 累計平均損失: 0.2485
Epoch: 50/50 | Batch: 300/782 | 單Batch損失: 0.2898 | 累計平均損失: 0.2519
Epoch: 50/50 | Batch: 400/782 | 單Batch損失: 0.1441 | 累計平均損失: 0.2527
Epoch: 50/50 | Batch: 500/782 | 單Batch損失: 0.2770 | 累計平均損失: 0.2544
Epoch: 50/50 | Batch: 600/782 | 單Batch損失: 0.1975 | 累計平均損失: 0.2554
Epoch: 50/50 | Batch: 700/782 | 單Batch損失: 0.3464 | 累計平均損失: 0.2565
Epoch 50/50 完成 | 耗時: 103.73s | 訓練準確率: 90.98% | 測試準確率: 89.58%訓練完成! 開始繪制結果圖表...

?訓練完成!最終測試準確率: 89.58%

torch.save(model.state_dict(), 'vgg16_cbam_finetuned.pth')
print("模型已保存為: vgg16_cbam_finetuned.pth")

?模型已保存為: vgg16_cbam_finetuned.pth

@浙大疏錦行?

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

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

相關文章

Go語言多線程問題

打印零與奇偶數(leetcode 1116) 方法1:使用互斥鎖和條件變量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…

ateⅹⅰt()的用法

在C/C++中, atexit() 函數用于注冊程序退出時需要調用的函數,即使程序通過 main() 函數返回、 exit() 函數退出或異常終止,這些注冊的函數也會被執行。以下是其詳細用法: 1. 函數原型與頭文件 #include <cstdlib> // C++中需包含此頭文件 int atexit(void (*functio…

【大模型】 使用llama.cpp 進行模型轉換和量化

目錄 1 相關知識 ■llama.cpp ■GGUF 格式 ■量化 2 詳細步驟 克隆 llama.cpp 倉庫 安裝依賴 配置 CMake 構建 構建項目 驗證安裝 轉換 safetensors 為 FP16 GGUF 量化模型 (Q4_K_M) 測試量化模型 1 相關知識 ■llama.cpp llama.cpp是一個開源的 C/C++ 庫,旨…

大數據學習(133)-Hive數據分析2

????&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4…

IDEA 連接 Docker 一鍵打鏡像

首先&#xff0c;檢查 IDEA 是否安裝了 Docker 插件&#xff1a; 版本比較新的 IDEA 默認都安裝了這個插件&#xff0c;如果沒有安裝&#xff0c;安裝一下。 確保我們虛擬機上安裝了 Docker 和 Docker-compose&#xff0c;并啟動了 Docker。 找到 IDEA 下方的 Services tab 欄…

第六講——一元函數微分學的應用之中值定理、微分等式與微分不等式

文章目錄 連續函數性質定理定理1 有界與最值定理定理2 介值定理定理3 平均值定理定理4 零點定理定理5 費馬定理導數介值定理(達布定理) 中值定理羅爾定理拉格朗日中值定理柯西中值定理泰勒公式 討論方程的根問題——微分等式證明不等式問題使用函數的性質(單調性、凹凸性、最值…

2025.06.11【Ribo-seq】|用CPAT預測sORF序列的編碼潛能

文章目錄 前言一、準備工作1. 安裝CPAT2. 下載物種特異性模型 二、準備sORF核酸序列1. 獲取sORF的拼接核酸序列示例腳本&#xff08;假設已獲得外顯子fasta&#xff09;&#xff1a; 三、運行CPAT預測編碼潛能1. 準備CPAT模型和hexamer表2. 運行CPAT 四、結果解讀五、常見問題與…

Hive面試題匯總

一、hive架構相關 遇到這類問題&#xff0c;可以靈活的去回答&#xff0c;比如可以結合平時使用hive的經驗作答&#xff0c;也可以結合下圖從數據的讀入、解析、元數據的管理&#xff0c;數據的存儲等角度回答&#xff1a; 二、hive的特點 本題主要為了考察對hive的整體使用…

樹莓派超全系列教程文檔--(57)如何設置 Apache web 服務器

如何設置 Apache web 服務器 設置 Apache web 服務器安裝 Apache測試 web 服務器更改默認網頁 為 Apache 安裝 PHP 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 設置 Apache web 服務器 Apache 是一款流行的 web 服務器應用程序&#xff0c;您…

(九)現代循環神經網絡(RNN):從注意力增強到神經架構搜索的深度學習演進

現代循環神經網絡的內容&#xff0c;將介紹幾種先進的循環神經網絡架構&#xff0c;包括門控循環單元&#xff08;GRU&#xff09;、長短期記憶網絡&#xff08;LSTM&#xff09;的變體&#xff0c;以及注意力機制等。這些內容將幫助你更深入地理解循環神經網絡的發展和應用。 …

牛市與熊市:市場周期的雙面鏡

牛市推動資產增值與風險積累&#xff0c;熊市擠壓泡沫并孕育機會&#xff0c;兩者交替循環&#xff0c;構成市場自我調節機制。 1、概念對比&#xff1a;情緒與趨勢的博弈 牛市&#xff08;Bull Market&#xff09;&#xff1a;指資產價格持續上漲&#xff08;通常漲幅超20%&a…

web程序設計期末復習-填空題

常用標簽 塊級標記 行內標記等 一、塊級元素 特點&#xff1a; 獨占一行可以設置寬度、高度、內外邊距默認情況下會從上到下垂直排列 常見標簽&#xff1a; 標簽 含義 <div> 最常用的通用塊級容器 <p> 段落 <h1>到<h6> 標題&#xff08;一級…

go全局配置redis,全局只需要連接一次,然后全局可以引用使用

創建redis文件夾、創建dadeRedis.go package redisimport ("context""github.com/go-redis/redis/v8""log""time" )var (client *redis.Clientctx context.Background() )// 初始化Redis連接&#xff08;建議在程序啟動時調用&am…

緩沖區(C語言緩沖區+內核緩沖區)一個例子解釋他們的關系和作用!!!

首先提出問題&#xff1a; 為什么以下代碼是先sleep三秒后&#xff0c;屏幕才顯示"XXXXXXX"。 #include<stdio.h> #include<unistd.h>int main() {printf("XXXXXXX");sleep(3);return 0; } 為什么以下代碼是先顯示"XXXXXXX"&#xf…

【2025版】Java 工程師學習路線圖 —— 掌握程度描述版

?【2025版】Java 工程師學習路線圖 &#x1f4a1; 目標&#xff1a;成為合格的 Java 工程師&#xff08;前后端都要會&#xff09; &#x1f4dd; 結構清晰 | 階段明確 | 掌握程度分級 | 適合自學或轉行 &#x1f539; 階段一&#xff1a;編程基礎 計算機通識 模塊內容推薦掌…

從零實現一個紅隊智能體

從零實現一個紅隊智能體(持續更新) 2025-06-09 背景&#xff1a;最近學了基礎些東西和工具基礎使用&#xff0c;發現一套流程下來太多需要手工要做的&#xff0c;就像自己能不能結合自己的技術棧實現小工具 &#x1f947; 第一步&#xff1a;從實用性開始分析 目標場景 希望…

Uniapp實現多選下拉框

文章目錄 前言一、效果展示1.1 下拉效果圖1.2 下拉選擇效果圖1.3 選擇顯示效果圖 二、組件源碼2.1.CustomCheckbox.vue源碼2.2.niceui-popup-select.vue源碼 三、demo.vue代碼演示 前言 之前在使用Uniapp時&#xff0c;一直都是下拉框單選。今天某個項目需求需要使用Uniapp實現…

JavaScript-Array.from

Array.from() 是 JavaScript 中用于將類數組對象&#xff08;array-like&#xff09;或可迭代對象&#xff08;iterable&#xff09;轉換為真實數組的一個非常有用的方法。 &#x1f4cc; 一、基本語法 Array.from(arrayLike, mapFn?, thisArg?)參數說明&#xff1a; 參數類…

二刷蒼穹外賣 day02

新增員工 DTO 將前端傳遞的參數列表通過對應的實體類接收 當前端提交的數據和實體類中對應的屬性差別較大時&#xff0c;使用DTO來封裝數據 Data public class EmployeeDTO implements Serializable {private Long id;private String username;private String name;private…

通過Heron Handoff 插件我們在figma設計中可以像sketch導出離線標注

一、設計交付的歷史困境與破局契機 在數字產品開發的全流程中&#xff0c;設計標注的高效傳遞始終是連接創意與實現的關鍵紐帶。傳統設計工具如 Sketch 憑借 Bluebeam、Sketch Measure 等插件構建了成熟的離線標注體系&#xff0c;設計師可將標注文件打包交付&#xff0c;開發…