笔记本电脑和台式机的种子号、软件包版本和 python 版本相同,但神经网络结果不同

问题描述 投票:0回答:1

我正在使用像这样的简单的普通神经网络,

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]

我预计训练后初始权重的总和将是相同,因为我在编译和训练模型之前设置了随机种子。

但是,结果似乎很不一样。

我花了整整一个星期的时间试图弄清楚这个问题,但我失败了。任何帮助将不胜感激。

python tensorflow keras neural-network
1个回答
0
投票

我解决了笔记本电脑和台式机之间无法重现结果的问题。

但我不知道它到底是如何工作的。

我用这种方式修复了代码。

原创

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

如果我准确地找出问题所在,我会留下更多评论。

任何评论也会有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.