tensorflow中种子的含义是什么?

tensorflow中种子的含义是什么?,tensorflow,Tensorflow,我是TensorFlow的初学者,我的书中说我应该先把这段代码放在前面,以产生相同的结果序列 seed = 3 np.random.seed(seed) tf.random.set_seed(seed) 我在seed中输入了不同的值,结果显示了很大的差异 它是否影响权重的初始值设置? 种子值设置到底起什么作用?这不是一个专门针对TensorFlow的术语。几乎每种编程语言都有一个种子,用于确定随机数生成器的随机性等。使用种子,您可以重新生成结果。为了重现结果,您需要重新启动内核,看看它们之间的

我是TensorFlow的初学者,我的书中说我应该先把这段代码放在前面,以产生相同的结果序列

seed = 3
np.random.seed(seed)
tf.random.set_seed(seed)
我在seed中输入了不同的值,结果显示了很大的差异

它是否影响权重的初始值设置?
种子值设置到底起什么作用?

这不是一个专门针对TensorFlow的术语。几乎每种编程语言都有一个种子,用于确定随机数生成器的随机性等。使用种子,您可以重新生成结果。为了重现结果,您需要重新启动内核,看看它们之间的区别。例如:

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
seed = 3
np.random.seed(seed)
tf.random.set_seed(seed)

model = Sequential()
model.add(Dense(2, activation="relu", input_shape = (28,28,1), kernel_initializer=initializer))
model.add(Dense(1, kernel_initializer=initializer))

model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=['accuracy'])
这将提供第1次运行:

>> model.get_weights()
[array([[-1.036157  ,  0.19191754]], dtype=float32),
 array([0., 0.], dtype=float32),
 array([[-0.86388123],
        [-0.8873284 ]], dtype=float32),
 array([0.], dtype=float32)]
如果第二次创建相同的模型:

>> model.get_weights()

[array([[-0.4151404 ,  0.81533253]], dtype=float32),
 array([0., 0.], dtype=float32),
 array([[ 0.39391458],
        [-0.48291653]], dtype=float32),
 array([0.], dtype=float32)]
产生相同的结果序列

现在,重新启动内核并再次创建模型。第一次和第二次运行的结果应相同

如果希望每次创建具有完全相同权重的模型,则需要执行以下操作:

initializer = tf.keras.initializers.GlorotNormal(seed=seed)

model.add(Dense(2, activation="relu", input_shape = (28,28,1), kernel_initializer=initializer))
model.add(Dense(1, kernel_initializer=initializer))

>> model.get_weights()

[array([[-0.6233864,  1.5557635]], dtype=float32),
 array([0., 0.], dtype=float32),
 array([[-0.6233864],
        [ 1.5557635]], dtype=float32),
 array([0.], dtype=float32)]
将是相同的,无论您创建了多少次模型,即使在重新启动内核之后