如何在 Keras 中获得可重现的权重初始化?

How to get reproducible weights initializaiton in Keras?

  1. 我将 numpy 和 tensorflow 随机种子设置为 suggested
  2. 生成一些数据 - 这部分是可重现的,总是给出相同的结果
  3. 创建一个简单的网络并进行预测(无需训练,仅使用随机权重)- 每次预测都不一样
import numpy as np
from tensorflow.keras.layers import Dense, Dropout
from tensorflow.keras import Sequential, optimizers
import tensorflow as tf

np.random.seed(32)
tf.set_random_seed(33)

random_data = np.random.rand(10, 2048)
print(random_data[:,0])

def make_classifier():
    model = Sequential()
    model.add(Dense(1024, activation='relu', input_dim=2048))
    model.add(Dropout(0.5))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(optimizer=optimizers.RMSprop(lr=2e-4),
              loss='binary_crossentropy')
    return model
model = make_classifier()
# model.summary()
model.predict(random_data)

当我重新运行整个单元格时,打印语句总是输出[0.85888927 0.23846818 0.17757634 0.07244977 0.71119893 0.09223853 0.86074647 0.31838194 0.7568638 0.38197083]。但是每次的预测都不一样:

array([[0.5825965 ],
       [0.8677979 ],
       [0.70151913],
       [0.64572096],
       [0.78101623],
       [0.76483005],
       [0.7946336 ],
       [0.6281612 ],
       [0.8208673 ],
       [0.8273002 ]], dtype=float32)
array([[0.51012236],
       [0.6562015 ],
       [0.5593666 ],
       [0.686155  ],
       [0.6488372 ],
       [0.5966359 ],
       [0.6236731 ],
       [0.58099884],
       [0.68447435],
       [0.58886844]], dtype=float32)

以此类推

  1. 如何为刚刚初始化的网络获得可重现的预测?
  2. 权重初始化具体发生在什么时候?当我编译模型或?..

tf.keras.initializers 对象有一个 seed 参数用于可重现的初始化。

import tensorflow as tf
import numpy as np

initializer = tf.keras.initializers.GlorotUniform(seed=42)

for _ in range(10):
    print(np.round(initializer((4,)), 3))
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]
[-0.377 -0.003  0.373 -0.831]

在 Keras 层中,您可以这样使用它:

tf.keras.layers.Dense(1024, 
                      activation='relu', 
                      input_dim=2048,
                      kernel_initializer=tf.keras.initializers.GlorotUniform(seed=42))

我一直在努力解决这个问题,结果发现必须设置很多点才能使每种情况都保持完全一致:

首先,确保您提供给模型的数据(以及数据的顺序)是一致的。然后,对于模型权重初始化:

1)numpy 随机种子

import numpy as np
np.seed(1)

2)张量流随机种子

import tensorflow as tf
tf.set_random_seed(2)

3)python随机种子

import random
random.seed(3)

除此之外,您还必须为 model.fit 设置两个(如果您具有多处理能力)参数。这些在我看到的答案中并不经常提到:

model.fit(..., shuffle=False, use_multiprocessing=False)

只有这样我才能在训练中达到完全一致。

希望对大家有所帮助!