【问题标题】:Does setting the seed in tf.random.set_seed also set the seed used by the glorot_uniform kernel_initializer when using a conv2D layer in keras?在 keras 中使用 conv2D 层时,在 tf.random.set_seed 中设置种子是否也会设置 glorot_uniform kernel_initializer 使用的种子?
【发布时间】:2020-08-05 10:54:12
【问题描述】:

我目前正在使用定义如下的conv2D layer 训练convolutional neural network

conv1 = tf.keras.layers.Conv2D(filters=64, kernel_size=(3,3), padding='SAME', activation='relu')(inputs)

我的理解是默认的 kernel_initializer 是 glorot_uniform,它的默认种子是“none”:

tf.keras.layers.Conv2D(
        filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
        dilation_rate=(1, 1), activation=None, use_bias=True,
        kernel_initializer='glorot_uniform', bias_initializer='zeros',
        kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
        kernel_constraint=None, bias_constraint=None, **kwargs
    )



tf.compat.v1.keras.initializers.glorot_uniform(seed=None, dtype=tf.dtypes.float32)

我正在尝试生成可重现的代码,并且已经按照this StackOverflow post 设置了随机种子:

seed_num = 1

os.environ['PYTHONHASHSEED'] = '0'
np.random.seed(seed_num)
rn.seed(seed_num)

session_conf = tf.compat.v1.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)

tf.random.set_seed(seed_num)

sess = tf.compat.v1.Session(graph=tf.compat.v1.get_default_graph(), config=session_conf)
K.set_session(sess)

glorot_uniform 使用的 tf.random.set_seed 种子编号是否在 conv2D layer 中?如果不是,在定义conv2D layer 时如何定义该种子?

【问题讨论】:

    标签: python tensorflow keras random-seed reproducible-research


    【解决方案1】:

    对于每一层,您可以将种子用于内核和偏置初始化器。

    您可以单独为您的初始化程序播种,

    kernel_initializer=initializers.glorot_uniform(seed=0))

    来自文档:

    glorot_normal
    
    keras.initializers.glorot_normal(seed=None)
    
    Glorot normal initializer, also called Xavier normal initializer.
    
    It draws samples from a truncated normal distribution centered on 0 with stddev = sqrt(2 / (fan_in + fan_out)) where fan_in is the number of input units in the weight tensor and fan_out is the number of output units in the weight tensor.
    
    Arguments
    
        seed: A Python integer. Used to seed the random generator.
    
    

    【讨论】:

    • 谢谢。所以我只需要在文件顶部运行一次,然后每次我定义一个 Conv2D 层时,默认情况下它都会使用该初始化程序的种子?
    • 是的,您可以使用种子创建初始化变量并在所有层中重复使用,如果您使用 tensorflow 种子,默认情况下它会使用您提供的种子为所有内容播种。为了获得更强大的重现性,您可以查看此答案stackoverflow.com/questions/60910157/…
    • 所以我不需要在 Conv2D 代码行中做任何不同的事情吗?或者我需要在Conv2D参数中指定kernel_initializer=my_kernel_initializer(在将my_kernel_initializer定义为my_kernel_initializer=initializers.glorot_uniform(seed=0)之后)?
    • 所以我根本不需要运行kernel_initializer=initializers.glorot_uniform(seed=0),因为我已经设置了tf.random.set_seed(seed_num)?抱歉,我很困惑设置 tf.random.set_seed 是否足够,或者我是否还需要定义 kernel_initializer=initializers.glorot_uniform(seed=seed_num)
    【解决方案2】:

    感谢Zabir Al Nazi,答案是“是”。设置tf.random.set_seed() 也会设置Conv2D 层的glorot_uniform 种子。

    【讨论】:

    • 如果答案有帮助,请毫不犹豫地投票/接受 :)
    猜你喜欢
    • 2018-11-16
    • 2017-05-01
    • 2013-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多