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

3
  1. 我按照建议设置了numpy和tensorflow的随机种子。
  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)

当我重新运行整个单元格时,print语句总是输出[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. 权重初始化是在什么时候发生的?是在编译模型时还是其他时候?

这个回答解决了你的问题吗?如何在Keras中获得可重复的结果 - undefined
4个回答

3

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

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

1)numpy随机种子

import numpy as np
np.seed(1)

2) Tensorflow 随机种子

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)

只有这样,我才能在训练中完全保持一致。

希望这能对人们有所帮助!


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))

谢谢!这个有帮助,尽管我必须像glorot_uniform一样编写它: Dense(1024, activation='relu', input_dim=2048, kernel_initializer=tf.keras.initializers.glorot_uniform(seed=42)) - undefined
我正在使用一个形式为model = Sequential(); model.add(LSTM(nodes, activation='relu', kernel_initializer=tf.keras.initializers.GlorotUniform(seed=1))); ...的神经网络,但每次执行时都会得到不同的结果。在其他地方我读到了tf.random.set_seed(0),所以我在第二行之前添加了它,现在它正常工作了,即每次执行时列表model_history.history['loss']始终包含相同的值。 - undefined

0

0
我也曾为此苦恼过。Tensorflow和Keras的版本是2.14.0。
对我有效的方法是:
seed = 0
np.random.seed(seed)
tf.random.set_seed(seed)
random.seed(seed)

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接