news 2026/7/15 17:18:40

DAY 43

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY 43

# DAY 43 随机函数与广播机制

知识点回顾:

1. 随机张量的生成: torch.randn函数

2. 卷积和池化的计算公式 (可以不掌握, 会自动计算的)

3. pytorch的广播机制: 加法和乘法的广播机制

ps: numpy运算也有类似的广播机制, 基本一致

作业: 自己多举几个例子帮助自己理解即可

# CBAM 注意力

知识点回顾:

1. 通道注意力模块复习

2. 空间注意力模块

3. CBAM的定义

作业:尝试对今天的模型检查参数数目,并用 tensorboard 查看训练过程

@浙大疏锦行

# 导入依赖库 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt # 1. 模型参数统计工具:统计模型总参数、可训练/不可训练参数数量 def count_model_parameters(model): total_params = 0 trainable_params = 0 non_trainable_params = 0 for param in model.parameters(): param_num = param.numel() total_params += param_num if param.requires_grad: trainable_params += param_num else: non_trainable_params += param_num def format_params(num): if num >= 1e6: return f"{num/1e6:.2f}M" elif num >= 1e3: return f"{num/1e3:.2f}K" else: return f"{num}" print("模型参数统计:") print(f"总参数: {format_params(total_params)} ({total_params:,})") print(f"可训练参数: {format_params(trainable_params)} ({trainable_params:,})") print(f"不可训练参数: {format_params(non_trainable_params)} ({non_trainable_params:,})") return total_params, trainable_params, non_trainable_params # 2. CBAM注意力模块定义 class CBAMBlock(nn.Module): def __init__(self, channels, reduction=16): super().__init__() # 通道注意力 self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc = nn.Sequential( nn.Linear(channels, channels//reduction), nn.ReLU(inplace=True), nn.Linear(channels//reduction, channels) ) # 空间注意力 self.spatial = nn.Sequential( nn.Conv2d(2, 1, kernel_size=7, padding=3, bias=False), nn.Sigmoid() ) self.sigmoid = nn.Sigmoid() def forward(self, x): # 通道注意力计算 avg_out = self.fc(self.avg_pool(x).view(x.size(0), -1)).view(x.size(0), x.size(1), 1, 1) max_out = self.fc(self.max_pool(x).view(x.size(0), -1)).view(x.size(0), x.size(1), 1, 1) channel_att = self.sigmoid(avg_out + max_out) x = x * channel_att # 空间注意力计算 avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) spatial_att = self.spatial(torch.cat([avg_out, max_out], dim=1)) x = x * spatial_att return x # 3. 基于CBAM的CNN模型定义 class CBAM_CNN(nn.Module): def __init__(self, num_classes=10): super().__init__() self.features = nn.Sequential( nn.Conv2d(3, 64, kernel_size=3, padding=1), nn.ReLU(inplace=True), CBAMBlock(64), nn.MaxPool2d(2, 2), nn.Conv2d(64, 128, kernel_size=3, padding=1), nn.ReLU(inplace=True), CBAMBlock(128), nn.MaxPool2d(2, 2), ) self.classifier = nn.Linear(128 * 8 * 8, num_classes) def forward(self, x): x = self.features(x) x = x.view(x.size(0), -1) x = self.classifier(x) return x # 4. 训练函数(集成TensorBoard可视化) def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer): model.train() all_iter_losses = [] iter_indices = [] for epoch in range(epochs): running_loss = 0.0 correct = 0 total = 0 for 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() iter_loss = loss.item() global_step = epoch * len(train_loader) + batch_idx + 1 all_iter_losses.append(iter_loss) iter_indices.append(global_step) # TensorBoard记录batch级损失 writer.add_scalar('Train/Batch_Loss', iter_loss, global_step) running_loss += iter_loss _, predicted = output.max(1) total += target.size(0) correct += predicted.eq(target).sum().item() if (batch_idx + 1) % 100 == 0: print(f'Epoch {epoch+1}/{epochs} | Batch {batch_idx+1}/{len(train_loader)} | 单Batch损失: {iter_loss:.4f}') # 记录epoch级训练指标 epoch_train_loss = running_loss / len(train_loader) epoch_train_acc = 100. * correct / total writer.add_scalar('Train/Epoch_Loss', epoch_train_loss, epoch+1) writer.add_scalar('Train/Epoch_Accuracy', epoch_train_acc, epoch+1) # 测试阶段 model.eval() test_loss = 0 correct_test = 0 total_test = 0 with 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级测试指标 epoch_test_loss = test_loss / len(test_loader) epoch_test_acc = 100. * correct_test / total_test writer.add_scalar('Test/Epoch_Loss', epoch_test_loss, epoch+1) writer.add_scalar('Test/Epoch_Accuracy', epoch_test_acc, epoch+1) scheduler.step(epoch_test_loss) print(f'Epoch {epoch+1} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%') writer.close() return epoch_test_acc # 5. 绘图辅助函数 def plot_iter_losses(losses, indices): plt.figure(figsize=(10, 4)) plt.plot(indices, losses, 'b-', alpha=0.7) plt.xlabel('Iteration') plt.ylabel('Loss') plt.title('Training Loss per Iteration') plt.grid(True) plt.show() # 6. 主执行逻辑 if __name__ == "__main__": # 设备配置 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 数据加载(CIFAR10) transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) test_dataset = torchvision.datasets.CIFAR10(root='./data', train=False, download=True, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=2) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=2) # 模型、损失函数、优化器初始化 model = CBAM_CNN().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) # 统计模型参数 count_model_parameters(model) # 初始化TensorBoard writer = SummaryWriter(log_dir='./cbam_logs') # 启动训练 epochs = 50 print("开始模型训练...") final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs, writer) print(f"训练完成 | 最终测试准确率: {final_accuracy:.2f}%")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 14:16:51

Open-AutoGLM部署避坑指南:3大关键步骤决定你能否成功运行

第一章:Open-AutoGLM部署前的环境准备与认知 在部署 Open-AutoGLM 之前,充分理解其运行依赖和系统要求是确保后续流程顺利的关键。该框架基于 PyTorch 构建,依赖 CUDA 加速进行高效推理,因此需提前配置兼容的硬件与软件环境。 系…

作者头像 李华
网站建设 2026/7/13 19:59:09

做1688批发系统5年,被商品详情API坑到连夜改代码的实战手记

在电商开发圈混了快十年,1688的商品详情API绝对是最“特立独行”的存在。作为批发平台,它的接口返回里藏着太多零售平台没有的“暗门”——从阶梯价的诡异格式到混批规则的嵌套逻辑,每次对接都像拆盲盒。今天就把这些年踩过的坑、攒的实战代码…

作者头像 李华
网站建设 2026/7/1 12:30:37

结合Jupyter Notebook实现数据科学问答分析

结合 Jupyter Notebook 实现数据科学问答分析 在企业数据分析实践中,一个老生常谈的问题是:业务人员有明确的分析需求,却无法直接操作数据;而数据团队忙于响应各类临时查询,疲于奔命。更糟糕的是,每次分析结…

作者头像 李华
网站建设 2026/7/14 20:11:15

【AI模型部署新突破】:为什么顶级开发者都在用Win+Open-AutoGLM组合?

第一章:WinOpen-AutoGLM组合的崛起背景近年来,人工智能与自动化技术的深度融合推动了新一代智能工作流系统的诞生。其中,“WinOpen-AutoGLM”组合因其在Windows平台上的高效集成能力、开源生态的灵活扩展性以及AutoGLM驱动的自然语言自动化执…

作者头像 李华
网站建设 2026/7/1 13:22:19

anything-llm前端界面体验报告:美观与实用兼备的设计理念

AnythingLLM前端界面体验报告:美观与实用兼备的设计理念 在大语言模型(LLM)技术席卷各行各业的今天,一个尖锐的问题浮出水面:我们是否真的需要每个人都成为AI工程师才能用好这些强大的工具?显然不是。越来越…

作者头像 李华