screenfull 跨浏览器全屏解决方案:JavaScript Fullscreen API 封装库完整使用指南
2026/10/15 18:32:52
@浙大疏锦行
核心目标:
涉及知识点:
场景类比:
核心概念:
TensorBoard 的工作原理是:
runs/experiment_1)里写日志文件。任务:
SummaryWriter。importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transforms,models,utilsfromtorch.utils.dataimportDataLoaderfromtorch.utils.tensorboardimportSummaryWriter# 核心组件importnumpyasnpimportmatplotlib.pyplotasplt# 1. 准备数据 (复用 Day 44 极速版配置)IMG_SIZE=112BATCH_SIZE=64transform=transforms.Compose([transforms.Resize(IMG_SIZE),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])train_dataset=datasets.CIFAR10(root='./data',train=True,download=True,transform=transform)test_dataset=datasets.CIFAR10(root='./data',train=False,download=True,transform=transform)train_loader=DataLoader(train_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=2)test_loader=DataLoader(test_dataset,batch_size=BATCH_SIZE,shuffle=False,num_workers=2)device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")# 2. 初始化 TensorBoard 记录器# log_dir 是日志存放的路径,每次实验建议改个名字,比如 'runs/exp1', 'runs/exp2'writer=SummaryWriter('runs/cifar10_resnet_experiment')print("✅ TensorBoard Writer 已就绪!日志将写入 runs/cifar10_resnet_experiment")✅ TensorBoard Writer 已就绪!日志将写入 runs/cifar10_resnet_experiment任务:
在开始训练前,我们先往 TensorBoard 里存点东西看看效果。
# 1. 获取一个 Batch 的数据images,labels=next(iter(train_loader))# 2. 写入图片网格 (add_image)# make_grid 会把 64 张图拼成一张大图img_grid=utils.make_grid(images)# 反归一化以便显示正常颜色 (可选)img_grid_show=img_grid*0.5+0.5writer.add_image('CIFAR10_Input_Images',img_grid_show)# 3. 写入模型结构 (add_graph)# 需要传入模型实例和一个样例输入 (input_to_model)model=models.resnet18(pretrained=False)# 演示用,不加载权重也没事model.fc=nn.Linear(512,10)model=model.to(device)# 注意:add_graph 需要输入也在对应的 device 上dummy_input=images.to(device)writer.add_graph(model,dummy_input)print("✅ 图片和模型结构已写入!请稍后在 TensorBoard 查看。")e:\Anaconda\envs\test\lib\site-packages\torchvision\models\_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and may be removed in the future, please use 'weights' instead. warnings.warn( e:\Anaconda\envs\test\lib\site-packages\torchvision\models\_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and may be removed in the future. The current behavior is equivalent to passing `weights=None`. warnings.warn(msg) ✅ 图片和模型结构已写入!请稍后在 TensorBoard 查看。核心逻辑:
我们需要在train和test的循环里插入writer.add_scalar。
'Loss/train','Accuracy/test'。TensorBoard 会根据标签自动分组。任务:
修改训练循环,实时记录 Loss 和 Accuracy。
# 重新定义一个简单的训练函数,集成 TensorBoarddeftrain_with_tensorboard(model,epochs=5):criterion=nn.CrossEntropyLoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 记录全局步数 (iteration)step=0forepochinrange(epochs):print(f"Epoch{epoch+1}/{epochs}starting...")# --- 训练阶段 ---model.train()running_loss=0.0fori,(inputs,targets)inenumerate(train_loader):inputs,targets=inputs.to(device),targets.to(device)optimizer.zero_grad()outputs=model(inputs)loss=criterion(outputs,targets)loss.backward()optimizer.step()running_loss+=loss.item()# [埋点 1] 每 100 个 Batch 记录一次训练 Loss# x轴使用 step (平滑连续),而不是 epochifi%100==99:writer.add_scalar('Loss/train',running_loss/100,global_step=step)running_loss=0.0step+=1# --- 测试阶段 (每个 Epoch 结束后测一次) ---model.eval()correct=0total=0test_loss=0.0withtorch.no_grad():forinputs,targetsintest_loader:inputs,targets=inputs.to(device),targets.to(device)outputs=model(inputs)loss=criterion(outputs,targets)test_loss+=loss.item()_,predicted=outputs.max(1)total+=targets.size(0)correct+=predicted.eq(targets).sum().item()acc=100.*correct/total avg_test_loss=test_loss/len(test_loader)# [埋点 2] 记录测试集的 Accuracy 和 Loss# x轴使用 epochwriter.add_scalar('Accuracy/test',acc,global_step=epoch)writer.add_scalar('Loss/test',avg_test_loss,global_step=epoch)print(f"Epoch{epoch+1}finished. Test Acc:{acc:.2f}%")# 开始训练 (演示跑 3 轮即可)train_with_tensorboard(model,epochs=3)# 记得关闭 writer,否则部分数据可能还没写进硬盘writer.close()Epoch 1/3 starting... Epoch 1 finished. Test Acc: 62.03% Epoch 2/3 starting... Epoch 2 finished. Test Acc: 69.76% Epoch 3/3 starting... Epoch 3 finished. Test Acc: 75.44%两种方式:
命令行 (推荐):打开 Anaconda Prompt 或终端,进入当前代码目录,输入:
tensorboard --logdir=runs然后浏览器访问http://localhost:6006。
Jupyter 魔术命令:直接在 Notebook 里显示(如下所示)。
# 加载 TensorBoard 扩展%load_ext tensorboard# 启动 TensorBoard,指定日志目录# 端口设为 6006 (默认)%tensorboard--logdir=runs--port=6006今天我们给 AI 模型装上了“眼睛”。通过 TensorBoard,你应该能看到:
工业界经验:
Train Loss和Test Loss,看它们何时分叉,那是过拟合 (Overfitting)开始的信号。Next Level:
到今天为止,我们的深度学习基础篇 (CV 方向)已经非常扎实了。
明天(Day 46),我们将迈出最后一步 ——模型部署 (Deployment)。我们要把训练好的模型打包成一个 Web 服务,让别人通过浏览器就能上传图片并得到识别结果!