MindSpore框架中MNIST测试集顺序不确定性的分析与解决

举报
黄生 发表于 2025/10/03 13:32:35 2025/10/03
【摘要】 在深度学习工程实践中,我们常会遇到一些看似异常的系统行为。本次在MindSpore框架下处理MNIST测试集(https://www.hiascend.com/developer/blog/details/0259194701680659261)时,就观察到一个典型问题:在没有显式设置打乱逻辑的情况下,测试集样本顺序在多次运行中呈现不确定性。这种非确定性行为会影响实验的可重复性,需要从技术层...

在深度学习工程实践中,我们常会遇到一些看似异常的系统行为。本次在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 的行为特性。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。