为什么这段代码不能使我的Keras LSTM具有可复制性?

时间:2019-09-26 18:17:08

标签: python tensorflow keras deep-learning binary-reproducibility

我尝试使用StackExchange上的各种资源以及Keras提供的资源来获取 我的LSTM可重现的结果。我目前正在按照以下顺序(但没有通过)以确保可重复性:

  • 我设置了PYTHONHASHSEED(通过魔术设置,您将看到我在Jupyter笔记本上工作)。

  • 我确保我仅使用CPU而没有使用GPU。

  • 我为可能引入任何随机化的python库设置了随机种子-(numpy,python随机模块,张量流)。

  • 我强制TensorFlow使用单个线程。

  • 尽管您可能会注意到在以下代码中导入了RandomizedSearchCV和TimeSeriesSplit,但在生成结果时并未使用它们,因为我发现这可能会引入其他随机陷阱。取而代之的是,我对我的数据进行了一次训练和一个测试集,并由硬编码的索引分解,并且仅训练了一个时期,以便更容易地隔离出这种不必要的可变性。

设置上述控件确实可以很好地限制可变性,但是尽管如此,我的val_loss仍在2个值之间波动,因此无法真正再现。我不知道为什么一个跑步会给我一个价值,而下一个跑步会给我相同的价值,或者另一个却没有韵律或理由。有人可以告诉我我在做什么错吗?

%env PYTHONHASHSEED=0

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""

import numpy as np
import tensorflow as tf
import random as rn

seed = 2

# The below is necessary for starting Numpy generated random numbers
# in a well-defined initial state.

np.random.seed(seed)

# The below is necessary for starting core Python generated random numbers
# in a well-defined state.

rn.seed(seed)

# The below tf.set_random_seed() will make random number generation
# in the TensorFlow backend have a well-defined initial state.
# For further details, see:
# https://www.tensorflow.org/api_docs/python/tf/set_random_seed

tf.set_random_seed(seed)

# Force TensorFlow to use single thread.
# Multiple threads are a potential source of non-reproducible results.
# For further details, see: https://stackoverflow.com/questions/42022950/

session_conf = tf.ConfigProto(intra_op_parallelism_threads=1,
                              inter_op_parallelism_threads=1)

from keras import backend as K

sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)

# Rest of code follows ..




import pandas as pd, matplotlib.pyplot as plt, scipy.stats
from keras.models import Sequential
from keras.layers import Dense, BatchNormalization, Embedding, LSTM, Dropout
from keras.callbacks import EarlyStopping
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import RandomizedSearchCV, TimeSeriesSplit
from keras.optimizers import Adam
from keras.losses import binary_crossentropy

model = Sequential()
model.add(LSTM(30, input_shape = (sequences.shape[1], sequences.shape[2]), activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(30, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(25, activation = 'relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation = 'sigmoid'))

#compile model
model.compile(optimizer = Adam(lr=.001), loss = binary_crossentropy, metrics=['accuracy'])

1 个答案:

答案 0 :(得分:0)

我建议检查您的模型是否包含不确定性操作。显然,reduce_sum是这样的一种操作。这些操作是不确定的,因为浮点加法和乘法是不关联的(浮点数的加或乘顺序会影响结果),并且因为此类操作不能保证每次输入都以相同顺序加或乘。我不知道不确定的TensorFlow操作的完整列表。要调查哪个操作可能导致此问题,请尝试减少模型中的层数或更改该模型中使用的层或操作,然后查看这样做是否能为您提供一致的结果。另请参见this question