卫浴网站设计轻设计 让网站灵敏轻便的6个技巧

张小明 2026/1/13 7:31:54
卫浴网站设计,轻设计 让网站灵敏轻便的6个技巧,wordpress主题fzzz,电子商务与网络营销题库文章目录Day 38 模型可视化、训练进度与推理实践一、模型结构可视化1.1 nn.model自带的方法1.2 torchsummary#xff1a;轻量级的层级摘要1.3 torchinfo库的summary方法二、tqdm 进度条2.1 手动更新2.2 自动更新三、模型推理#xff1a;从训练走向应用Day 38 模型可视化、训…文章目录Day 38 · 模型可视化、训练进度与推理实践一、模型结构可视化1.1 nn.model自带的方法1.2 torchsummary轻量级的层级摘要1.3 torchinfo库的summary方法二、tqdm 进度条2.1 手动更新2.2 自动更新三、模型推理从训练走向应用Day 38 · 模型可视化、训练进度与推理实践学习内容模型结构可视化快速理解参数规模与层次设计tqdm 进度条用流畅的交互感知训练过程推理模式把训练好的模型进行应用importtorchimporttorch.nnasnnimporttorch.optimasoptimfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportMinMaxScalerimporttimeimportmatplotlib.pyplotasplt# 设置GPU设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)print(f使用设备:{device})# 加载鸢尾花数据集irisload_iris()Xiris.data# 特征数据yiris.target# 标签数据# 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 归一化数据scalerMinMaxScaler()X_trainscaler.fit_transform(X_train)X_testscaler.transform(X_test)# 将数据转换为PyTorch张量并移至GPUX_traintorch.FloatTensor(X_train).to(device)y_traintorch.LongTensor(y_train).to(device)X_testtorch.FloatTensor(X_test).to(device)y_testtorch.LongTensor(y_test).to(device)modelnn.Sequential(nn.Linear(4,10),nn.ReLU(),nn.Linear(10,3)).to(device)# 分类问题使用交叉熵损失函数criterionnn.CrossEntropyLoss()# 使用随机梯度下降优化器optimizeroptim.SGD(model.parameters(),lr0.01)# 训练模型num_epochs20_000# 训练的轮数# 用于存储每100个epoch的损失值和对应的epoch数losses[]start_timetime.time()# 记录开始时间forepochinrange(num_epochs):# 前向传播outputsmodel(X_train)# 隐式调用forward函数losscriterion(outputs,y_train)# 反向传播和优化optimizer.zero_grad()#梯度清零因为PyTorch会累积梯度所以每次迭代需要清零梯度累计是那种小的batchsize模拟大的batchsizeloss.backward()# 反向传播计算梯度optimizer.step()# 更新参数# 记录损失值if(epoch1)%2000:losses.append(loss.item())# item()方法返回一个Python数值loss是一个标量张量# 打印训练信息if(epoch1)%1000:# range是从0开始所以epoch1是从当前epoch开始每100个epoch打印一次print(fEpoch [{epoch1}/{num_epochs}], Loss:{loss.item():.4f})time_alltime.time()-start_time# 计算训练时间print(fTraining time:{time_all:.2f}seconds)# 可视化损失曲线plt.plot(range(len(losses)),losses)plt.xlabel(Epoch)plt.ylabel(Loss)plt.title(Training Loss over Epochs)plt.show()使用设备: cuda:0 Epoch [100/20000], Loss: 1.1066 Epoch [200/20000], Loss: 1.0971 Epoch [300/20000], Loss: 1.0891 Epoch [400/20000], Loss: 1.0792 Epoch [500/20000], Loss: 1.0646 ... Epoch [20000/20000], Loss: 0.0809 Training time: 13.47 seconds一、模型结构可视化理解一个深度学习网络通常从两个问题入手损失函数如何把任务目标量化每一层的参数规模是否匹配任务难度把这两个问题想明白才能用正确的方式去阅读模型结构输出。1.1 nn.model自带的方法print(model)Sequential( (0): Linear(in_features4, out_features10, biasTrue) (1): ReLU() (2): Linear(in_features10, out_features3, biasTrue) )这是最基础、最简单的方法直接打印模型对象它会输出模型的结构显示模型中各个层的名称和参数信息forname,paraminmodel.named_parameters():print(fParameter name:{name},Shape:{param.shape})Parameter name: 0.weight,Shape: torch.Size([10, 4]) Parameter name: 0.bias,Shape: torch.Size([10]) Parameter name: 2.weight,Shape: torch.Size([3, 10]) Parameter name: 2.bias,Shape: torch.Size([3])可以将模型中带有weight的参数即权重提取出来并转为 numpy 数组形式对其计算统计分布并且绘制可视化图表importnumpyasnp weight_data{}forname,paraminmodel.named_parameters():ifweightinname:weight_data[name]param.detach().cpu().numpy()fig,axesplt.subplots(1,len(weight_data),figsize(15,5))fig.suptitle(Weight Distribution of Layers)fori,(name,weights)inenumerate(weight_data.items()):# 展平权重张量为一维数组weights_flatweights.flatten()# 绘制直方图axes[i].hist(weights_flat,bins50,alpha0.7)axes[i].set_title(name)axes[i].set_xlabel(Weight Value)axes[i].set_ylabel(Frequency)axes[i].grid(True,linestyle--,alpha0.7)plt.tight_layout()plt.subplots_adjust(top0.85)plt.show()# 计算并打印每层权重的统计信息print(\n 权重统计信息 )forname,weightsinweight_data.items():meannp.mean(weights)stdnp.std(weights)min_valnp.min(weights)max_valnp.max(weights)print(f{name}:)print(f 均值:{mean:.6f})print(f 标准差:{std:.6f})print(f 最小值:{min_val:.6f})print(f 最大值:{max_val:.6f})print(-*30) 权重统计信息 0.weight: 均值: -0.224772 标准差: 0.826098 最小值: -3.286768 最大值: 1.786773 ------------------------------ 2.weight: 均值: -0.022058 标准差: 1.180873 最小值: -4.591810 最大值: 2.871279 ------------------------------在对比如0.weight与2.weight的统计信息时你会发现不同层的分布差异非常明显这正反映了它们在任务中的角色不同。根据这些统计量可以做出更有根据的调参动作如果权重标准差过大导致训练不稳定尝试降低学习率或使用梯度裁剪如果最小值、最大值始终飘忽不定可以考虑增大正则化力度观察偏置项是否过大能帮助判断是否需要重新设计层宽或初始化策略。这样一来模型结构输出与参数分布分析就形成了闭环。1.2 torchsummary轻量级的层级摘要torchsummary的summary(model, input_size(4,))会模拟一次前向传播把每一层的输出形状、参数量、可训练标记都整理成表格。和直接print(model)相比它额外要求传入示例input_size以便推断张量的真实维度。fromtorchsummaryimportsummary# 打印模型摘要可以放置在模型定义后面summary(model,input_size(4,))---------------------------------------------------------------- Layer (type) Output Shape Param # Linear-1 [-1, 10] 50 ReLU-2 [-1, 10] 0 Linear-3 [-1, 3] 33 Total params: 83 Trainable params: 83 Non-trainable params: 0 ---------------------------------------------------------------- Input size (MB): 0.00 Forward/backward pass size (MB): 0.00 Params size (MB): 0.00 Estimated Total Size (MB): 0.00 ----------------------------------------------------------------不同场景下的input_size示例模型类型输入类型input_size示例实际输入形状batch_size32MLP单样本一维特征向量(4,)(32, 4)CNN图像三维图像C,H,W(3, 224, 224)(32, 3, 224, 224)RNN序列二维序列seq_len, feat(10, 5)(32, 10, 5)记住input_size描述的是单个样本的形状summary会自动在维度最前面补上 batch size。1.3 torchinfo库的summary方法torchinfo和torchsummary的使用方式几乎一致但它会进一步统计每一层的输入/输出形状、参数量、内存开销甚至 FLOPs适合在模型迭代期评估不同结构的成本。搭配 TensorBoard 可以交叉验证各层尺寸是否匹配下次会在可视化专题里继续展开。fromtorchinfoimportsummary summary(model,input_size(4,)) Layer (type:depth-idx) Output Shape Param # Sequential [3] -- ├─Linear: 1-1 [10] 50 ├─ReLU: 1-2 [10] -- ├─Linear: 1-3 [3] 33 Total params: 83 Trainable params: 83 Non-trainable params: 0 Total mult-adds (Units.MEGABYTES): 0.00 Input size (MB): 0.00 Forward/backward pass size (MB): 0.00 Params size (MB): 0.00 Estimated Total Size (MB): 0.00 二、tqdm 进度条深度学习训练本质上是长循环肉眼盯日志既耗费精力也难以及时发现异常。tqdm提供了一个极简的上下文管理器只要包裹住迭代器就能实时看到剩余时间、迭代速度以及自定义描述。2.1 手动更新当循环内部的步长不固定时我习惯手动创建tqdm(total...)并在每次完成一个阶段后调用pbar.update(n)。这种写法配合with tqdm(...) as pbar能保证进度条在异常情况下也能正确收尾特别适合嵌套循环或多阶段任务。fromtqdmimporttqdmimporttime# 创建一个总步数为10的进度条withtqdm(total10)aspbar:# pbar是进度条对象的变量名# pbar 是 progress bar进度条的缩写约定俗成的命名习惯。foriinrange(10):# 循环10次对应进度条的10步time.sleep(0.1)# 模拟每次循环耗时0.5秒pbar.update(1)# 每次循环后进度条前进1步100%|██████████| 10/10 [00:0100:00, 9.89it/s]fromtqdmimporttqdmimporttime# 创建进度条时添加描述desc和单位unitwithtqdm(total5,desc下载文件,unit个)aspbar:# 进度条这个对象可以设置描述和单位# desc是描述在左侧显示# unit是单位在进度条右侧显示foriinrange(5):time.sleep(1)pbar.update(1)# 每次循环进度1下载文件: 100%|██████████| 5/5 [00:0500:00, 1.00s/个]合理设置desc与unit参数让输出更容易读懂unitepoch强调当前条目代表一个完整轮次unitbatch或unitsample则适合面向小批量或逐条样本的任务。2.2 自动更新fromtqdmimporttqdmimporttime# 直接将range(3)传给tqdm自动生成进度条# 直接可以给这个对象内部传入一个可迭代对象然后自动生成进度条foriintqdm(range(3),desc处理任务,unitepoch):time.sleep(1)处理任务: 100%|██████████| 3/3 [00:0300:00, 1.00s/epoch]for i in tqdm(range(3), desc处理任务, unit个)这个写法则不需要在循环中调用update()方法更加简洁实际上这2种写法都随意选取这里都介绍下# 用tqdm的set_postfix方法在进度条右侧显示实时数据如当前循环的数值、计算结果等fromtqdmimporttqdmimporttime total0# 初始化总和withtqdm(total10,desc累加进度)aspbar:foriinrange(1,11):time.sleep(0.3)totali# 累加123...10pbar.update(1)# 进度1pbar.set_postfix({当前总和:total})# 显示实时总和累加进度: 100%|██████████| 10/10 [00:0500:00, 1.69it/s, 当前总和55]importtorchimporttorch.nnasnnimporttorch.optimasoptimfromsklearn.datasetsimportload_irisfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportMinMaxScalerimporttimeimportmatplotlib.pyplotaspltfromtqdmimporttqdm# 导入tqdm库用于进度条显示# 设置GPU设备devicetorch.device(cuda:0iftorch.cuda.is_available()elsecpu)print(f使用设备:{device})# 加载鸢尾花数据集irisload_iris()Xiris.data# 特征数据yiris.target# 标签数据# 划分训练集和测试集X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)# 归一化数据scalerMinMaxScaler()X_trainscaler.fit_transform(X_train)X_testscaler.transform(X_test)# 将数据转换为PyTorch张量并移至GPUX_traintorch.FloatTensor(X_train).to(device)y_traintorch.LongTensor(y_train).to(device)X_testtorch.FloatTensor(X_test).to(device)y_testtorch.LongTensor(y_test).to(device)modelnn.Sequential(nn.Linear(4,10),nn.ReLU(),nn.Linear(10,3)).to(device)# 分类问题使用交叉熵损失函数criterionnn.CrossEntropyLoss()# 使用随机梯度下降优化器optimizeroptim.SGD(model.parameters(),lr0.01)# 训练模型num_epochs20000# 训练的轮数# 用于存储每100个epoch的损失值和对应的epoch数losses[]epochs[]start_timetime.time()# 记录开始时间# 创建tqdm进度条withtqdm(totalnum_epochs,desc训练进度,unitepoch)aspbar:# 训练模型forepochinrange(num_epochs):# 前向传播outputsmodel(X_train)# 隐式调用forward函数losscriterion(outputs,y_train)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()# 记录损失值并更新进度条if(epoch1)%2000:losses.append(loss.item())epochs.append(epoch1)# 更新进度条的描述信息pbar.set_postfix({Loss:f{loss.item():.4f}})# 每1000个epoch更新一次进度条if(epoch1)%10000:pbar.update(1000)# 更新进度条# 确保进度条达到100%ifpbar.nnum_epochs:pbar.update(num_epochs-pbar.n)# 计算剩余的进度并更新time_alltime.time()-start_time# 计算训练时间print(fTraining time:{time_all:.2f}seconds)# # 可视化损失曲线# plt.figure(figsize(10, 6))# plt.plot(epochs, losses)# plt.xlabel(Epoch)# plt.ylabel(Loss)# plt.title(Training Loss over Epochs)# plt.grid(True)# plt.show()使用设备: cuda:0 训练进度: 100%|██████████| 20000/20000 [00:1300:00, 1476.69epoch/s, Loss0.0620] Training time: 13.55 seconds三、模型推理从训练走向应用完成训练后最后一公里就是“推理”inference阶段也就是把数据送进训练好的网络产出可交付的预测结果。下面这张表快速对比了经典机器学习与 PyTorch 深度学习在三个阶段的差异阶段经典机器学习Scikit-learn深度学习PyTorch模型构建 / 实例化model LinearRegression()优化逻辑已内置model NeuralNet()这里只定义网络结构训练model.fit(X_train, y_train)内部自动处理梯度optimizer torch.optim.Adam(...)for epoch in epochs:optimizer.zero_grad()loss loss_fn(model(X), y)loss.backward()optimizer.step()推理model.predict(X_test)model.eval()with torch.no_grad(): y_pred model(X_test)在深度学习里训练阶段需要我们显式地管理优化器与梯度但推理阶段只需关注model.eval()与前向传播。# 在测试集上评估模型此时model内部已经是训练好的参数了# 评估模型model.eval()# 设置模型为评估模式withtorch.no_grad():# torch.no_grad()的作用是禁用梯度计算可以提高模型推理速度outputsmodel(X_test)# 对测试数据进行前向传播获得预测结果_,predictedtorch.max(outputs,1)# torch.max(outputs, 1)返回每行的最大值和对应的索引#这个函数返回2个值分别是最大值和对应索引参数1是在第1维度行上找最大值_ 是Python的约定表示忽略这个返回值所以这个写法是找到每一行最大值的下标# 此时outputs是一个tensorp每一行是一个样本每一行有3个值分别是属于3个类别的概率取最大值的下标就是预测的类别# predicted y_test判断预测值和真实值是否相等返回一个tensor1表示相等0表示不等然后求和再除以y_test.size(0)得到准确率# 因为这个时候数据是tensor所以需要用item()方法将tensor转化为Python的标量# 之所以不用sklearn的accuracy_score函数是因为这个函数是在CPU上运行的需要将数据转移到CPU上这样会慢一些# size(0)获取第0维的长度即样本数量correct(predictedy_test).sum().item()# 计算预测正确的样本数accuracycorrect/y_test.size(0)print(f测试集准确率:{accuracy*100:.2f}%)测试集准确率: 96.67%model.eval()会关闭 BatchNorm、Dropout 等训练期特有的策略让推理输出保持稳定。但它不会自动禁用梯度因为有时还需要利用梯度做可视化例如 Grad-CAM。所以我会显式包裹在with torch.no_grad():中既省显存又确保不会意外更新参数。完整的推理流程可以简化为按需载入权重model.load_state_dict(...)调用model.eval()切换到评估模式在with torch.no_grad():块里执行前向传播并收集输出浙大疏锦行
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

菏泽做网站建设的公司为什么网站建设图片显示不出来

NSFC数据查询完全指南:从入门到精通的5大实战技巧 【免费下载链接】nsfc 国家自然科学基金查询 项目地址: https://gitcode.com/gh_mirrors/nsf/nsfc 作为一名科研工作者,你是否曾为查询国家自然科学基金项目数据而烦恼?传统的查询方式…

张小明 2026/1/11 3:40:09 网站建设

专题网站建站网络推广内容包括什么

文章目录南京市租房需求数据分析系统摘要主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!南京市租房需求数据分析系统摘要 该系统基于Vue.js、UniApp和Spr…

张小明 2026/1/9 8:20:16 网站建设

青岛开发区网站建设多少钱网页游戏哪个平台最好

Linux的基本思想有两点: 第一,一切皆是文件第二,每个文件都有确定的用途 其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等第二条意思是对于操作系统内核而言,每种不…

张小明 2026/1/9 8:20:14 网站建设

eclipse 制作网站开发怎么做简单网站首页

Folium离线地图终极指南:企业内网部署与大数据可视化 【免费下载链接】folium Python Data. Leaflet.js Maps. 项目地址: https://gitcode.com/gh_mirrors/fo/folium 在企业内网、野外作业等无网络环境下,如何实现专业级地图可视化?本…

张小明 2026/1/12 16:40:56 网站建设

浙江省城乡建设厅官方网站微信附近人推广引流

3个关键技术突破财经数据分析瓶颈:从数据获取到决策支持的完整方案 【免费下载链接】akshare 项目地址: https://gitcode.com/gh_mirrors/aks/akshare 在当今数据驱动的投资时代,财经数据分析已成为专业投资者和量化研究者的核心能力。然而&…

张小明 2026/1/10 1:49:12 网站建设

自己做网站需要学什么软件下载上海建设网站费用

ABAQUS结构工程分析终极指南:从入门到精通完整教程 【免费下载链接】ABAQUS结构工程分析及实例详解资源下载 ABAQUS结构工程分析及实例详解资源下载 项目地址: https://gitcode.com/Open-source-documentation-tutorial/5e6ec 想要快速掌握ABAQUS在结构工程分…

张小明 2026/1/10 1:49:11 网站建设