我正在使用像这样的简单的普通神经网络,
reset_seeds(42)
model = Sequential()
model.add(Dense(64, input_shape = (train_X_arr.shape[1], ), activation = 'sigmoid'))
model.add(Dense(16, activation = 'tanh'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'mae')
名为
reset_seeds
的函数定义如下。
def reset_seeds(seed):
import random
import os
import tensorflow as tf
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
random.seed(seed)
tf.random.set_seed(seed)
然后我在笔记本电脑和台式机上检查模型的初始重量
笔记本电脑的初始权重总和(训练前)
[-9.959677, 0.0, -5.590966, 0.0, -1.1521256, 0.0]
桌面的初始权重总和(训练前)
[-9.959677, 0.0, -5.590966, 0.0, -1.1521256, 0.0]
但是,在我运行上面定义的模型一个时期后,我的笔记本电脑和台式机之间的初始权重总和是不同的。
hist = model.fit(x = train_X_arr, y = train_y_arr, batch_size = 1, epochs = 1, verbose = 2, shuffle = False)
笔记本电脑的初始权重总和(训练后)
[-168.1607,-6.258976,50.797672,0.42788112,0.15801406,-0.26924044]
桌面的初始权重总和(训练后)
[-159.85245,-5.7658424,57.23868,0.47032726,0.13733912,-0.25829855]
我预计训练后初始权重的总和将是相同,因为我在编译和训练模型之前设置了随机种子。
但是,结果似乎很不一样。
我花了整整一个星期的时间试图弄清楚这个问题,但我失败了。任何帮助将不胜感激。
我解决了笔记本电脑和台式机之间无法重现结果的问题。
但我不知道它到底是如何工作的。
我用这种方式修复了代码。
原创
reset_seeds(42)
model = Sequential()
model.add(Dense(64, input_shape = (train_X_arr.shape[1], ), activation = 'sigmoid'))
model.add(Dense(16, activation = 'tanh'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(loss = 'mae')
新的
reset_seeds(42)
model = Sequential()
model.add(Dense(64, input_shape = (train_X_arr.shape[1], ), activation = 'sigmoid'))
model.add(Dense(16, activation = 'tanh'))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(optimizer = 'adam', loss = 'mae') # Only this line changed
我认为这种现象很奇怪,因为即使我将种子设置为 42,再现性也会受到其
optimizer
的影响。
据我所知,我知道默认优化器是
rmsprop
。
如果我准确地找出问题所在,我会留下更多评论。
任何评论也会有帮助。