【Day41】

DAY 41 簡單CNN

知識回顧

  1. 數據增強
  2. 卷積神經網絡定義寫法
  3. batch歸一化調整一個批次分布常用與圖像數據
  4. 特征圖只有卷積操作輸出才叫特征圖
  5. 調度器直接修改基礎學習率

卷積操作常見流程如下:

1. 輸入 → 卷積層 → Batch歸一化層(可選) → 池化層 → 激活函數 → 下一層

  1. Flatten -> Dense (with Dropout,可選) -> Dense (Output)

這里相關概念比較多如果之前沒有學習過復試班強化班中的計算機視覺部分,請自行上網檢索視頻了解下基礎概念也可以對照我提供之前講義學習下

計算機視覺入門

作業:嘗試手動修改下的調度器和CNN的結構,觀察訓練差異

"""
DAY 41 實驗:比較不同的調度器和CNN結構本文件提供了多種CNN結構和學習率調度器的實現,
用于比較不同配置下的訓練效果。
"""import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader
from torch.optim.lr_scheduler import StepLR, ReduceLROnPlateau, CosineAnnealingLR, OneCycleLR# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 設置隨機種子
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# CIFAR-10數據集的類別
classes = ('飛機', '汽車', '鳥', '貓', '鹿', '狗', '青蛙', '馬', '船', '卡車')#====================== 1. 數據加載與增強 ======================def load_data(batch_size=64, is_train=True):"""加載CIFAR-10數據集,并應用數據增強"""if is_train:# 訓練集使用數據增強transform = transforms.Compose([transforms.RandomHorizontalFlip(),transforms.RandomRotation(10),transforms.RandomAffine(0, shear=10, scale=(0.8, 1.2)),transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])else:# 測試集只需要標準化transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])dataset = torchvision.datasets.CIFAR10(root='./data', train=is_train,download=True,transform=transform)dataloader = DataLoader(dataset,batch_size=batch_size,shuffle=is_train,num_workers=2)return dataloader#====================== 2. 不同的CNN模型結構 ======================class BasicCNN(nn.Module):"""基礎CNN模型:3個卷積層"""def __init__(self, use_bn=True, dropout_rate=0.5):super(BasicCNN, self).__init__()self.use_bn = use_bn# 第一個卷積塊self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(32) if use_bn else nn.Identity()# 第二個卷積塊self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(64) if use_bn else nn.Identity()# 第三個卷積塊self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.bn3 = nn.BatchNorm2d(128) if use_bn else nn.Identity()# 全連接層self.fc1 = nn.Linear(128 * 4 * 4, 512)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(512, 10)def forward(self, x):# 第一個卷積塊x = self.conv1(x)x = self.bn1(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 第二個卷積塊x = self.conv2(x)x = self.bn2(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 第三個卷積塊x = self.conv3(x)x = self.bn3(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 全連接層x = torch.flatten(x, 1)x = self.fc1(x)x = F.relu(x)x = self.dropout(x)x = self.fc2(x)return F.log_softmax(x, dim=1)class DeepCNN(nn.Module):"""更深的CNN模型:5個卷積層"""def __init__(self, use_bn=True, dropout_rate=0.5):super(DeepCNN, self).__init__()self.use_bn = use_bn# 第一個卷積塊self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(32) if use_bn else nn.Identity()# 第二個卷積塊self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(64) if use_bn else nn.Identity()# 第三個卷積塊self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.bn3 = nn.BatchNorm2d(128) if use_bn else nn.Identity()# 第四個卷積塊self.conv4 = nn.Conv2d(128, 256, kernel_size=3, padding=1)self.bn4 = nn.BatchNorm2d(256) if use_bn else nn.Identity()# 第五個卷積塊self.conv5 = nn.Conv2d(256, 512, kernel_size=3, padding=1)self.bn5 = nn.BatchNorm2d(512) if use_bn else nn.Identity()# 全連接層self.fc1 = nn.Linear(512, 512)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(512, 10)def forward(self, x):# 第一個卷積塊x = self.conv1(x)x = self.bn1(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 第二個卷積塊x = self.conv2(x)x = self.bn2(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 第三個卷積塊x = self.conv3(x)x = self.bn3(x)x = F.relu(x)# 第四個卷積塊x = self.conv4(x)x = self.bn4(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 第五個卷積塊x = self.conv5(x)x = self.bn5(x)x = F.relu(x)x = F.adaptive_avg_pool2d(x, (1, 1))# 全連接層x = torch.flatten(x, 1)x = self.fc1(x)x = F.relu(x)x = self.dropout(x)x = self.fc2(x)return F.log_softmax(x, dim=1)class ResidualBlock(nn.Module):"""殘差塊"""def __init__(self, in_channels, out_channels, stride=1):super(ResidualBlock, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(out_channels)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)self.bn2 = nn.BatchNorm2d(out_channels)self.shortcut = nn.Sequential()if stride != 1 or in_channels != out_channels:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),nn.BatchNorm2d(out_channels))def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))out += self.shortcut(x)out = F.relu(out)return outclass ResNetCNN(nn.Module):"""帶有殘差連接的CNN模型"""def __init__(self, dropout_rate=0.5):super(ResNetCNN, self).__init__()self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)self.bn1 = nn.BatchNorm2d(64)# 殘差塊self.layer1 = self._make_layer(64, 64, 2, stride=1)self.layer2 = self._make_layer(64, 128, 2, stride=2)self.layer3 = self._make_layer(128, 256, 2, stride=2)# 全連接層(修正輸入維度:256 * 8 * 8)self.fc = nn.Linear(256 * 8 * 8, 10)self.dropout = nn.Dropout(dropout_rate)def _make_layer(self, in_channels, out_channels, num_blocks, stride):layers = []layers.append(ResidualBlock(in_channels, out_channels, stride))for _ in range(1, num_blocks):layers.append(ResidualBlock(out_channels, out_channels, 1))return nn.Sequential(*layers)def forward(self, x):out = F.relu(self.bn1(self.conv1(x)))  # 32x32out = self.layer1(out)                  # 32x32out = self.layer2(out)                  # 16x16out = self.layer3(out)                  # 8x8out = torch.flatten(out, 1)             # 256*8*8out = self.dropout(out)out = self.fc(out)return F.log_softmax(out, dim=1)#====================== 3. 訓練函數 ======================def train(model, train_loader, optimizer, scheduler, epoch, history):"""訓練一個epoch"""model.train()train_loss = 0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()train_loss += loss.item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()total += target.size(0)if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} 'f'({100. * batch_idx / len(train_loader):.0f}%)]\t'f'Loss: {loss.item():.6f}\t'f'Accuracy: {100. * correct / total:.2f}%')# 如果使用ReduceLROnPlateau,需要在每個epoch結束時更新if isinstance(scheduler, optim.lr_scheduler.ReduceLROnPlateau):scheduler.step(train_loss)elif isinstance(scheduler, optim.lr_scheduler.OneCycleLR):pass  # OneCycleLR在每個batch后更新,不在epoch結束時更新else:scheduler.step()epoch_loss = train_loss / len(train_loader)epoch_acc = 100. * correct / totalhistory['train_loss'].append(epoch_loss)history['train_acc'].append(epoch_acc)return epoch_loss, epoch_acc#====================== 4. 測試函數 ======================def test(model, test_loader, history):"""在測試集上評估模型"""model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)history['test_loss'].append(test_loss)history['test_acc'].append(accuracy)print(f'\nTest set: Average loss: {test_loss:.4f}, 'f'Accuracy: {correct}/{len(test_loader.dataset)} 'f'({accuracy:.2f}%)\n')return test_loss, accuracy#====================== 5. 可視化函數 ======================def plot_training_history(history, title):"""繪制訓練歷史曲線"""epochs = range(1, len(history['train_loss']) + 1)plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(epochs, history['train_loss'], 'b-', label='訓練損失')plt.plot(epochs, history['test_loss'], 'r-', label='測試損失')plt.title(f'{title} - 訓練和測試損失')plt.xlabel('Epoch')plt.ylabel('損失')plt.legend()plt.grid(True)plt.subplot(1, 2, 2)plt.plot(epochs, history['train_acc'], 'b-', label='訓練準確率')plt.plot(epochs, history['test_acc'], 'r-', label='測試準確率')plt.title(f'{title} - 訓練和測試準確率')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.legend()plt.grid(True)plt.tight_layout()plt.show()def compare_models(histories, titles):"""比較不同模型的訓練歷史"""epochs = range(1, len(histories[0]['train_loss']) + 1)plt.figure(figsize=(12, 8))# 比較訓練損失plt.subplot(2, 2, 1)for i, history in enumerate(histories):plt.plot(epochs, history['train_loss'], label=titles[i])plt.title('訓練損失比較')plt.xlabel('Epoch')plt.ylabel('損失')plt.legend()plt.grid(True)# 比較測試損失plt.subplot(2, 2, 2)for i, history in enumerate(histories):plt.plot(epochs, history['test_loss'], label=titles[i])plt.title('測試損失比較')plt.xlabel('Epoch')plt.ylabel('損失')plt.legend()plt.grid(True)# 比較訓練準確率plt.subplot(2, 2, 3)for i, history in enumerate(histories):plt.plot(epochs, history['train_acc'], label=titles[i])plt.title('訓練準確率比較')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.legend()plt.grid(True)# 比較測試準確率plt.subplot(2, 2, 4)for i, history in enumerate(histories):plt.plot(epochs, history['test_acc'], label=titles[i])plt.title('測試準確率比較')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.legend()plt.grid(True)plt.tight_layout()plt.show()#====================== 6. 實驗函數 ======================def run_experiment(model_type, scheduler_type, epochs=10, batch_size=64, lr=0.01):"""運行一個實驗:訓練指定的模型和調度器"""# 初始化訓練歷史記錄history = {'train_loss': [],'train_acc': [],'test_loss': [],'test_acc': []}# 加載數據print("正在加載訓練集...")train_loader = load_data(batch_size, is_train=True)print("正在加載測試集...")test_loader = load_data(batch_size, is_train=False)# 創建模型if model_type == 'basic':model = BasicCNN(use_bn=True).to(device)model_name = "基礎CNN"elif model_type == 'deep':model = DeepCNN(use_bn=True).to(device)model_name = "深層CNN"elif model_type == 'resnet':model = ResNetCNN().to(device)model_name = "殘差CNN"else:raise ValueError(f"未知的模型類型: {model_type}")# 創建優化器optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9, weight_decay=5e-4)# 創建學習率調度器if scheduler_type == 'step':scheduler = StepLR(optimizer, step_size=5, gamma=0.1)scheduler_name = "StepLR"elif scheduler_type == 'plateau':scheduler = ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=3)scheduler_name = "ReduceLROnPlateau"elif scheduler_type == 'cosine':scheduler = CosineAnnealingLR(optimizer, T_max=epochs)scheduler_name = "CosineAnnealingLR"elif scheduler_type == 'onecycle':scheduler = OneCycleLR(optimizer, max_lr=lr*10, epochs=epochs, steps_per_epoch=len(train_loader))scheduler_name = "OneCycleLR"else:raise ValueError(f"未知的調度器類型: {scheduler_type}")# 訓練和測試print(f"開始訓練 {model_name} 使用 {scheduler_name},設備: {device}")for epoch in range(1, epochs + 1):train_loss, train_acc = train(model, train_loader, optimizer, scheduler, epoch, history)test_loss, test_acc = test(model, test_loader, history)# 返回訓練歷史和實驗標題return history, f"{model_name} + {scheduler_name}"#====================== 7. 主函數 ======================def main():# 超參數設置epochs = 10batch_size = 64lr = 0.01# 運行不同的實驗experiments = [# 比較不同的CNN結構(使用相同的調度器)('basic', 'cosine'),('deep', 'cosine'),('resnet', 'cosine'),# 比較不同的調度器(使用相同的CNN結構)# ('basic', 'step'),# ('basic', 'plateau'),# ('basic', 'cosine'),# ('basic', 'onecycle'),]histories = []titles = []for model_type, scheduler_type in experiments:history, title = run_experiment(model_type, scheduler_type, epochs, batch_size, lr)histories.append(history)titles.append(title)# 比較不同實驗的結果compare_models(histories, titles)if __name__ == '__main__':main()"""
實驗說明:1. 模型結構比較
- BasicCNN: 3個卷積層的基礎模型
- DeepCNN: 5個卷積層的深層模型
- ResNetCNN: 帶有殘差連接的模型2. 學習率調度器比較
- StepLR: 按步長降低學習率
- ReduceLROnPlateau: 當指標不再改善時降低學習率
- CosineAnnealingLR: 余弦退火調整學習率
- OneCycleLR: 一個周期的學習率策略3. 如何使用
- 默認比較不同的CNN結構(使用相同的余弦退火調度器)
- 取消注釋相應的代碼可以比較不同的調度器(使用相同的基礎CNN)
- 可以修改epochs、batch_size和lr參數來調整訓練過程4. 觀察重點
- 不同模型的收斂速度
- 最終的測試準確率
- 是否出現過擬合
- 學習率調度器對訓練過程的影響
"""
正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練,使用設備: cpu
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.293068  Accuracy: 12.50%
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.712008  Accuracy: 27.32%
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.600459  Accuracy: 32.20%
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.775305  Accuracy: 34.62%
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.768592  Accuracy: 36.12%
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.276903  Accuracy: 37.53%
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.339285  Accuracy: 38.52%
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.675705  Accuracy: 39.45%Test set: Average loss: 1.2459, Accuracy: 5433/10000 (54.33%)Train Epoch: 2 [0/50000 (0%)]   Loss: 1.580209  Accuracy: 40.62%
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.495638  Accuracy: 47.74%
Train Epoch: 2 [12800/50000 (26%)]      Loss: 1.260183  Accuracy: 48.11%
Train Epoch: 2 [19200/50000 (38%)]      Loss: 1.548963  Accuracy: 48.80%
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.085625  Accuracy: 49.33%
Train Epoch: 2 [32000/50000 (64%)]      Loss: 1.324473  Accuracy: 49.83%
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.382297  Accuracy: 50.29%
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.364151  Accuracy: 50.72%Test set: Average loss: 1.1879, Accuracy: 5817/10000 (58.17%)Train Epoch: 3 [0/50000 (0%)]   Loss: 1.418277  Accuracy: 43.75%
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.966939  Accuracy: 58.01%
Train Epoch: 3 [12800/50000 (26%)]      Loss: 1.144377  Accuracy: 58.63%
Train Epoch: 3 [19200/50000 (38%)]      Loss: 0.795806  Accuracy: 59.14%
Train Epoch: 3 [25600/50000 (51%)]      Loss: 0.949723  Accuracy: 59.52%
Train Epoch: 3 [32000/50000 (64%)]      Loss: 1.286763  Accuracy: 59.81%
Train Epoch: 3 [38400/50000 (77%)]      Loss: 1.195282  Accuracy: 59.94%
Train Epoch: 3 [44800/50000 (90%)]      Loss: 0.957277  Accuracy: 60.14%Test set: Average loss: 0.8982, Accuracy: 6821/10000 (68.21%)Train Epoch: 4 [0/50000 (0%)]   Loss: 0.887834  Accuracy: 71.88%
Train Epoch: 4 [6400/50000 (13%)]       Loss: 1.282257  Accuracy: 62.07%
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.960115  Accuracy: 62.15%
Train Epoch: 4 [19200/50000 (38%)]      Loss: 1.008237  Accuracy: 62.35%
Train Epoch: 4 [25600/50000 (51%)]      Loss: 1.156668  Accuracy: 62.07%
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.733899  Accuracy: 62.38%
Train Epoch: 4 [38400/50000 (77%)]      Loss: 1.111758  Accuracy: 62.18%
Train Epoch: 4 [44800/50000 (90%)]      Loss: 1.084628  Accuracy: 62.32%Test set: Average loss: 0.8728, Accuracy: 6886/10000 (68.86%)訓練完成,繪制訓練歷史...
可視化特征圖...
PS C:\Users\I.Love.I\Desktop\Python_code> & C:/Users/I.Love.I/.conda/envs/DL/python.exe c:/Users/I.Love.I/Desktop/Python_code/python60-days-challenge/1_python-learning-library/Day41_simple.py
加載數據...
Files already downloaded and verified
Files already downloaded and verified實驗1:訓練基礎CNN(3層)...
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.314068  Accuracy: 14.06%        LR: 0.010000
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.568440  Accuracy: 30.23%        LR: 0.010000
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.659113  Accuracy: 35.59%        LR: 0.010000
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.617478  Accuracy: 38.03%        LR: 0.010000
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.440859  Accuracy: 39.80%        LR: 0.010000
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.178089  Accuracy: 41.20%        LR: 0.010000
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.137583  Accuracy: 42.30%        LR: 0.010000     rain Epoch: 1 [44800/50000 (90%)]      Loss: 1.342647  Accuracy: 43.36%        LR: 0.010000
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.342647  Accuracy: 43.36%        LR: 0.010000     rain Epoch: 2 [0/50000 (0%)]   Loss: 1.309829  Accuracy: 64.06%        LR: 0.010000
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.137583  Accuracy: 42.30%        LR: 0.010000
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.342647  Accuracy: 43.36%        LR: 0.010000
Epoch 1: Test loss: 1.2134, Accuracy: 56.47%
Train Epoch: 2 [0/50000 (0%)]   Loss: 1.309829  Accuracy: 64.06%        LR: 0.010000
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.275745  Accuracy: 52.75%        LR: 0.010000
Train Epoch: 2 [12800/50000 (26%)]      Loss: 1.147640  Accuracy: 53.40%        LR: 0.010000
Train Epoch: 2 [19200/50000 (38%)]      Loss: 1.347642  Accuracy: 54.10%        LR: 0.010000
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.003166  Accuracy: 54.91%        LR: 0.010000
Train Epoch: 2 [32000/50000 (64%)]      Loss: 1.219489  Accuracy: 55.54%        LR: 0.010000
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.321691  Accuracy: 56.07%        LR: 0.010000
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.249267  Accuracy: 56.47%        LR: 0.010000
Epoch 2: Test loss: 1.0821, Accuracy: 62.85%
Train Epoch: 3 [0/50000 (0%)]   Loss: 1.189534  Accuracy: 46.88%        LR: 0.001000
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.800227  Accuracy: 63.40%        LR: 0.001000
Train Epoch: 3 [12800/50000 (26%)]      Loss: 1.102200  Accuracy: 64.44%        LR: 0.001000
Train Epoch: 3 [19200/50000 (38%)]      Loss: 0.698571  Accuracy: 64.95%        LR: 0.001000
Train Epoch: 3 [25600/50000 (51%)]      Loss: 1.008356  Accuracy: 65.14%        LR: 0.001000
Train Epoch: 3 [32000/50000 (64%)]      Loss: 1.045420  Accuracy: 65.29%        LR: 0.001000
Train Epoch: 3 [38400/50000 (77%)]      Loss: 0.906162  Accuracy: 65.34%        LR: 0.001000
Train Epoch: 3 [44800/50000 (90%)]      Loss: 0.756010  Accuracy: 65.63%        LR: 0.001000
Epoch 3: Test loss: 0.8147, Accuracy: 71.67%
Train Epoch: 4 [0/50000 (0%)]   Loss: 0.931888  Accuracy: 70.31%        LR: 0.001000
Train Epoch: 4 [6400/50000 (13%)]       Loss: 1.229634  Accuracy: 67.79%        LR: 0.001000
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.853696  Accuracy: 67.86%        LR: 0.001000
Train Epoch: 4 [19200/50000 (38%)]      Loss: 0.732714  Accuracy: 68.29%        LR: 0.001000
Train Epoch: 4 [25600/50000 (51%)]      Loss: 0.950875  Accuracy: 67.96%        LR: 0.001000
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.639869  Accuracy: 68.21%        LR: 0.001000
Train Epoch: 4 [38400/50000 (77%)]      Loss: 0.861224  Accuracy: 68.15%        LR: 0.001000
Train Epoch: 4 [44800/50000 (90%)]      Loss: 1.007439  Accuracy: 68.26%        LR: 0.001000
Epoch 4: Test loss: 0.7860, Accuracy: 72.78%
Train Epoch: 5 [0/50000 (0%)]   Loss: 0.875544  Accuracy: 64.06%        LR: 0.000100
Train Epoch: 5 [6400/50000 (13%)]       Loss: 0.798205  Accuracy: 69.00%        LR: 0.000100
Train Epoch: 5 [12800/50000 (26%)]      Loss: 0.822474  Accuracy: 69.38%        LR: 0.000100
Train Epoch: 5 [19200/50000 (38%)]      Loss: 1.100589  Accuracy: 69.60%        LR: 0.000100
Train Epoch: 5 [25600/50000 (51%)]      Loss: 0.659224  Accuracy: 69.65%        LR: 0.000100
Train Epoch: 5 [32000/50000 (64%)]      Loss: 0.748625  Accuracy: 69.64%        LR: 0.000100
Train Epoch: 5 [38400/50000 (77%)]      Loss: 0.924533  Accuracy: 69.63%        LR: 0.000100
Train Epoch: 5 [44800/50000 (90%)]      Loss: 0.868795  Accuracy: 69.70%        LR: 0.000100
Epoch 5: Test loss: 0.7704, Accuracy: 73.29%實驗2:訓練深層CNN(4層)...
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.361547  Accuracy: 10.94%        LR: 0.010000
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.508603  Accuracy: 31.33%        LR: 0.010000
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.625223  Accuracy: 36.70%        LR: 0.010000
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.560336  Accuracy: 39.16%        LR: 0.010000
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.314837  Accuracy: 41.68%        LR: 0.010000
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.158690  Accuracy: 43.56%        LR: 0.010000
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.332538  Accuracy: 45.04%        LR: 0.010000
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.487419  Accuracy: 46.50%        LR: 0.010000
Epoch 1: Test loss: 1.0876, Accuracy: 61.16%
Train Epoch: 2 [0/50000 (0%)]   Loss: 0.995175  Accuracy: 68.75%        LR: 0.009045
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.211926  Accuracy: 58.34%        LR: 0.009045
Train Epoch: 2 [12800/50000 (26%)]      Loss: 1.182561  Accuracy: 58.05%        LR: 0.009045
Train Epoch: 2 [19200/50000 (38%)]      Loss: 0.999875  Accuracy: 58.66%        LR: 0.009045
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.049008  Accuracy: 58.99%        LR: 0.009045
Train Epoch: 2 [32000/50000 (64%)]      Loss: 0.869797  Accuracy: 59.48%        LR: 0.009045
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.135825  Accuracy: 59.95%        LR: 0.009045
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.115167  Accuracy: 60.38%        LR: 0.009045
Epoch 2: Test loss: 0.9288, Accuracy: 67.52%
Train Epoch: 3 [0/50000 (0%)]   Loss: 0.859160  Accuracy: 79.69%        LR: 0.006545
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.984113  Accuracy: 67.08%        LR: 0.006545
Train Epoch: 3 [12800/50000 (26%)]      Loss: 0.934199  Accuracy: 66.88%        LR: 0.006545
Train Epoch: 3 [19200/50000 (38%)]      Loss: 1.200163  Accuracy: 67.24%        LR: 0.006545
Train Epoch: 3 [25600/50000 (51%)]      Loss: 0.886985  Accuracy: 67.39%        LR: 0.006545
Train Epoch: 3 [32000/50000 (64%)]      Loss: 0.588489  Accuracy: 67.56%        LR: 0.006545
Train Epoch: 3 [38400/50000 (77%)]      Loss: 0.802626  Accuracy: 67.73%        LR: 0.006545
Train Epoch: 3 [44800/50000 (90%)]      Loss: 0.769826  Accuracy: 68.06%        LR: 0.006545
Epoch 3: Test loss: 0.8234, Accuracy: 71.23%
Train Epoch: 4 [0/50000 (0%)]   Loss: 0.797326  Accuracy: 71.88%        LR: 0.003455
Train Epoch: 4 [6400/50000 (13%)]       Loss: 0.657178  Accuracy: 72.43%        LR: 0.003455
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.851532  Accuracy: 72.68%        LR: 0.003455
Train Epoch: 4 [19200/50000 (38%)]      Loss: 0.643618  Accuracy: 72.88%        LR: 0.003455
Train Epoch: 4 [25600/50000 (51%)]      Loss: 0.614715  Accuracy: 73.11%        LR: 0.003455
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.621094  Accuracy: 73.54%        LR: 0.003455
Train Epoch: 4 [38400/50000 (77%)]      Loss: 0.869759  Accuracy: 73.46%        LR: 0.003455
Train Epoch: 4 [44800/50000 (90%)]      Loss: 0.878335  Accuracy: 73.54%        LR: 0.003455
Epoch 4: Test loss: 0.6981, Accuracy: 75.48%
Train Epoch: 5 [0/50000 (0%)]   Loss: 0.766669  Accuracy: 68.75%        LR: 0.000955
Train Epoch: 5 [6400/50000 (13%)]       Loss: 0.553567  Accuracy: 75.59%        LR: 0.000955
Train Epoch: 5 [12800/50000 (26%)]      Loss: 0.499649  Accuracy: 76.55%        LR: 0.000955
Train Epoch: 5 [19200/50000 (38%)]      Loss: 0.672797  Accuracy: 76.39%        LR: 0.000955
Train Epoch: 5 [25600/50000 (51%)]      Loss: 0.780928  Accuracy: 76.45%        LR: 0.000955
Train Epoch: 5 [32000/50000 (64%)]      Loss: 0.580088  Accuracy: 76.59%        LR: 0.000955
Train Epoch: 5 [38400/50000 (77%)]      Loss: 0.698451  Accuracy: 76.64%        LR: 0.000955
Train Epoch: 5 [44800/50000 (90%)]      Loss: 0.682562  Accuracy: 76.69%        LR: 0.000955
Epoch 5: Test loss: 0.6332, Accuracy: 78.08%
PS C:\Users\I.Love.I\Desktop\Python_code> & C:/Users/I.Love.I/.conda/envs/DL/python.exe c:/Users/I.Love.I/Desktop/Python_code/python60-days-challenge/1_python-learning-library/Day41_experiments.py
正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練 基礎CNN 使用 CosineAnnealingLR,設備: cpu
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.293068  Accuracy: 12.50%
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.722358  Accuracy: 27.48%
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.556882  Accuracy: 31.74%
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.758241  Accuracy: 34.25%
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.674700  Accuracy: 35.67%
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.315244  Accuracy: 37.07%
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.367913  Accuracy: 38.25%
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.559623  Accuracy: 39.41%Test set: Average loss: 1.2118, Accuracy: 5600/10000 (56.00%)Train Epoch: 2 [0/50000 (0%)]   Loss: 1.484513  Accuracy: 50.00%
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.664975  Accuracy: 47.22%
Train Epoch: 2 [12800/50000 (26%)]      Loss: 1.220539  Accuracy: 48.27%
Train Epoch: 2 [19200/50000 (38%)]      Loss: 1.407580  Accuracy: 49.03%
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.092925  Accuracy: 49.81%
Train Epoch: 2 [32000/50000 (64%)]      Loss: 1.206660  Accuracy: 50.29%
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.379342  Accuracy: 50.75%
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.501670  Accuracy: 51.13%Test set: Average loss: 1.1633, Accuracy: 6020/10000 (60.20%)Train Epoch: 3 [0/50000 (0%)]   Loss: 1.454061  Accuracy: 50.00%
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.939104  Accuracy: 57.24%
Train Epoch: 3 [12800/50000 (26%)]      Loss: 1.240231  Accuracy: 56.58%
Train Epoch: 3 [19200/50000 (38%)]      Loss: 0.877654  Accuracy: 57.00%
Train Epoch: 3 [25600/50000 (51%)]      Loss: 1.166832  Accuracy: 57.22%
Train Epoch: 3 [32000/50000 (64%)]      Loss: 1.057176  Accuracy: 57.53%
Train Epoch: 3 [38400/50000 (77%)]      Loss: 1.339103  Accuracy: 57.71%
Train Epoch: 3 [44800/50000 (90%)]      Loss: 1.041523  Accuracy: 58.04%Test set: Average loss: 0.9137, Accuracy: 6791/10000 (67.91%)Train Epoch: 4 [0/50000 (0%)]   Loss: 0.974381  Accuracy: 68.75%
Train Epoch: 4 [6400/50000 (13%)]       Loss: 1.366313  Accuracy: 62.33%
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.929462  Accuracy: 62.22%
Train Epoch: 4 [19200/50000 (38%)]      Loss: 0.884589  Accuracy: 62.59%
Train Epoch: 4 [25600/50000 (51%)]      Loss: 1.171518  Accuracy: 62.30%
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.842188  Accuracy: 62.71%
Train Epoch: 4 [38400/50000 (77%)]      Loss: 1.012197  Accuracy: 62.51%
Train Epoch: 4 [44800/50000 (90%)]      Loss: 1.134873  Accuracy: 62.71%Test set: Average loss: 0.8598, Accuracy: 6938/10000 (69.38%)Train Epoch: 5 [0/50000 (0%)]   Loss: 0.878952  Accuracy: 67.19%
Train Epoch: 5 [6400/50000 (13%)]       Loss: 1.031704  Accuracy: 64.60%
Train Epoch: 5 [12800/50000 (26%)]      Loss: 1.064272  Accuracy: 65.48%
Train Epoch: 5 [19200/50000 (38%)]      Loss: 1.377383  Accuracy: 65.85%
Train Epoch: 5 [25600/50000 (51%)]      Loss: 0.908284  Accuracy: 66.02%
Train Epoch: 5 [32000/50000 (64%)]      Loss: 0.973955  Accuracy: 66.14%
Train Epoch: 5 [38400/50000 (77%)]      Loss: 1.087591  Accuracy: 66.22%
Train Epoch: 5 [44800/50000 (90%)]      Loss: 0.889676  Accuracy: 66.24%Test set: Average loss: 0.7889, Accuracy: 7208/10000 (72.08%)Train Epoch: 6 [0/50000 (0%)]   Loss: 0.876616  Accuracy: 70.31%
Train Epoch: 6 [6400/50000 (13%)]       Loss: 0.897449  Accuracy: 67.44%
Train Epoch: 6 [12800/50000 (26%)]      Loss: 1.097278  Accuracy: 67.63%
Train Epoch: 6 [19200/50000 (38%)]      Loss: 0.918221  Accuracy: 68.12%
Train Epoch: 6 [25600/50000 (51%)]      Loss: 0.754201  Accuracy: 68.52%
Train Epoch: 6 [32000/50000 (64%)]      Loss: 0.915608  Accuracy: 68.48%
Train Epoch: 6 [38400/50000 (77%)]      Loss: 1.108561  Accuracy: 68.63%
Train Epoch: 6 [44800/50000 (90%)]      Loss: 0.889088  Accuracy: 68.67%Test set: Average loss: 0.6993, Accuracy: 7569/10000 (75.69%)Train Epoch: 7 [0/50000 (0%)]   Loss: 0.958089  Accuracy: 65.62%
Train Epoch: 7 [6400/50000 (13%)]       Loss: 1.091723  Accuracy: 70.81%
Train Epoch: 7 [12800/50000 (26%)]      Loss: 0.777307  Accuracy: 70.35%
Train Epoch: 7 [19200/50000 (38%)]      Loss: 1.069645  Accuracy: 70.53%
Train Epoch: 7 [25600/50000 (51%)]      Loss: 0.896357  Accuracy: 70.77%
Train Epoch: 7 [32000/50000 (64%)]      Loss: 0.776956  Accuracy: 70.76%
Train Epoch: 7 [38400/50000 (77%)]      Loss: 0.742222  Accuracy: 70.88%
Train Epoch: 7 [44800/50000 (90%)]      Loss: 0.773929  Accuracy: 70.91%Test set: Average loss: 0.6808, Accuracy: 7606/10000 (76.06%)Train Epoch: 8 [0/50000 (0%)]   Loss: 0.693062  Accuracy: 73.44%
Train Epoch: 8 [6400/50000 (13%)]       Loss: 0.597719  Accuracy: 71.81%
Train Epoch: 8 [12800/50000 (26%)]      Loss: 0.577101  Accuracy: 72.22%
Train Epoch: 8 [19200/50000 (38%)]      Loss: 0.715675  Accuracy: 72.38%
Train Epoch: 8 [25600/50000 (51%)]      Loss: 0.894164  Accuracy: 72.39%
Train Epoch: 8 [32000/50000 (64%)]      Loss: 0.889195  Accuracy: 72.42%
Train Epoch: 8 [38400/50000 (77%)]      Loss: 0.777797  Accuracy: 72.43%
Train Epoch: 8 [44800/50000 (90%)]      Loss: 0.707688  Accuracy: 72.41%Test set: Average loss: 0.6419, Accuracy: 7769/10000 (77.69%)Train Epoch: 9 [0/50000 (0%)]   Loss: 0.801439  Accuracy: 73.44%
Train Epoch: 9 [6400/50000 (13%)]       Loss: 0.908550  Accuracy: 72.94%
Train Epoch: 9 [12800/50000 (26%)]      Loss: 0.692507  Accuracy: 73.35%
Train Epoch: 9 [19200/50000 (38%)]      Loss: 0.560888  Accuracy: 73.52%
Train Epoch: 9 [25600/50000 (51%)]      Loss: 0.740002  Accuracy: 73.79%
Train Epoch: 9 [32000/50000 (64%)]      Loss: 0.751597  Accuracy: 73.90%
Train Epoch: 9 [38400/50000 (77%)]      Loss: 0.994493  Accuracy: 73.81%
Train Epoch: 9 [44800/50000 (90%)]      Loss: 0.777613  Accuracy: 73.88%Test set: Average loss: 0.6190, Accuracy: 7830/10000 (78.30%)Train Epoch: 10 [0/50000 (0%)]  Loss: 0.687152  Accuracy: 79.69%
Train Epoch: 10 [6400/50000 (13%)]      Loss: 0.801341  Accuracy: 73.86%
Train Epoch: 10 [12800/50000 (26%)]     Loss: 0.684478  Accuracy: 73.98%
Train Epoch: 10 [19200/50000 (38%)]     Loss: 0.705056  Accuracy: 74.19%
Train Epoch: 10 [25600/50000 (51%)]     Loss: 0.853381  Accuracy: 74.05%
Train Epoch: 10 [32000/50000 (64%)]     Loss: 0.580054  Accuracy: 74.07%
Train Epoch: 10 [38400/50000 (77%)]     Loss: 0.817881  Accuracy: 74.00%
Train Epoch: 10 [44800/50000 (90%)]     Loss: 0.817918  Accuracy: 74.10%Test set: Average loss: 0.6143, Accuracy: 7862/10000 (78.62%)正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練 深層CNN 使用 CosineAnnealingLR,設備: cpu
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.342756  Accuracy: 14.06%
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.850860  Accuracy: 25.28%
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.762461  Accuracy: 30.99%
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.590530  Accuracy: 34.26%
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.340634  Accuracy: 36.95%
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.501504  Accuracy: 39.23%
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.322111  Accuracy: 41.06%
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.156101  Accuracy: 42.66%Test set: Average loss: 1.2036, Accuracy: 5570/10000 (55.70%)Train Epoch: 2 [0/50000 (0%)]   Loss: 1.286792  Accuracy: 54.69%
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.453677  Accuracy: 55.48%
Train Epoch: 2 [12800/50000 (26%)]      Loss: 0.941933  Accuracy: 56.44%
Train Epoch: 2 [19200/50000 (38%)]      Loss: 1.107067  Accuracy: 56.65%
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.146062  Accuracy: 56.92%
Train Epoch: 2 [32000/50000 (64%)]      Loss: 1.112035  Accuracy: 57.31%
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.183208  Accuracy: 57.59%
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.217674  Accuracy: 58.32%Test set: Average loss: 1.0009, Accuracy: 6483/10000 (64.83%)Train Epoch: 3 [0/50000 (0%)]   Loss: 1.032111  Accuracy: 62.50%
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.904841  Accuracy: 64.26%
Train Epoch: 3 [12800/50000 (26%)]      Loss: 1.111103  Accuracy: 64.02%
Train Epoch: 3 [19200/50000 (38%)]      Loss: 1.111288  Accuracy: 64.01%
Train Epoch: 3 [25600/50000 (51%)]      Loss: 0.887255  Accuracy: 64.14%
Train Epoch: 3 [32000/50000 (64%)]      Loss: 0.821008  Accuracy: 64.42%
Train Epoch: 3 [38400/50000 (77%)]      Loss: 0.922995  Accuracy: 64.60%
Train Epoch: 3 [44800/50000 (90%)]      Loss: 0.852235  Accuracy: 64.90%Test set: Average loss: 0.7871, Accuracy: 7225/10000 (72.25%)Train Epoch: 4 [0/50000 (0%)]   Loss: 1.008779  Accuracy: 68.75%
Train Epoch: 4 [6400/50000 (13%)]       Loss: 0.877065  Accuracy: 68.30%
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.890234  Accuracy: 68.38%
Train Epoch: 4 [19200/50000 (38%)]      Loss: 0.822239  Accuracy: 68.46%
Train Epoch: 4 [25600/50000 (51%)]      Loss: 1.126034  Accuracy: 68.56%
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.859953  Accuracy: 68.46%
Train Epoch: 4 [38400/50000 (77%)]      Loss: 0.792203  Accuracy: 68.64%
Train Epoch: 4 [44800/50000 (90%)]      Loss: 0.921908  Accuracy: 68.79%Test set: Average loss: 0.7564, Accuracy: 7332/10000 (73.32%)Train Epoch: 5 [0/50000 (0%)]   Loss: 0.739065  Accuracy: 68.75%
Train Epoch: 5 [6400/50000 (13%)]       Loss: 0.773354  Accuracy: 71.61%
Train Epoch: 5 [12800/50000 (26%)]      Loss: 0.605493  Accuracy: 72.07%
Train Epoch: 5 [19200/50000 (38%)]      Loss: 0.617809  Accuracy: 72.11%
Train Epoch: 5 [25600/50000 (51%)]      Loss: 0.883427  Accuracy: 72.07%
Train Epoch: 5 [32000/50000 (64%)]      Loss: 0.842254  Accuracy: 71.99%
Train Epoch: 5 [38400/50000 (77%)]      Loss: 0.533248  Accuracy: 72.05%
Train Epoch: 5 [44800/50000 (90%)]      Loss: 1.000729  Accuracy: 72.02%Test set: Average loss: 0.6809, Accuracy: 7611/10000 (76.11%)Train Epoch: 6 [0/50000 (0%)]   Loss: 0.810092  Accuracy: 73.44%
Train Epoch: 6 [6400/50000 (13%)]       Loss: 0.616662  Accuracy: 73.48%
Train Epoch: 6 [12800/50000 (26%)]      Loss: 0.562376  Accuracy: 74.10%
Train Epoch: 6 [19200/50000 (38%)]      Loss: 0.832556  Accuracy: 73.90%
Train Epoch: 6 [25600/50000 (51%)]      Loss: 0.878011  Accuracy: 74.10%
Train Epoch: 6 [32000/50000 (64%)]      Loss: 0.509199  Accuracy: 74.05%
Train Epoch: 6 [38400/50000 (77%)]      Loss: 0.673968  Accuracy: 74.19%
Train Epoch: 6 [44800/50000 (90%)]      Loss: 0.744006  Accuracy: 74.30%Test set: Average loss: 0.6272, Accuracy: 7805/10000 (78.05%)Train Epoch: 7 [0/50000 (0%)]   Loss: 0.555623  Accuracy: 81.25%
Train Epoch: 7 [6400/50000 (13%)]       Loss: 0.578787  Accuracy: 76.49%
Train Epoch: 7 [12800/50000 (26%)]      Loss: 0.823545  Accuracy: 76.82%
Train Epoch: 7 [19200/50000 (38%)]      Loss: 0.716045  Accuracy: 76.79%
Train Epoch: 7 [25600/50000 (51%)]      Loss: 0.815958  Accuracy: 76.64%
Train Epoch: 7 [32000/50000 (64%)]      Loss: 0.755133  Accuracy: 76.55%
Train Epoch: 7 [38400/50000 (77%)]      Loss: 0.602492  Accuracy: 76.47%
Train Epoch: 7 [44800/50000 (90%)]      Loss: 0.758558  Accuracy: 76.46%Test set: Average loss: 0.5867, Accuracy: 7979/10000 (79.79%)Train Epoch: 8 [0/50000 (0%)]   Loss: 0.834396  Accuracy: 73.44%
Train Epoch: 8 [6400/50000 (13%)]       Loss: 0.533800  Accuracy: 78.57%
Train Epoch: 8 [12800/50000 (26%)]      Loss: 0.626373  Accuracy: 78.33%
Train Epoch: 8 [19200/50000 (38%)]      Loss: 0.643600  Accuracy: 78.60%
Train Epoch: 8 [25600/50000 (51%)]      Loss: 0.740194  Accuracy: 78.72%
Train Epoch: 8 [32000/50000 (64%)]      Loss: 0.602970  Accuracy: 78.66%
Train Epoch: 8 [38400/50000 (77%)]      Loss: 0.432281  Accuracy: 78.71%
Train Epoch: 8 [44800/50000 (90%)]      Loss: 0.451608  Accuracy: 78.71%Test set: Average loss: 0.5375, Accuracy: 8155/10000 (81.55%)Train Epoch: 9 [0/50000 (0%)]   Loss: 0.863743  Accuracy: 68.75%
Train Epoch: 9 [6400/50000 (13%)]       Loss: 0.412280  Accuracy: 79.07%
Train Epoch: 9 [12800/50000 (26%)]      Loss: 0.553952  Accuracy: 79.86%
Train Epoch: 9 [19200/50000 (38%)]      Loss: 0.724988  Accuracy: 79.91%
Train Epoch: 9 [25600/50000 (51%)]      Loss: 0.498772  Accuracy: 79.94%
Train Epoch: 9 [32000/50000 (64%)]      Loss: 0.791269  Accuracy: 80.01%
Train Epoch: 9 [38400/50000 (77%)]      Loss: 0.518802  Accuracy: 79.95%
Train Epoch: 9 [44800/50000 (90%)]      Loss: 0.408082  Accuracy: 79.84%Test set: Average loss: 0.5060, Accuracy: 8271/10000 (82.71%)Train Epoch: 10 [0/50000 (0%)]  Loss: 0.534627  Accuracy: 84.38%
Train Epoch: 10 [6400/50000 (13%)]      Loss: 0.785889  Accuracy: 80.35%
Train Epoch: 10 [12800/50000 (26%)]     Loss: 0.448817  Accuracy: 80.48%
Train Epoch: 10 [19200/50000 (38%)]     Loss: 0.501668  Accuracy: 80.71%
Train Epoch: 10 [25600/50000 (51%)]     Loss: 0.587260  Accuracy: 80.95%
Train Epoch: 10 [32000/50000 (64%)]     Loss: 0.423947  Accuracy: 81.13%
Train Epoch: 10 [38400/50000 (77%)]     Loss: 0.846690  Accuracy: 81.14%
Train Epoch: 10 [44800/50000 (90%)]     Loss: 0.598511  Accuracy: 81.15%Test set: Average loss: 0.4925, Accuracy: 8322/10000 (83.22%)正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練 殘差CNN 使用 CosineAnnealingLR,設備: cpu
Traceback (most recent call last):File "c:\Users\I.Love.I\Desktop\Python_code\python60-days-challenge\1_python-learning-library\Day41_experiments.py", line 506, in <module>main()File "c:\Users\I.Love.I\Desktop\Python_code\python60-days-challenge\1_python-learning-library\Day41_experiments.py", line 498, in mainhistory, title = run_experiment(model_type, scheduler_type, epochs, batch_size, lr)File "c:\Users\I.Love.I\Desktop\Python_code\python60-days-challenge\1_python-learning-library\Day41_experiments.py", line 466, in run_experimenttrain_loss, train_acc = train(model, train_loader, optimizer, scheduler, epoch, history)File "c:\Users\I.Love.I\Desktop\Python_code\python60-days-challenge\1_python-learning-library\Day41_experiments.py", line 267, in trainoutput = model(data)File "C:\Users\I.Love.I\.conda\envs\DL\lib\site-packages\torch\nn\modules\module.py", line 1553, in _wrapped_call_implreturn self._call_impl(*args, **kwargs)File "C:\Users\I.Love.I\.conda\envs\DL\lib\site-packages\torch\nn\modules\module.py", line 1562, in _call_implreturn forward_call(*args, **kwargs)File "c:\Users\I.Love.I\Desktop\Python_code\python60-days-challenge\1_python-learning-library\Day41_experiments.py", line 249, in forwardout = self.fc(out)File "C:\Users\I.Love.I\.conda\envs\DL\lib\site-packages\torch\nn\modules\module.py", line 1553, in _wrapped_call_implreturn self._call_impl(*args, **kwargs)File "C:\Users\I.Love.I\.conda\envs\DL\lib\site-packages\torch\nn\modules\module.py", line 1562, in _call_implreturn forward_call(*args, **kwargs)File "C:\Users\I.Love.I\.conda\envs\DL\lib\site-packages\torch\nn\modules\linear.py", line 117, in forwardreturn F.linear(input, self.weight, self.bias)
RuntimeError: mat1 and mat2 shapes cannot be multiplied (64x1024 and 16384x10)
PS C:\Users\I.Love.I\Desktop\Python_code> & C:/Users/I.Love.I/.conda/envs/DL/python.exe c:/Users/I.Love.I/Desktop/Python_code/python60-days-challenge/1_python-learning-library/Day41_experiments.py
正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練 基礎CNN 使用 CosineAnnealingLR,設備: cpu
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.293068  Accuracy: 12.50%
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.722358  Accuracy: 27.48%
Train Epoch: 1 [12800/50000 (26%)]      Loss: 1.556882  Accuracy: 31.74%
Train Epoch: 1 [19200/50000 (38%)]      Loss: 1.758241  Accuracy: 34.25%
Train Epoch: 1 [25600/50000 (51%)]      Loss: 1.674700  Accuracy: 35.67%
Train Epoch: 1 [32000/50000 (64%)]      Loss: 1.315244  Accuracy: 37.07%
Train Epoch: 1 [38400/50000 (77%)]      Loss: 1.367913  Accuracy: 38.25%
Train Epoch: 1 [44800/50000 (90%)]      Loss: 1.559623  Accuracy: 39.41%Test set: Average loss: 1.2118, Accuracy: 5600/10000 (56.00%)Train Epoch: 2 [0/50000 (0%)]   Loss: 1.484513  Accuracy: 50.00%
Train Epoch: 2 [6400/50000 (13%)]       Loss: 1.664975  Accuracy: 47.22%
Train Epoch: 2 [12800/50000 (26%)]      Loss: 1.220539  Accuracy: 48.27%
Train Epoch: 2 [19200/50000 (38%)]      Loss: 1.407580  Accuracy: 49.03%
Train Epoch: 2 [25600/50000 (51%)]      Loss: 1.092925  Accuracy: 49.81%
Train Epoch: 2 [32000/50000 (64%)]      Loss: 1.206660  Accuracy: 50.29%
Train Epoch: 2 [38400/50000 (77%)]      Loss: 1.379342  Accuracy: 50.75%
Train Epoch: 2 [44800/50000 (90%)]      Loss: 1.501670  Accuracy: 51.13%Test set: Average loss: 1.1633, Accuracy: 6020/10000 (60.20%)Train Epoch: 3 [0/50000 (0%)]   Loss: 1.454061  Accuracy: 50.00%
Train Epoch: 3 [6400/50000 (13%)]       Loss: 0.939104  Accuracy: 57.24%
Train Epoch: 3 [12800/50000 (26%)]      Loss: 1.240231  Accuracy: 56.58%
Train Epoch: 3 [19200/50000 (38%)]      Loss: 0.877654  Accuracy: 57.00%
Train Epoch: 3 [25600/50000 (51%)]      Loss: 1.166832  Accuracy: 57.22%
Train Epoch: 3 [32000/50000 (64%)]      Loss: 1.057176  Accuracy: 57.53%
Train Epoch: 3 [38400/50000 (77%)]      Loss: 1.339103  Accuracy: 57.71%
Train Epoch: 3 [44800/50000 (90%)]      Loss: 1.041523  Accuracy: 58.04%Test set: Average loss: 0.9137, Accuracy: 6791/10000 (67.91%)Train Epoch: 4 [0/50000 (0%)]   Loss: 0.974381  Accuracy: 68.75%
Train Epoch: 4 [6400/50000 (13%)]       Loss: 1.366313  Accuracy: 62.33%
Train Epoch: 4 [12800/50000 (26%)]      Loss: 0.929462  Accuracy: 62.22%
Train Epoch: 4 [19200/50000 (38%)]      Loss: 0.884589  Accuracy: 62.59%
Train Epoch: 4 [25600/50000 (51%)]      Loss: 1.171518  Accuracy: 62.30%
Train Epoch: 4 [32000/50000 (64%)]      Loss: 0.842188  Accuracy: 62.71%
Train Epoch: 4 [38400/50000 (77%)]      Loss: 1.012197  Accuracy: 62.51%
Train Epoch: 4 [44800/50000 (90%)]      Loss: 1.134873  Accuracy: 62.71%Test set: Average loss: 0.8598, Accuracy: 6938/10000 (69.38%)Train Epoch: 5 [0/50000 (0%)]   Loss: 0.878952  Accuracy: 67.19%
Train Epoch: 5 [6400/50000 (13%)]       Loss: 1.031704  Accuracy: 64.60%
Train Epoch: 5 [12800/50000 (26%)]      Loss: 1.064272  Accuracy: 65.48%
Train Epoch: 5 [19200/50000 (38%)]      Loss: 1.377383  Accuracy: 65.85%
Train Epoch: 5 [25600/50000 (51%)]      Loss: 0.908284  Accuracy: 66.02%
Train Epoch: 5 [32000/50000 (64%)]      Loss: 0.973955  Accuracy: 66.14%
Train Epoch: 5 [38400/50000 (77%)]      Loss: 1.087591  Accuracy: 66.22%
Train Epoch: 5 [44800/50000 (90%)]      Loss: 0.889676  Accuracy: 66.24%Test set: Average loss: 0.7889, Accuracy: 7208/10000 (72.08%)Train Epoch: 6 [0/50000 (0%)]   Loss: 0.876616  Accuracy: 70.31%
Train Epoch: 6 [6400/50000 (13%)]       Loss: 0.897449  Accuracy: 67.44%
Train Epoch: 6 [12800/50000 (26%)]      Loss: 1.097278  Accuracy: 67.63%
Train Epoch: 6 [19200/50000 (38%)]      Loss: 0.918221  Accuracy: 68.12%
Train Epoch: 6 [25600/50000 (51%)]      Loss: 0.754201  Accuracy: 68.52%
Train Epoch: 6 [32000/50000 (64%)]      Loss: 0.915608  Accuracy: 68.48%
Train Epoch: 6 [38400/50000 (77%)]      Loss: 1.108561  Accuracy: 68.63%
Train Epoch: 6 [44800/50000 (90%)]      Loss: 0.889088  Accuracy: 68.67%Test set: Average loss: 0.6993, Accuracy: 7569/10000 (75.69%)Train Epoch: 7 [0/50000 (0%)]   Loss: 0.958089  Accuracy: 65.62%
Train Epoch: 7 [6400/50000 (13%)]       Loss: 1.091723  Accuracy: 70.81%
Train Epoch: 7 [12800/50000 (26%)]      Loss: 0.777307  Accuracy: 70.35%
Train Epoch: 7 [19200/50000 (38%)]      Loss: 1.069645  Accuracy: 70.53%
Train Epoch: 7 [25600/50000 (51%)]      Loss: 0.896357  Accuracy: 70.77%
Train Epoch: 7 [32000/50000 (64%)]      Loss: 0.776956  Accuracy: 70.76%
Train Epoch: 7 [38400/50000 (77%)]      Loss: 0.742222  Accuracy: 70.88%
Train Epoch: 7 [44800/50000 (90%)]      Loss: 0.773929  Accuracy: 70.91%Test set: Average loss: 0.6808, Accuracy: 7606/10000 (76.06%)Train Epoch: 8 [0/50000 (0%)]   Loss: 0.693062  Accuracy: 73.44%
Train Epoch: 8 [6400/50000 (13%)]       Loss: 0.597719  Accuracy: 71.81%
Train Epoch: 8 [12800/50000 (26%)]      Loss: 0.577101  Accuracy: 72.22%
Train Epoch: 8 [19200/50000 (38%)]      Loss: 0.715675  Accuracy: 72.38%
Train Epoch: 8 [25600/50000 (51%)]      Loss: 0.894164  Accuracy: 72.39%
Train Epoch: 8 [32000/50000 (64%)]      Loss: 0.889195  Accuracy: 72.42%
Train Epoch: 8 [38400/50000 (77%)]      Loss: 0.777797  Accuracy: 72.43%
Train Epoch: 8 [44800/50000 (90%)]      Loss: 0.707688  Accuracy: 72.41%Test set: Average loss: 0.6419, Accuracy: 7769/10000 (77.69%)Train Epoch: 9 [0/50000 (0%)]   Loss: 0.801439  Accuracy: 73.44%
Train Epoch: 9 [6400/50000 (13%)]       Loss: 0.908550  Accuracy: 72.94%
Train Epoch: 9 [12800/50000 (26%)]      Loss: 0.692507  Accuracy: 73.35%
Train Epoch: 9 [19200/50000 (38%)]      Loss: 0.560888  Accuracy: 73.52%
Train Epoch: 9 [25600/50000 (51%)]      Loss: 0.740002  Accuracy: 73.79%
Train Epoch: 9 [32000/50000 (64%)]      Loss: 0.751597  Accuracy: 73.90%
Train Epoch: 9 [38400/50000 (77%)]      Loss: 0.994493  Accuracy: 73.81%
Train Epoch: 9 [44800/50000 (90%)]      Loss: 0.777613  Accuracy: 73.88%Test set: Average loss: 0.6190, Accuracy: 7830/10000 (78.30%)Train Epoch: 10 [0/50000 (0%)]  Loss: 0.687152  Accuracy: 79.69%
Train Epoch: 10 [6400/50000 (13%)]      Loss: 0.801341  Accuracy: 73.86%
Train Epoch: 10 [12800/50000 (26%)]     Loss: 0.684478  Accuracy: 73.98%
Train Epoch: 10 [19200/50000 (38%)]     Loss: 0.705056  Accuracy: 74.19%
Train Epoch: 10 [25600/50000 (51%)]     Loss: 0.853381  Accuracy: 74.05%
Train Epoch: 10 [32000/50000 (64%)]     Loss: 0.580054  Accuracy: 74.07%
Train Epoch: 10 [38400/50000 (77%)]     Loss: 0.817881  Accuracy: 74.00%
Train Epoch: 10 [44800/50000 (90%)]     Loss: 0.817918  Accuracy: 74.10%Test set: Average loss: 0.6143, Accuracy: 7862/10000 (78.62%)正在加載訓練集...
Files already downloaded and verified
正在加載測試集...
Files already downloaded and verified
開始訓練 深層CNN 使用 CosineAnnealingLR,設備: cpu
Train Epoch: 1 [0/50000 (0%)]   Loss: 2.342756  Accuracy: 14.06%
Train Epoch: 1 [6400/50000 (13%)]       Loss: 1.850860  Accuracy: 25.28%
"""
DAY 41 簡單CNN本節重點:
1. 數據增強
2. CNN結構定義
3. Batch Normalization
4. 特征圖可視化
5. 學習率調度器
"""import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 設置隨機種子
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# CIFAR-10數據集的類別
classes = ('飛機', '汽車', '鳥', '貓', '鹿', '狗', '青蛙', '馬', '船', '卡車')#====================== 1. 數據加載與增強 ======================def load_data(batch_size=64, is_train=True):"""加載CIFAR-10數據集,并應用數據增強"""if is_train:# 訓練集使用數據增強transform = transforms.Compose([transforms.RandomHorizontalFlip(),  # 隨機水平翻轉transforms.RandomRotation(10),      # 隨機旋轉transforms.RandomAffine(0, shear=10, scale=(0.8, 1.2)),  # 隨機仿射變換transforms.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2),  # 顏色抖動transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])else:# 測試集只需要標準化transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])dataset = torchvision.datasets.CIFAR10(root='./data', train=is_train,download=True,transform=transform)dataloader = DataLoader(dataset,batch_size=batch_size,shuffle=is_train,num_workers=2)return dataloader#====================== 2. CNN模型定義 ======================class SimpleNet(nn.Module):def __init__(self, dropout_rate=0.5):super(SimpleNet, self).__init__()# 第一個卷積塊self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(32)# 第二個卷積塊self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(64)# 第三個卷積塊self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)self.bn3 = nn.BatchNorm2d(128)# 全連接層self.fc1 = nn.Linear(128 * 4 * 4, 512)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(512, 10)def forward(self, x):# 保存特征圖用于可視化self.feature_maps = []# 第一個卷積塊x = self.conv1(x)x = self.bn1(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 第二個卷積塊x = self.conv2(x)x = self.bn2(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 第三個卷積塊x = self.conv3(x)x = self.bn3(x)x = F.relu(x)x = F.max_pool2d(x, 2)self.feature_maps.append(x)# 全連接層x = torch.flatten(x, 1)x = self.fc1(x)x = F.relu(x)x = self.dropout(x)x = self.fc2(x)return F.log_softmax(x, dim=1)#====================== 3. 訓練函數 ======================def train(model, train_loader, optimizer, epoch, history):"""訓練一個epoch"""model.train()train_loss = 0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()train_loss += loss.item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()total += target.size(0)if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} 'f'({100. * batch_idx / len(train_loader):.0f}%)]\t'f'Loss: {loss.item():.6f}\t'f'Accuracy: {100. * correct / total:.2f}%')epoch_loss = train_loss / len(train_loader)epoch_acc = 100. * correct / totalhistory['train_loss'].append(epoch_loss)history['train_acc'].append(epoch_acc)return epoch_loss, epoch_acc#====================== 4. 測試函數 ======================def test(model, test_loader, history):"""在測試集上評估模型"""model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)history['test_loss'].append(test_loss)history['test_acc'].append(accuracy)print(f'\nTest set: Average loss: {test_loss:.4f}, 'f'Accuracy: {correct}/{len(test_loader.dataset)} 'f'({accuracy:.2f}%)\n')return test_loss, accuracy#====================== 5. 可視化函數 ======================def plot_training_history(history):"""繪制訓練歷史曲線"""epochs = range(1, len(history['train_loss']) + 1)plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(epochs, history['train_loss'], 'b-', label='訓練損失')plt.plot(epochs, history['test_loss'], 'r-', label='測試損失')plt.title('訓練和測試損失')plt.xlabel('Epoch')plt.ylabel('損失')plt.legend()plt.grid(True)plt.subplot(1, 2, 2)plt.plot(epochs, history['train_acc'], 'b-', label='訓練準確率')plt.plot(epochs, history['test_acc'], 'r-', label='測試準確率')plt.title('訓練和測試準確率')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.legend()plt.grid(True)plt.tight_layout()plt.show()def visualize_feature_maps(model, test_loader):"""可視化特征圖"""# 獲取一個批次的數據dataiter = iter(test_loader)images, _ = next(dataiter)# 獲取特征圖with torch.no_grad():_ = model(images[0:1].to(device))# 顯示原始圖像和每層的特征圖plt.figure(figsize=(15, 5))# 顯示原始圖像plt.subplot(1, 4, 1)img = images[0] / 2 + 0.5npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.title('原始圖像')plt.axis('off')# 顯示每層的特征圖for i, feature_map in enumerate(model.feature_maps, 2):plt.subplot(1, 4, i)# 選擇第一個樣本的第一個特征圖plt.imshow(feature_map[0, 0].cpu(), cmap='viridis')plt.title(f'層 {i-1} 特征圖')plt.axis('off')plt.tight_layout()plt.show()#====================== 6. 主函數 ======================def main():# 超參數設置batch_size = 64epochs = 4lr = 0.01dropout_rate = 0.5# 初始化訓練歷史記錄history = {'train_loss': [],'train_acc': [],'test_loss': [],'test_acc': []}# 加載數據print("正在加載訓練集...")train_loader = load_data(batch_size, is_train=True)print("正在加載測試集...")test_loader = load_data(batch_size, is_train=False)# 創建模型model = SimpleNet(dropout_rate=dropout_rate).to(device)optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=2, gamma=0.1)# 訓練和測試print(f"開始訓練,使用設備: {device}")for epoch in range(1, epochs + 1):train_loss, train_acc = train(model, train_loader, optimizer, epoch, history)test_loss, test_acc = test(model, test_loader, history)scheduler.step()# 可視化訓練過程print("訓練完成,繪制訓練歷史...")plot_training_history(history)# 可視化特征圖print("可視化特征圖...")visualize_feature_maps(model, test_loader)if __name__ == '__main__':main()"""
學習要點:1. 數據增強
- transforms.RandomHorizontalFlip(): 隨機水平翻轉
- transforms.RandomRotation(): 隨機旋轉
- transforms.RandomAffine(): 隨機仿射變換
- transforms.ColorJitter(): 顏色抖動2. CNN結構
- 常見流程:輸入 → 卷積層 → BN → 激活函數 → 池化層
- 特征提取:多個卷積塊串聯
- 分類器:Flatten后接全連接層3. Batch Normalization
- 在卷積層后添加
- 訓練時計算并更新均值和方差
- 測試時使用訓練階段的統計量4. 特征圖
- 保存每層的特征圖用于可視化
- 觀察模型學習到的特征
- 幫助理解模型的工作原理5. 學習率調度器
- 使用StepLR按步長降低學習率
- 幫助模型更好地收斂
- 避免學習率過大或過小
"""

"""
DAY 41 簡單CNN - 基礎示例這個文件提供了一個簡單的CNN示例,展示了如何:
1. 修改CNN結構
2. 使用不同的學習率調度器
3. 觀察訓練效果的變化
"""import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
from torch.utils.data import DataLoader
from torch.optim.lr_scheduler import StepLR, CosineAnnealingLR# 設置中文字體
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 設置隨機種子和設備
torch.manual_seed(42)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")#====================== 1. 數據加載 ======================def load_data(batch_size=64, use_augmentation=True):"""加載CIFAR-10數據集參數:batch_size: 批次大小use_augmentation: 是否使用數據增強"""if use_augmentation:# 使用數據增強train_transform = transforms.Compose([transforms.RandomHorizontalFlip(),    # 隨機水平翻轉transforms.RandomRotation(10),        # 隨機旋轉transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])else:# 不使用數據增強train_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 測試集轉換test_transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])# 加載數據集train_set = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=train_transform)test_set = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=test_transform)# 創建數據加載器train_loader = DataLoader(train_set, batch_size=batch_size, shuffle=True, num_workers=2)test_loader = DataLoader(test_set, batch_size=batch_size, shuffle=False, num_workers=2)return train_loader, test_loader#====================== 2. 模型定義 ======================class SimpleCNN(nn.Module):"""簡單的CNN模型,可以通過參數調整結構參數:num_conv_layers: 卷積層數量channels: 每層的通道數列表use_bn: 是否使用Batch Normalizationdropout_rate: Dropout比率"""def __init__(self, num_conv_layers=2, channels=[16, 32, 64], use_bn=False, dropout_rate=0.5):super(SimpleCNN, self).__init__()self.use_bn = use_bn# 創建卷積層self.conv_layers = nn.ModuleList()in_channels = 3  # 輸入圖像是RGB三通道for i in range(num_conv_layers):# 添加卷積層self.conv_layers.append(nn.Conv2d(in_channels, channels[i], kernel_size=3, padding=1))# 添加BN層(如果使用)if use_bn:self.conv_layers.append(nn.BatchNorm2d(channels[i]))in_channels = channels[i]# 計算全連接層的輸入維度# 假設輸入圖像是32x32,每經過一次池化層大小減半final_size = 32 // (2 ** num_conv_layers)fc_input = channels[-1] * final_size * final_size# 全連接層self.fc1 = nn.Linear(fc_input, 512)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(512, 10)def forward(self, x):# 保存特征圖用于可視化self.feature_maps = []# 通過卷積層for i in range(0, len(self.conv_layers), 2 if self.use_bn else 1):x = self.conv_layers[i](x)  # 卷積if self.use_bn:x = self.conv_layers[i+1](x)  # BNx = F.relu(x)  # 激活函數x = F.max_pool2d(x, 2)  # 池化self.feature_maps.append(x)  # 保存特征圖# 展平x = torch.flatten(x, 1)# 全連接層x = F.relu(self.fc1(x))x = self.dropout(x)x = self.fc2(x)return F.log_softmax(x, dim=1)#====================== 3. 訓練函數 ======================def train_model(model, train_loader, test_loader, optimizer, scheduler, epochs=5):"""訓練模型并記錄歷史"""history = {'train_loss': [], 'train_acc': [], 'test_loss': [], 'test_acc': []}for epoch in range(1, epochs + 1):model.train()train_loss = 0correct = 0total = 0for batch_idx, (data, target) in enumerate(train_loader):data, target = data.to(device), target.to(device)optimizer.zero_grad()output = model(data)loss = F.nll_loss(output, target)loss.backward()optimizer.step()train_loss += loss.item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()total += target.size(0)if batch_idx % 100 == 0:print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} 'f'({100. * batch_idx / len(train_loader):.0f}%)]\t'f'Loss: {loss.item():.6f}\t'f'Accuracy: {100. * correct / total:.2f}%\t'f'LR: {scheduler.get_last_lr()[0]:.6f}')# 記錄訓練指標history['train_loss'].append(train_loss / len(train_loader))history['train_acc'].append(100. * correct / total)# 測試model.eval()test_loss = 0correct = 0with torch.no_grad():for data, target in test_loader:data, target = data.to(device), target.to(device)output = model(data)test_loss += F.nll_loss(output, target, reduction='sum').item()pred = output.max(1, keepdim=True)[1]correct += pred.eq(target.view_as(pred)).sum().item()test_loss /= len(test_loader.dataset)accuracy = 100. * correct / len(test_loader.dataset)# 記錄測試指標history['test_loss'].append(test_loss)history['test_acc'].append(accuracy)print(f'Epoch {epoch}: Test loss: {test_loss:.4f}, Accuracy: {accuracy:.2f}%')# 更新學習率scheduler.step()return history#====================== 4. 可視化函數 ======================def plot_history(history, title):"""繪制訓練歷史"""plt.figure(figsize=(12, 4))# 繪制損失plt.subplot(1, 2, 1)plt.plot(history['train_loss'], label='訓練損失')plt.plot(history['test_loss'], label='測試損失')plt.title(f'{title} - 損失曲線')plt.xlabel('Epoch')plt.ylabel('損失')plt.legend()plt.grid(True)# 繪制準確率plt.subplot(1, 2, 2)plt.plot(history['train_acc'], label='訓練準確率')plt.plot(history['test_acc'], label='測試準確率')plt.title(f'{title} - 準確率曲線')plt.xlabel('Epoch')plt.ylabel('準確率 (%)')plt.legend()plt.grid(True)plt.tight_layout()plt.show()def visualize_feature_maps(model, test_loader):"""可視化特征圖"""# 獲取一個批次的數據dataiter = iter(test_loader)images, _ = next(dataiter)# 獲取特征圖with torch.no_grad():_ = model(images[0:1].to(device))# 顯示原始圖像和特征圖plt.figure(figsize=(15, 5))# 顯示原始圖像plt.subplot(1, len(model.feature_maps) + 1, 1)img = images[0] / 2 + 0.5  # 反歸一化plt.imshow(img.permute(1, 2, 0))plt.title('原始圖像')plt.axis('off')# 顯示每層的特征圖for i, feature_map in enumerate(model.feature_maps, 1):plt.subplot(1, len(model.feature_maps) + 1, i + 1)# 顯示第一個特征圖plt.imshow(feature_map[0, 0].cpu(), cmap='viridis')plt.title(f'特征圖 {i}')plt.axis('off')plt.tight_layout()plt.show()#====================== 5. 主函數 ======================def main():# 基礎配置batch_size = 64epochs = 5lr = 0.01# 加載數據print("加載數據...")train_loader, test_loader = load_data(batch_size, use_augmentation=True)# 實驗1:基礎CNN(3層)print("\n實驗1:訓練基礎CNN(3層)...")model1 = SimpleCNN(num_conv_layers=3, channels=[32, 64, 128], use_bn=True).to(device)optimizer1 = optim.SGD(model1.parameters(), lr=lr, momentum=0.9)scheduler1 = StepLR(optimizer1, step_size=2, gamma=0.1)history1 = train_model(model1, train_loader, test_loader, optimizer1, scheduler1, epochs)plot_history(history1, "基礎CNN(3層)+ StepLR")visualize_feature_maps(model1, test_loader)# 實驗2:深層CNN(4層)print("\n實驗2:訓練深層CNN(4層)...")model2 = SimpleCNN(num_conv_layers=4, channels=[32, 64, 128, 256], use_bn=True).to(device)optimizer2 = optim.SGD(model2.parameters(), lr=lr, momentum=0.9)scheduler2 = CosineAnnealingLR(optimizer2, T_max=epochs)history2 = train_model(model2, train_loader, test_loader, optimizer2, scheduler2, epochs)plot_history(history2, "深層CNN(4層)+ CosineAnnealingLR")visualize_feature_maps(model2, test_loader)if __name__ == '__main__':main()"""
學習要點:1. CNN結構修改
- 可以通過修改num_conv_layers和channels參數來改變網絡深度和寬度
- use_bn參數控制是否使用Batch Normalization
- dropout_rate參數調整Dropout比率2. 學習率調度器選擇
- StepLR:按固定步長降低學習率
- CosineAnnealingLR:余弦周期調整學習率3. 觀察重點
- 不同深度的網絡收斂速度
- 是否出現過擬合(訓練準確率高但測試準確率低)
- 特征圖的變化4. 實驗建議
- 嘗試不同的網絡深度(修改num_conv_layers和channels)
- 對比有無Batch Normalization的效果(修改use_bn)
- 測試不同的學習率調度策略
- 觀察數據增強的影響(修改use_augmentation)
"""

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

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

相關文章

Express教程【002】:Express監聽GET和POST請求

文章目錄 2、監聽post和get請求2.1 監聽GET請求2.2 監聽POST請求 2、監聽post和get請求 創建02-app.js文件。 2.1 監聽GET請求 1??通過app.get()方法&#xff0c;可以監聽客戶端的GET請求&#xff0c;具體的語法格式如下&#xff1a; // 1、導入express const express req…

C# 文件 I/O 操作詳解:從基礎到高級應用

在軟件開發中&#xff0c;文件操作&#xff08;I/O&#xff09;是一項基本且重要的功能。無論是讀取配置文件、存儲用戶數據&#xff0c;還是處理日志文件&#xff0c;C# 都提供了豐富的 API 來高效地進行文件讀寫操作。本文將全面介紹 C# 中的文件 I/O 操作&#xff0c;涵蓋基…

Vue-Router簡版手寫實現

1. 路由庫工程設計 首先&#xff0c;我們需要創建幾個核心文件來組織我們的路由庫&#xff1a; src/router/index.tsRouterView.tsRouterLink.tsuseRouter.tsinjectionsymbols.tshistory.ts 2. injectionSymbols.ts 定義一些注入符號來在應用中共享狀態&#xff1a; import…

Electron-vite【實戰】MD 編輯器 -- 文件列表(含右鍵快捷菜單,重命名文件,刪除本地文件,打開本地目錄等)

最終效果 頁面 src/renderer/src/App.vue <div class"dirPanel"><div class"panelTitle">文件列表</div><div class"searchFileBox"><Icon class"searchFileInputIcon" icon"material-symbols-light:…

Remote Sensing投稿記錄(投稿郵箱寫錯、申請大修延期...)風雨波折投稿路

歷時近一個半月&#xff0c;我中啦&#xff01; RS是中科院二區&#xff0c;2023-2024影響因子4.2&#xff0c;五年影響因子4.9。 投稿前特意查了下預警&#xff0c;發現近五年都不在預警名單中&#xff0c;甚至最新中科院SCI分區&#xff08;2025年3月&#xff09;在各小類上…

吉林第三屆全國龍舟邀請賽(大安站)激情開賽

龍舟競渡處,瑞氣滿湖光。5月31日&#xff0c;金蛇獻瑞龍舞九州2025年全國龍舟大聯動-中國吉林第三屆全國龍舟邀請賽(大安站)“嫩江灣杯”白城市全民健身龍舟賽在吉林大安嫩江灣國家5A級旅游區玉龍湖拉開帷幕。 上午9時&#xff0c;伴隨著激昂的音樂&#xff0c;活力四射的青春舞…

華為OD機試真題——通過軟盤拷貝文件(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《通過…

一起學數據結構和算法(二)| 數組(線性結構)

數組&#xff08;Array&#xff09; 數組是最基礎的數據結構&#xff0c;在內存中連續存儲&#xff0c;支持隨機訪問。適用于需要頻繁按索引訪問元素的場景。 簡介 數組是一種線性結構&#xff0c;將相同類型的元素存儲在連續的內存空間中。每個元素通過其索引值&#xff08;數…

ZYNQ sdk lwip配置UDP組播收發數據

?? 一、顛覆認知:組播 vs 單播 vs 廣播 通信方式目標設備網絡負載典型應用場景單播1對1O(n)SSH遠程登錄廣播1對全網O(1)ARP地址解析組播1對N組O(1)視頻會議/物聯網群控創新價值:在智能工廠中,ZYNQ通過組播同時控制100臺AGV小車,比傳統單播方案降低92%網絡流量! ?? 二、…

機器學習:欠擬合、過擬合、正則化

本文目錄&#xff1a; 一、欠擬合二、過擬合三、擬合問題原因及解決辦法四、正則化&#xff1a;盡量減少高次冪特征的影響&#xff08;一&#xff09;L1正則化&#xff08;二&#xff09;L2正則化&#xff08;三&#xff09;L1正則化與L2正則化的對比 五、正好擬合代碼&#xf…

Linux命令之ausearch命令

一、命令簡介 ausearch 是 Linux 審計系統 (auditd) 中的一個實用工具,用于搜索審計日志中的事件。它是審計框架的重要組成部分,可以幫助系統管理員分析系統活動和安全事件。 二、使用示例 1、安裝ausearch命令 Ubuntu系統安裝ausearch命令,安裝后啟動服務。 root@testser…

mac電腦安裝nvm

方案一、常規安裝 下載安裝腳本&#xff1a;在終端中執行以下命令來下載并運行 NVM 的安裝腳本3&#xff1a; bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置環境變量&#xff1a;安裝完成后&#xff0c;需要配置環境變量。如…

Excel 操作 轉圖片,轉pdf等

方式一 spire.xls.free&#xff08;沒找設置分辨率的方法&#xff09; macOs開發Java GUI程序提示缺少字體問題解決 Spire.XLS&#xff1a;一款Excel處理神器_spire.xls免費版和收費版的區別-CSDN博客 官方文檔 Spire.XLS for Java 中文教程 <dependency><groupI…

oracle goldengate實現遠程抽取postgresql 到 postgresql的實時同步【絕對無坑版,親測流程驗證】

oracle goldengate實現postgresql 到 postgresql的實時同步 源端&#xff1a;postgresql1 -> postgresql2 流復制主備同步 目標端&#xff1a;postgresql 數據庫版本&#xff1a;postgresql 12.14 ogg版本&#xff1a;21.3 架構圖&#xff1a; 數據庫安裝以及流復制主備…

2.從0開始搭建vue項目(node.js,vue3,Ts,ES6)

從“0到跑起來一個 Vue 項目”&#xff0c;重點是各個工具之間的關聯關系、職責邊界和技術演化脈絡。 從你寫代碼 → 到代碼能跑起來 → 再到代碼可以部署上線&#xff0c;每一步都有不同的工具參與。 &#x1f63a;&#x1f63a;1. 安裝 Node.js —— 萬事的根基 Node.js 是…

MQTT的Thingsboards的使用

訪問云服務 https://thingsboard.cloud/ 新建一個設備 彈出 默認是mosquittor的客戶端。 curl -v -X POST http://thingsboard.cloud/api/v1/tnPrO76AxF3TAyOblf9x/telemetry --header Content-Type:application/json --data "{temperature:25}" 換成MQTTX的客戶…

金磚國家人工智能高級別論壇在巴西召開,華院計算應邀出席并發表主題演講

當地時間5月20日&#xff0c;由中華人民共和國工業和信息化部&#xff0c;巴西發展、工業、貿易與服務部&#xff0c;巴西公共服務管理和創新部以及巴西科技創新部聯合舉辦的金磚國家人工智能高級別論壇&#xff0c;在巴西首都巴西利亞舉行。 中華人民共和國工業和信息化部副部…

BLE協議全景圖:從0開始理解低功耗藍牙

BLE(Bluetooth Low Energy)作為一種針對低功耗場景優化的通信協議,已經廣泛應用于智能穿戴、工業追蹤、智能家居、醫療設備等領域。 本文是《BLE 協議實戰詳解》系列的第一篇,將從 BLE 的發展歷史、協議棧結構、核心機制和應用領域出發,為后續工程實戰打下全面認知基礎。 …

表單校驗代碼和樹形結構值傳遞錯誤解決

表單校驗代碼&#xff0c;兩種方式校驗&#xff0c;自定義的一種校驗&#xff0c;與element-ui組件原始的el-form表單的校驗不一樣&#xff0c;需要傳遞props和rules過去校驗 const nextStep () > {const data taskMsgInstance.value.formDataif(data.upGradeOrg ) {elm…

vscode 配置 QtCreat Cmake項目

1.vscode安裝CmakeTool插件并配置QT中cmake的路徑&#xff0c;不止這一處 2.cmake生成器使用Ninja&#xff08;Ninja在安裝QT時需要勾選&#xff09;&#xff0c;可以解決[build] cc1plus.exe: error: too many filenames given; type ‘cc1plus.exe --help’ for usage 編譯時…