使用Spikingjelly框架对神经形态数据集预处理涉及的降采样问题

本文主要是介绍使用Spikingjelly框架对神经形态数据集预处理涉及的降采样问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

神经形态数据集处理 — spikingjelly alpha 文档

Spikingjelly框架提供常用神经形态数据集处理的方法。

文档中以DVS128Gesture为例,给出代码如下:

train_set = DVS128Gesture(root_dir, train=True, data_type='frame', frames_number=20, split_by='number')

使用这段代码可以轻松地获取frame数据集并得到划分好的训练集。但对于其他数据集,想要按照上述代码获取划分好的数据集是行不通的,这是因为其他神经形态数据集的自定义函数没有提供 ' train ' 这个参数,以DVS-CIFAR10为例,见下方代码:

class CIFAR10DVS(sjds.NeuromorphicDatasetFolder):def __init__(self,root: str,data_type: str = 'event',frames_number: int = None,split_by: str = None,duration: int = None,custom_integrate_function: Callable = None,custom_integrated_frames_dir_name: str = None,transform: Optional[Callable] = None,target_transform: Optional[Callable] = None,) -> None:"""

以N-Caltech101数据集为例,解决上述问题,可以通过下方代码实现:

TS=5 #时间步长
root_dir = 'E:/data/N_Caltech/source'
event_set = NCaltech101(root=root_dir, data_type='frame', frames_number=TS, split_by='number')
sjds.split_to_train_test_set(train_ratio = 0.9, origin_dataset = event_set, num_classes = 101, random_split = False)

首先获取frame数据,再对获取的frame数据集进行训练集、测试集的划分。划分数据集的函数可以在sjds中找到,里面详细介绍了函数的用法及参数的含义。

针对神经形态数据集的处理,到此结束。

由于神经形态数据集内存占用过大,一般对数据集进行降采样,即缩小图片的原始尺寸,以减少内存的占用。torchvision提供了transforms的二十个方法,其中Resize方法可以对数据进行降维,可以用下面的代码表示:

# 定义 transform
transform = transforms.Compose([transforms.ToPILImage(),  # 将 numpy 数组转换为 PIL 图像transforms.Resize(size=(42, 42)), # 降采样到指定尺寸# transforms.ToTensor(), # 将 PIL 图像或 NumPy ndarray 转换为 FloatTensor,并缩放像素的强度值到 [0., 1.]
])
# 解压 + 降采样
root_dir = 'E:data/N_Caltech/source'
event_set = NCaltech101(root=root_dir, data_type='frame', frames_number=TS, split_by='number', transform=transform)

直接使用上述代码会报错,原因是神经形态数据的维度为四维[T C H W],而ToPILImage()方法仅支持二维或者三维的数据。

对此,只能退一步考虑,对每一帧数据for循环操作,达到降维的目的(降维的核心在于改变H W 的大小)。得到代码如下:

# 解压
root_dir = 'E:/data/N_Caltech/source'
event_set = NCaltech101(root=root_dir, data_type='frame', frames_number=TS, split_by='number')
# 降采样 由于维度为 4 不能直接使用resize 需要对每一帧数据单独降采样
ds_set = []
for i in range(len(event_set)):# x形状为[T, C, H, W]  ,y为标签值。x, y = event_set[i]xx = []T = len(x[:, 0, 0, 0])C = len(x[0, :, 0, 0])for j in range(T):for k in range(C):xx.append(cv2.resize(x[j, k, :, :], (42, 42)))xx = np.array(xx).reshape(T, C, 42, 42)ds_set.append((xx, y))
def splitdataset():return sjds.split_to_train_test_set(train_ratio = 0.9, origin_dataset = ds_set, num_classes = 101, random_split = False)

最终得到ds_set传递给split方法,可以得到降维后划分出的训练集与测试集。

这篇关于使用Spikingjelly框架对神经形态数据集预处理涉及的降采样问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892832

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

如何解决idea的Module:‘:app‘platform‘android-32‘not found.问题

《如何解决idea的Module:‘:app‘platform‘android-32‘notfound.问题》:本文主要介绍如何解决idea的Module:‘:app‘platform‘andr... 目录idea的Module:‘:app‘pwww.chinasem.cnlatform‘android-32

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加