0

我尝试使用 StackExchange 上的各种资源和 Keras 提供的资源从我的 LSTM 中获得可重现的结果。我目前正在按以下顺序执行以下操作(并且失败)以确保可重复性:

  • 我设置了 PYTHONHASHSEED(通过魔法,你会看到我在 Jupyter 笔记本中工作)。

  • 我确保我只使用 CPU 而不是 GPU。

  • 我为可能引入任何随机化的 python 库设置了随机种子(numpy、python 随机模块、tensorflow)。

  • 我强制 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'])

4

1 回答 1

0

我建议检查您的模型是否包含非确定性操作。值得注意的是,reduce_sum就是这样一种操作。这些操作是不确定的,因为浮点加法和乘法是非关联的(浮点数相加或相乘的顺序会影响结果)并且因为这些操作不能保证它们的输入每次都以相同的顺序相加或相乘. 我不知道不确定性 TensorFlow 操作的完整列表。要调查可能导致此问题的操作,请尝试减少模型中的层数或更改该模型中使用的层或操作,并查看这样做是否会给您带来一致的结果。另请参阅此问题

于 2019-09-26T23:26:44.403 回答