丹徒网站建设包括哪些,wordpress分类404,wordpress调用支付宝,零成本游戏网站开发知识点回顾#xff1a; 三种不同的模型可视化方法#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能#xff1a;手动和自动写法#xff0c;让打印结果更加美观推理的写法#xff1a;评估模式 可视化 理解深度学习网络最重要的2点#xff1a; 1.了解损失如何定… 知识点回顾 三种不同的模型可视化方法推荐torchinfo打印summary权重分布可视化进度条功能手动和自动写法让打印结果更加美观推理的写法评估模式 可视化 理解深度学习网络最重要的2点 1.了解损失如何定义的知道损失从何而来----把抽象的任务通过损失函数量化出来 2.了解参数总量即知道每一层的设计才能退出---层设计决定参数总量 1.1 nn.model自带的方法 #1.
# nn.Module 的内置功能直接输出模型结构
print(model)#2.
# nn.Module 的内置功能返回模型的可训练参数迭代器
for name, param in model.named_parameters():print(fParameter name: {name}, Shape: {param.shape})#3.
# 提取权重数据
import numpy as np
weight_data {}
for name, param in model.named_parameters():if weight in name:weight_data[name] param.detach().cpu().numpy()# 可视化权重分布
fig, axes plt.subplots(1, len(weight_data), figsize(15, 5))
fig.suptitle(Weight Distribution of Layers)for i, (name, weights) in enumerate(weight_data.items()):# 展平权重张量为一维数组weights_flat weights.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 权重统计信息 )
for name, weights in weight_data.items():mean np.mean(weights)std np.std(weights)min_val np.min(weights)max_val np.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) from torchsummary import summary
# 打印模型摘要可以放置在模型定义后面
summary(model, input_size(4,)) 该方法不显示输入层的尺寸因为输入的神经网是自己设置的所以不需要显示输入层的尺寸。 但是在使用该方法时input_size(4,) 参数是必需的因为 PyTorch 需要知道输入数据的形状才能推断模型各层的输出形状和参数数量。 summary 函数的核心逻辑是 创建一个与 input_size 形状匹配的虚拟输入张量通常填充零 将虚拟输入传递给模型执行一次前向传播但不计算梯度 记录每一层的输入和输出形状以及参数数量 生成可读的摘要报告 from torchinfo import summary
summary(model, input_size(4, )) torchinfo 是提供比 torchsummary 更详细的模型摘要信息包括每层的输入输出形状、参数数量、计算量等 from tqdm import tqdm # 先导入tqdm库
import time # 用于模拟耗时操作# 创建一个总步数为10的进度条
with tqdm(total10) as pbar: # pbar是进度条对象的变量名# pbar 是 progress bar进度条的缩写约定俗成的命名习惯。for i in range(10): # 循环10次对应进度条的10步time.sleep(0.5) # 模拟每次循环耗时0.5秒pbar.update(1) # 每次循环后进度条前进1步 # 在测试集上评估模型此时model内部已经是训练好的参数了
# 评估模型
model.eval() # 设置模型为评估模式
with torch.no_grad(): # torch.no_grad()的作用是禁用梯度计算可以提高模型推理速度outputs model(X_test) # 对测试数据进行前向传播获得预测结果_, predicted torch.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 (predicted y_test).sum().item() # 计算预测正确的样本数accuracy correct / y_test.size(0)print(f测试集准确率: {accuracy * 100:.2f}%)