当前位置: 首页 > news >正文

一层5x1神经网络绘制训练100轮后权重变化的图像

要完成这个任务,我们可以使用Python中的PyTorch库来建立一个简单的神经网络,网络结构只有一个输入层和一个输出层,输入层有5个节点,输出层有1个节点。训练过程中,我们将记录权重的变化,并在训练100轮后绘制出权重变化的图像。以下是步骤和代码的详细解释:

  1. 构建网络:网络由一个全连接层组成,没有激活函数,因为我们只关注权重的变化。
  2. 数据准备:随机生成一些输入数据和目标数据用于训练。
  3. 训练网络:使用均方误差损失和随机梯度下降优化器。
  4. 记录权重:在每轮训练后记录权重。
  5. 绘制权重变化图:训练完成后,使用matplotlib绘制权重的变化。

这张图展示了一个简单神经网络中5个权重在100轮训练过程中的变化。每条线代表一个权重值如何随着训练轮次的增加而变化。你可以看到,权重随着训练过程呈现不同程度的变化,这反映了模型在尝试适应数据的过程中权重的更新情况。

在这段代码中,weights_history[:, 0, i] 用于从存储的权重历史记录中提取特定的权重值,以便绘制。下面是这个表达式的详细分析:

  • weights_history 是一个记录了每一训练轮次后模型权重的列表,该列表在每次迭代时被转换为一个PyTorch张量。这个张量的形状是 [100, 1, 5]

    • 第一个维度(100)代表训练轮次的数量。
    • 第二个维度(1)代表输出层的节点数,这里是1,因为我们的模型是从5个输入到1个输出的线性层。
    • 第三个维度(5)代表输入层的节点数,也就是权重的数量,因为我们的线性层有5个输入。
  • weights_history[:, 0, i] 的分解:

    • : 选择weights_history张量中所有的100个训练轮次。
    • 0 选择输出层中第一个(也是唯一一个)节点的权重。
    • i 这是一个从0到4变化的索引,用于选择5个输入中的一个特定权重。

因此,当你使用 weights_history[:, 0, i],它实际上在每一训练轮次中选取一个特定的输入权重,并跟踪这个权重是如何随着时间变化的。在上面的代码中,这种方式被用来绘制每个输入对应权重随训练轮次变化的图形,展示了每个权重如何随着模型训练进行而更新。

import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as np# 定义一个简单的线性模型
class SimpleLinearModel(nn.Module):def __init__(self):super(SimpleLinearModel, self).__init__()self.linear = nn.Linear(5, 1)  # 5个输入节点,1个输出节点def forward(self, x):return self.linear(x)# 生成一些随机数据
inputs = torch.randn(100, 5)  # 100个样本,每个样本5个特征
targets = torch.randn(100, 1)  # 100个目标值    # 初始化模型
model = SimpleLinearModel()# 损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)# 用于记录权重的列表
weights_history = []# 训练模型
for epoch in range(100):  # 训练100轮# 前向传播outputs = model(inputs)loss = criterion(outputs, targets)# 反向传播和优化optimizer.zero_grad()loss.backward()optimizer.step()# 记录权重weights_history.append(model.linear.weight.data.numpy().copy())# 转换为numpy数组
weights_history = np.array(weights_history)# 创建subplot
fig, axs = plt.subplots(5, 1, figsize=(10, 15))
for i in range(5):  # 对于5个输入特征的每一个权重绘图axs[i].plot(weights_history[:, 0, i], label=f'Weight {i+1}')axs[i].set_title(f'Weight {i+1} Changes Over 100 Epochs')axs[i].set_xlabel('Epoch')axs[i].set_ylabel('Weight Value')axs[i].legend()plt.tight_layout()
plt.savefig("test")

上述代码实现了一个简单的神经网络训练,并绘制了每个输入特征的权重变化。以下是代码的详细步骤分析:

  1. 导入库

    • 导入了 torchtorch.nn 用于神经网络的构建和训练。
    • 导入 matplotlib.pyplot 用于绘制图像。
  2. 定义模型

    • 定义了一个简单的线性模型 SimpleLinearModel,包含一个全连接层 linear,输入5个特征输出1个值。
  3. 初始化模型、损失函数和优化器

    • 实例化了模型 model
    • 使用均方误差损失函数 criterion,适合回归问题。
    • 使用随机梯度下降优化器 optimizer,学习率设置为0.01。
  4. 准备数据

    • 生成了随机输入数据 inputs 和目标数据 targets,分别有100个样本,输入有5个特征,输出有1个目标值。
  5. 训练过程

    • 创建一个空列表 weights_history 用于记录每轮训练后的权重。
    • 进行100轮训练,在每轮中:
      • 计算模型的输出 outputs
      • 计算损失 loss
      • 清空梯度,进行反向传播,更新权重。
      • 记录当前的权重,保存到 weights_history 中。
  6. 数据转换和绘图

    • weights_history 转换为 numpy 数组,以便于处理。
    • 使用 plt.subplots 创建5个子图,每个子图显示一个输入特征的权重变化。
    • 遍历每个输入特征的权重数据,绘制在相应的子图上:
      • axs[i].plot(...) 绘制第 i 个输入特征的权重变化曲线。
      • 设置子图的标题、坐标轴标签和图例。
    • 使用 plt.tight_layout() 使子图布局紧凑整齐。
    • 显示绘制好的图像。

每个子图显示了对应输入特征的权重在100轮训练中的变化情况。这种细分展示方法有助于观察每个权重如何随着训练过程逐步调整和收敛。
在这里插入图片描述

http://www.lryc.cn/news/413246.html

相关文章:

  • Project #0 - C++ Primer
  • git提交commit信息规范,fix,feat
  • 服务器 Linux 的文件系统初探
  • 关于Unity转微信小程序的流程记录
  • AI入门指南:什么是人工智能、机器学习、神经网络、深度学习?
  • 网络安全中的IOC是指的什么?
  • 掌握AJAX技术:从基础到实战
  • Unity UGUI 实战学习笔记(6)
  • iOS面试之属性关键字(二):常见面试题
  • java开发设计模式详解
  • windows中node版本的切换(nvm管理工具),解决项目兼容问题 node版本管理、国内npm源镜像切换(保姆级教程,值得收藏)
  • 测试面试宝典(四十四)—— APP测试和web测试有什么区别?
  • 力扣高频SQL 50题(基础版)第三十七题
  • web基础之CSS
  • 全球轻型卡车胎市场规划预测:2030年市场规模将接近1153亿元,未来六年CAGR为2.0%
  • 8.2 数据结构王道复习 2.3.3 2.3.7选择题错题review
  • 【DL】神经网络与机器学习基础知识介绍(二)【附程序】
  • 6万字嵌入式最全八股文面试题大全及参考答案(持续更新)
  • iceberg 用户文档(持续更新)
  • 基于YOLOv8的船舶检测系统
  • 使用腾讯云域名解析实现网站重定向
  • 为什么相比直接使用new和std::shared_ptr构造函数,make_shared在内存分配和管理方面更为高效。
  • 7-Python数据类型——列表和元组的详解(增删改查、索引、切片、步长、循环)
  • 大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
  • Google Gemma2 2B:语言模型的“小时代”到来?
  • 三线程顺序打印1-100
  • 中央处理器CPU
  • 用Python实现AI人脸识别
  • MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟
  • C语言:指针(2)