zoukankan      html  css  js  c++  java
  • pytorch如何能够保证模型的可重复性

    问题背景是这样的:

    我用了自己定义了pytorch中的模型,并且,在main函数中设置了随机种子用来保证模型初始化的参数是一致的,同时pytorch中的随机种子也能够影响dropout的作用,见链接

    为了保证所有的参数都一样,我在设置dataloader的时候,数据并没有进行shuffle,这样能够在每一个iteration的时候,没有random的操作

    但是,一旦我把模型放到GPU上运行之后,我把网络中间输出的feature map保存下来,进行比较,发现同一个位置,两次运行的feature的值竟然不一样

    难道是网络的初始化不一样咩?在第一个iteration运行的时候,还没有更新参数的时候,我将网络的参数进行保存成numpy,运行两次,进行比较,发现两次模型的参数都一样!

    so, 模型的参数都是一样的,输入的数据也是一样的,难道我自己定义的网络层里面有一些random的操作?我自己定义的网络层里面有BN层,卷积以及转置卷积层,一旦这里面的超参数确定的话,实际上两次运行的结果应该是absolutely一致的,so,问题出在哪里?

    在pytorch forum上看到一个类似的问题,说是在GPU上运行的结果和CPU运行的结果不一致,我试了一下,果然还真是这样,把模型放到CPU上,两次运行的结果absolutely一致。

    但是仍然不理解,为什么GPU上会有运算误差,但是我也不能一直在CPU上运行模型吧,于是乎,在网上搜到这样一个类似的帖子,实际上pytorch forum上吐槽这个问题的人太多,当然解决的办法也是很简单

    在主函数中加上一句

    torch.backends.cudnn.deterministic = True

    用以保证实验的可重复性,果然,两次运行的结果完全一致

  • 相关阅读:
    Sublime Text 试玩日记
    Makefile 学习
    小书匠使用手册
    较完整的解决Linux zip 压缩包中文我乱码问题
    彻底解决Android模拟器中文短信乱码问题
    博客变更
    关于如何学习一个框架的经验总结
    [JavaScript] this、call和apply详解
    类与类之间关系,用C#和JavaScript体现
    [Node.js] require背后的故事
  • 原文地址:https://www.cnblogs.com/yongjieShi/p/9614905.html
Copyright © 2011-2022 走看看