Day 35

1. 模型可视化方法

使用torchinfo打印summar

from torchinfo import summary
 
model = 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 tqdm
 
for 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 SummaryWriter
 
writer = 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 = 0
    for 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%}')

模型定义示例

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

超参数对比

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%}')

你可能感兴趣的:(每日打卡,python)