MindSpore框架中MNIST测试集顺序不确定性的分析与解决
在深度学习工程实践中,我们常会遇到一些看似异常的系统行为。本次在MindSpore框架下处理MNIST测试集(https://www.hiascend.com/developer/blog/details/0259194701680659261)时,就观察到一个典型问题:在没有显式设置打乱逻辑的情况下,测试集样本顺序在多次运行中呈现不确定性。这种非确定性行为会影响实验的可重复性,需要从技术层面进行深入分析。
第一次运行输出
[]
Predicted: "[2 6 2 2 6 2 5 2 1 9]", Actual: "[2 6 2 2 6 8 5 2 1 9]"
第二次输出:
[]
Predicted: "[1 3 0 6 8 3 3 7 5 7]", Actual: "[1 3 0 6 8 3 3 7 5 7]"
通过查阅MindSpore数据集API文档(https://www.mindspore.cn/docs/zh-CN/r2.6.0/api_python/dataset/mindspore.dataset.MnistDataset.html),我们发现问题的根源在于采样器的默认配置机制。MnistDataset类的shuffle参数默认值为None,此时系统会根据参数组合表自动选择RandomSampler作为默认采样器。这种设计确保了数据加载的随机性,但在测试场景下可能不符合预期。
CLASS mindspore.dataset.MnistDataset(dataset_dir, usage=None, num_samples=None, num_parallel_workers=None, shuffle=None, sampler=None, num_shards=None, shard_id=None, cache=None)
在我们的代码中:
test_dataset = MnistDataset('MNIST_Data/test')
这个调用使用了默认参数,特别是:
shuffle=None(默认值)num_shards=None(默认值)shard_id=None(默认值)num_samples=None(默认值)
根据参数组合表,这种情况对应的采样器是:
RandomSampler(num_samples = num_samples)
也就是说,当shuffle参数为None时,MindSpore默认对MNIST数据集使用随机采样器,这就解释了为什么每次运行测试集顺序都不一样。
解决方案需要显式指定采样行为。通过将shuffle参数设置为False,我们改变了参数组合状态,使系统切换到SequentialSampler。修改后的参数组合(shuffle=False, num_shards=None, shard_id=None, num_samples=None)确保证每次运行都按照固定的顺序加载测试样本。
这个案例揭示了深度学习框架中一个重要但容易被忽视的设计特性:默认参数可能隐含着特定的系统行为。在实际工程中,对于需要确定性的测试场景,建议显式声明shuffle=False,避免依赖框架的默认行为。同时,理解参数组合与采样器类型的对应关系,有助于更好地控制数据流 pipeline 的行为特性。
- 点赞
- 收藏
- 关注作者
评论(0)