知識點回顧:
- 三種不同的模型可視化方法:推薦torchinfo打印summary+權重分布可視化
- 進度條功能:手動和自動寫法,讓打印結果更加美觀
- 推理的寫法:評估模式
作業:調整模型定義時的超參數,對比下效果。
?1. 模型可視化方法
①使用torchinfo打印summary
from torchinfo import summarymodel = SimpleNN()
summary(model, input_size=(1, 784)) # 輸入尺寸
②權重分布可視化
import matplotlib.pyplot as plt# 可視化第一層權重
plt.hist(model.fc1.weight.data.numpy().flatten(), bins=50)
plt.title('FC1 Weight Distribution')
plt.show()
?2. 進度條功能
①手動寫法
from tqdm import tqdmfor epoch in range(10):with tqdm(train_loader, desc=f'Epoch {epoch}') as pbar:for data, target in pbar:# ...訓練代碼...pbar.set_postfix(loss=loss.item())
②自動寫法
from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter()
for epoch in range(10):for i, (data, target) in enumerate(train_loader):# ...訓練代碼...writer.add_scalar('Loss/train', loss.item(), epoch*len(train_loader)+i)
③推理寫法
model.eval() # 切換到評估模式
with torch.no_grad(): # 禁用梯度計算correct = 0for data, target in test_loader:output = model(data)pred = output.argmax(dim=1)correct += (pred == target).sum().item()accuracy = correct / len(test_loader.dataset)print(f'Test Accuracy: {accuracy:.2%}')
?作業:超參數調整對比
1.模型定義示例(帶超參數)
class SimpleNN(nn.Module):def __init__(self, hidden_size=128, dropout_rate=0.2):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(784, hidden_size)self.dropout = nn.Dropout(dropout_rate)self.fc2 = nn.Linear(hidden_size, 10)def forward(self, x):x = x.view(-1, 784)x = F.relu(self.fc1(x))x = self.dropout(x)x = self.fc2(x)return x
2.超參數對比實驗
hidden_sizes = [64, 128, 256]
dropout_rates = [0.0, 0.2, 0.5]for h_size in hidden_sizes:for d_rate in dropout_rates:model = SimpleNN(hidden_size=h_size, dropout_rate=d_rate)# ...訓練和評估代碼...print(f'Hidden: {h_size}, Dropout: {d_rate}, Acc: {accuracy:.2%}')
關鍵點:
1. 評估時一定要用 model.eval() 和 torch.no_grad()
2. 進度條推薦使用tqdm或tensorboard
3. 超參數調整要系統性地對比(如網格搜索)
4. 可視化有助于理解模型行為