tensorflow reproducible(再现性)

tensorflow reproducible(再现性)

平时做实验一般需要保证每次实验结果一致(同样的设置下),这样才能知道哪些改进是真正有用的,最近在做实验的时候遇到一些问题,代码结果每次都不一样(小数点后面三位开始不相同,而且随着epoch的增加,结果慢慢就越来越不一样),下面是我我看见的一些保证reproducible的方法(tensorflow下):

1:tensorflow.set_random_seed()

因为tensorflow的参数初始化一般是随机的,除了你设置为常数,但是这样往往会造成学习到的网络不好,甚至梯度消失等问题,所以设置tensorflow.set_random_seed(seed)可以保证每次产生的初始化的参数一致。

import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np

temp=[range(30)] *5
graph=tf.Graph()
with graph.as_default():
    tf.set_random_seed(1)
    X=tf.placeholder(dtype=tf.float32,shape=[5,30])
    fc1=slim.fully_connected(X,10)
with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())
    print(fc1.eval(feed_dict={X:temp})[0])

这里的主要问题就是tensorflow.set_random_seed(seed)放置到哪里,经过试验,在graph里面才有用,下面的方法都不行(放在session后面,放在开头等等):

#beigining
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np

tf.set_random_seed(1)
temp=[range(30)] *5
graph=tf.Graph()
with graph.as_default():
    
    X=tf.placeholder(dtype=tf.float32,shape=[5,30])
    fc1=slim.fully_connected(X,10)
with tf.Session(graph=graph) as sess:
    sess.run(tf.global_variables_initializer())
    print(fc1.eval(feed_dict={X:temp})[0])


#after sess
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np


temp=[range(30)] *5
graph=tf.Graph()
with graph.as_default():
    
    X=tf.placeholder(dtype=tf.float32,shape=[5,30])
    fc1=slim.fully_connected(X,10)
with tf.Session(graph=graph) as sess:
    tf.set_random_seed(1)
    sess.run(tf.global_variables_initializer())
    print(fc1.eval(feed_dict={X:temp})[0])

#middle
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np


temp=[range(30)] *5
graph=tf.Graph()
tf.set_random_seed(1)
with graph.as_default():
    
    X=tf.placeholder(dtype=tf.float32,shape=[5,30])
    fc1=slim.fully_connected(X,10)
with tf.Session(graph=graph) as sess:
    
    sess.run(tf.global_variables_initializer())
    print(fc1.eval(feed_dict={X:temp})[0])

2:numpy & python

设置np.random.seed(seed)保证np的一些函数产生的结果reproducible,比如说np.random.shuffle().

对于python来说,random.seed(seed).

3:不确定因素

把上面的所有都设置了也不一定能够每次产生一样的值,我试过一些例子,如果保证前三个添加了的话,每次的结果大概是能保持一致的(交叉熵,adamoptimizer,三层全连接层的分类器),但是对于一个比较复杂的网络,每次的结果差异很小,但是多迭代训练几次差距就慢慢变大了(前几次仅仅小数点后面四位开始不一样),有的博客说是cuDNN的计算是不确定的(见参考文献),有的说GPU并行计算的时候可能会产生一些细小的差异。

但是,一般只要遵循前两个方法,把seed固定,那么每次产生的结果一般都一样。

参考:

https://stackoverflow.com/questions/38469632/tensorflow-non-repeatable-results

https://www.tensorflow.org/api_docs/python/tf/random/set_random_seed

https://groups.google.com/forum/#!topic/theano-users/QtaUzZ4iMlM

https://github.com/nagadomi/waifu2x/issues/132

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在第4周的可重复研究项目中,我将继续探索如何使用开放源代码工具和技术来实现可重复和透明度。 首先,我将继续使用版本控制系统(如Git),以便跟踪我研究项目中的所有更改和改进。这将确保我能够回溯到每个版本的数据和代码,并对项目进行可重复验证。在本周内,我还将学习更多关于Git分支和合并的知识,以便更好地组织和管理我的项目。 另外,我还将使用Jupyter Notebook来记录我的实验过程和结果。Jupyter Notebook提供了一个互动环境,可以将代码、文档和图形化结果结合在一起,使得我的研究成果更加易于理解和重现。我会确保我的Notebook中包含了所有必要的步骤和解释,以便他人能够准确地复现我的研究。 为了进一步提高可重复,我还将采取一些数据预处理和清洗的措施。这些措施包括去除异常值、处理缺失数据和标准化数据等。我将确保我的数据处理过程明确记录,并提供相应的代码和文档,以便他人能够按照相同的步骤进行处理。 最后,我还计划使用容器化技术(如Docker)来实现我的研究项目的可移植。通过将我的环境和依赖项封装在一个容器中,我可以确保其他人能够在不同的计算机和操作系统上轻松地运行我的代码和分析。 综上所述,第4周的可重复研究项目将继续探索一系列工具和技术,旨在提高我的研究项目的可重复和透明度。通过使用版本控制系统、Jupyter Notebook、数据处理和清洗措施以及容器化技术,我将确保我的研究成果可以被其他人准确地重现和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值