Python类初始化疑问:SpikingJelly中DVS128Gesture参数问题
关于SpikingJelly中DVS128Gesture类实例化的疑问
问题背景
在使用SpikingJelly的神经网络训练代码时遇到报错,对其中DVS128Gesture类的初始化方式存在疑问。
类定义代码
class DVS128Gesture(sjds.NeuromorphicDatasetFolder): def __init__( self, root: str, train: bool = None, 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: # 类实现逻辑省略
实例化代码
train_data_loader = torch.utils.data.DataLoader( dataset=DVS128Gesture(dataset_dir, train=True, use_frame=True, frames_num=T, split_by=split_by, normalization=normalization), batch_size=batch_size, shuffle=True, num_workers=4, drop_last=True, pin_memory=True) test_data_loader = torch.utils.data.DataLoader( dataset=DVS128Gesture(dataset_dir, train=False, use_frame=True, frames_num=T, split_by=split_by, normalization=normalization), batch_size=batch_size, shuffle=False, num_workers=4, drop_last=False, pin_memory=True)
疑问点
- 实例化时传入的
use_frame=True并非类定义的第3个参数data_type,这是作者的错误还是理解误区? - 实例化时使用
frames_num=T而非直接传T,且参数名与类定义的frames_number不符,这种赋值写法的含义是什么?
解答
针对疑问1
这是典型的库版本与代码版本不匹配问题:
- 你当前查看的
DVS128Gesture类定义是某一版本的API,而实例化代码对应的是另一版本的API。旧版SpikingJelly中,DVS128Gesture确实存在use_frame参数,用来切换加载原始事件数据或帧数据;新版则将该逻辑整合到data_type参数中(例如data_type='frame'等价于旧版的use_frame=True)。 - 另外,Python支持关键字参数不按位置顺序传入,只要类定义中存在对应参数就能正常传递;但如果当前类定义无
use_frame参数,传入就会抛出TypeError,这也是你报错的直接原因。
针对疑问2
同样是版本不一致导致的参数名变更:
- 旧版API中该参数名为
frames_num,新版则更名为frames_number。 - 这里的
frames_num=T是关键字参数赋值,作用是明确指定参数值,避免位置参数传递错误;如果当前类定义中不存在frames_num参数,这么写会直接触发报错。
解决建议
- 统一库与代码版本:要么升级/降级SpikingJelly库以匹配实例化代码,要么修改实例化代码适配当前类API(比如将
use_frame=True改为data_type='frame',frames_num=T改为frames_number=T)。 - 注意实例化代码中的
normalization参数在当前类定义中也不存在,需调整为对应逻辑(比如将归一化操作放到transform参数中实现)。
内容的提问来源于stack exchange,提问作者Marziye Hasanshahi
相关产品推荐
相关产品推荐

