使用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方法,可以得到降维后划分出的训练集与测试集。

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2ephyr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值