spikingjelly学习-训练网络

【MNIST数据集包含若干尺寸为28*28的8位灰度图像,总共有0~9共10个类别。以MNIST的分类为例,一个简单的单层ANN网络如下

我们也可以用完全类似结构的SNN来进行分类任务。就这个网络而言,只需要先去掉所有的激活函数,再将尖峰神经元添加到原来激活函数的位置,这里我们选择的是LIF神经元。神经元之间的连接层需要用
spikingjelly.activation_based.layer包装:

在 spikingjelly 中,我们约定,只能输出脉冲,即0或1的神经元,都可以称之为“脉冲神经元”。使用脉冲神经元的网络,进而也可以称之为脉冲神经元网络(Spiking Neural Networks, SNNs)。这里使用了 neuron.IFNode() 来构建 IF 神经元层,该神经元层有如下构造函数:
  1. v_threshold – 神经元的阈值电压
  2. v_reset – 神经元的重置电压。
  3. surrogate_function – 反向传播时用来计算脉冲函数梯度的替代函数
    神经元的数量是在初始化或调用 reset() 函数重新初始化后,根据第一次接收的输入的 shape 自动决定的。此处则是10个神经元。其中膜电位衰减常数 需要通过参数tau设置,替代函数这里选择surrogate.ATan。
    然后是训练SNN网络,指定好训练参数如学习率等以及若干其他配置优化器默认使用Adam,以及使用泊松编码器,在每次输入图片时进行脉冲编码。

【训练代码的编写需要遵循以下三个要点:
 脉冲神经元的输出是二值的,而直接将单次运行的结果用于分类极易受到编码带来的噪声干扰。因此一般认为脉冲网络的输出是输出层一段时间内的发放频率(或称发放率),发放率的高低表示该类别的响应大小。因此网络需要运行一段时间,即使用T个时刻后的平均发放率作为分类依据。
 我们希望的理想结果是除了正确的神经元以最高频率发放,其他神经元保持静默。常常采用交叉熵损失或者MSE损失,这里我们使用实际效果更好的MSE损失。
 每次网络仿真结束后,需要重置网络状态

 # 保存绘图用数据net.eval()# 注册钩子output_layer = net.layer[-1] # 输出层output_layer.v_seq = []output_layer.s_seq = []def save_hook(m, x, y):m.v_seq.append(m.v.unsqueeze(0))m.s_seq.append(y.unsqueeze(0))output_layer.register_forward_hook(save_hook)with torch.no_grad():img, label = test_dataset[0]img = img.to(args.device)out_fr = 0.for t in range(args.T):encoded_img = encoder(img)out_fr += net(encoded_img)out_spikes_counter_frequency = (out_fr / args.T).cpu().numpy()print(f'Firing rate: {out_spikes_counter_frequency}')output_layer.v_seq = torch.cat(output_layer.v_seq)output_layer.s_seq = torch.cat(output_layer.s_seq)v_t_array = output_layer.v_seq.cpu().numpy().squeeze()  # v_t_array[i][j]表示神经元i在j时刻的电压值np.save("v_t_array.npy",v_t_array)s_t_array = output_layer.s_seq.cpu().numpy().squeeze()  # s_t_array[i][j]表示神经元i在j时刻释放的脉冲,为0或1np.save("s_t_array.npy",s_t_array)

在这里插入图片描述
【在PyTorch中,钩子(hooks)是一种强大的工具,允许你在模型的前向传播(forward pass)或反向传播(backward pass)过程中插入自定义操作。这些操作可以用于调试、可视化、保存中间状态等目的,而不需要修改模型的定义。
钩子的类型
前向钩子(Forward Hooks):在层的前向传播执行完毕后立即执行。它们通常用于检查、修改或记录从层输出的数据。
反向钩子(Backward Hooks):在层的梯度计算过程中执行。它们用于检查或修改梯度值。
这段代码中的钩子使用
在提供的代码段中,使用了一个前向钩子(save_hook)来保存神经网络某层在前向传播过程中的电压值(v)和脉冲值(s)。
这个钩子函数save_hook接收三个参数:
m:注册钩子的模块(在这个例子中是输出层)。
x:输入到该模块的数据。
y:从该模块输出的数据。
在钩子函数内部,它将模块m的电压值v和输出脉冲y保存到列表中。这里使用unsqueeze(0)是为了增加一个批次维度,使得每次迭代的数据可以被堆叠起来。
钩子的注册
这行代码将save_hook函数注册为output_layer(网络的最后一层)的前向钩子。这意味着每当output_layer完成前向传播时,save_hook函数都会被调用。
数据的保存
在所有测试图像通过网络并且钩子函数被调用之后,v_seq和s_seq列表中的数据被合并(使用torch.cat)并转换为NumPy数组,然后通过np.save保存到文件中。这些文件包含了在整个测试集上,输出层神经元的电压值和脉冲发放情况,可以用于进一步的分析和可视化。】
这段代码通过注册一个前向钩子来捕获并保存神经网络最后一层在前向传播过程中的电压和脉冲数据。这种方法非常有用,因为它允许在不修改网络结构的情况下收集内部状态信息,对于理解和分析网络的行为非常有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803560.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 2024.1到底更新啥有用的?

0 关键亮点 全行代码补全 Ultimate IntelliJ IDEA Ultimate 2024.1 针对 Java 全行代码补全。 这项功能由无缝集成到 IDE 中的高级深度学习模型提供支持。 它可以基于上下文分析预测和建议整行代码,有助于提高编码效率。 这些建议由针对不同语言和框架特别训练的专…

UML学习

UML(Unified Modeling Language):统一建模语言,提供了一套符号和规则来帮助分析师和设计师表达系统的架构、行为和交互 类图:描绘类、接口之间的关系(继承、实现、关联、依赖等)以及类的内部结构(属性和方法),直观展现系统的静态…

水资源管理系统:守护生命之源,构建和谐水生态

水资源是维系地球生态平衡和人类社会可持续发展的重要基础。然而,随着人口增长、工业化和城市化的加速,水资源短缺、水质污染和生态破坏等问题日益凸显。在这样的背景下,构建一个全面、高效、智能的水资源管理系统显得尤为迫切和必要。 项目…

AI智能客服机器人是什么?对企业重要吗?

在数字化时代,客户服务是企业与客户建立牢不可破关系的重要桥梁。AI智能客服机器人,顾名思义,就是利用人工智能技术提升客户服务体验的自动化工具。今天,就让我们来揭开AI智能客服机器人的神秘面纱,并讨论它对企业的重…

【C++ STL有序关联容器】map 映射

文章目录 【 1. 基本原理 】【 2. map 的创建 】2.1 调用默认构造函数,创建一个空的 map2.2 map 被构造的同时初始化2.3 通过一个 map 初始化另一个 map2.4 取已建 map 中指定区域内的键值对,初始化新的 map2.5 指定排序规则 【 2. map 元素的操作 】实例…

Bioorganic Chemistry:中国药科大学王鹏课题组、陈俊青课题组设计的基于AIE机理的高荧光选择性鉴定Cys/HCy

文献来源:Highly selective fluorescent probe based on AIE for identifying cysteine/homocysteine - PubMed (nih.gov) 一、AIE机理在荧光探针设计方向的应用: 参考文献:几种代表性的AIE的发光特点和机制(2020-10-11&#xff…

PostgreSQL入门到实战-第六弹

PostgreSQL入门到实战 PostgreSQL查询语句(三)官网地址PostgreSQL概述PostgreSQL中ORDER BY理论PostgreSQL中ORDER BY实操更新计划 PostgreSQL查询语句(三) 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一定100%复现, 还要以官方信息为准 https://www.post…

蓝桥杯刷题--RDay5

清理水域--枚举 8.清理水域 - 蓝桥云课 (lanqiao.cn)https://www.lanqiao.cn/problems/2413/learning/?page1&first_category_id1&second_category_id3&tags2023 小蓝有一个n m大小的矩形水域,小蓝将这个水域划分为n行m列,行数从1…

Docker入门指南:从安装到基本操作和镜像构建的全面教程

文章目录 一、Docker简介二、Docker的安装三、Docker的基本概念四、Docker的基本操作五、Dockerfile和镜像构建六、总结 一、Docker简介 Docker是一个开源的应用容器引擎,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后在任何支持Dock…

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》

​3月26日,人民网财经研究院与至顶科技联合发布《开启智能新时代:2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理,为政府部门、行业从业者以及社会公…

如何避免儿童校园霸凌:羊大师为您支招

校园应是学习和成长的乐土,而非恐惧和伤害的源泉。**在这个追求和谐社会的时代,校园霸凌问题依然是一个亟需解决的社会现象。羊大师作为关心儿童成长的一员,今天将为家长和教育工作者提供一些实用建议,帮助孩子避免成为校园霸凌的…

Python Selenium UI自动化测试

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

IO-DAY8

使用消息队列去实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复 A终端&#xff1a; #include<myhead.h> typedef struct msgbuf {lon…

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

基于JAVA的汽车售票网站论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

AI技术将影响更长远,比如未来的就业形势

随着人工智能渗透到工作场所&#xff0c;人类将需要掌握新的工作技能。 AI作为新技术已经开始扰乱就业市场了。对于最新的AI人工智能技术&#xff0c;经济学家、教育工作者、监管机构、商业分析师以及相关领域专家预测&#xff0c;在不久的将来&#xff0c;人工智能一代将需要…

AI智能调色解决方案,节省了企业的时间和人力成本

如何确保图片、视频的色彩准确、生动&#xff0c;成为企业提升品牌形象和传播效果的重要课题。美摄科技凭借领先的AI技术&#xff0c;推出全新的AI智能调色解决方案&#xff0c;以智能化、精细化的调色方式&#xff0c;帮助企业轻松驾驭色彩&#xff0c;展现视觉魅力。 美摄科…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了&#xff0c;我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了&#xff0c;我当初写CSDN的目的就是为了找工作&#xff0c;有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

Facebook直播延迟过高是为什么?

在进行Facebook直播 时&#xff0c;高延迟可能会成为一个显著的问题&#xff0c;影响观众的观看体验和互动效果。以下是一些导致Facebook直播延迟过高的可能原因&#xff1a; 1、网络连接问题 网络连接不稳定或带宽不足可能是导致Facebook直播延迟的主要原因之一。如果您的网络…