这就是我的训练脚本的样子,只有重要的部分。
import tensorflow as tf, numpy, random, os
SEED: int = 43
# To ensure reproducibility of the results after persisting into disk
tf.keras.backend.manual_variable_initialization(value=True)
os.environ['PYTHONHASHSEED']: str = '0'
numpy.random.seed(seed=SEED)
tf.random.set_seed(seed=SEED)
random.seed(a=SEED)
# Training Data acquisition
model: tf.keras.Model = tf.keras.Sequential([
tf.keras.layers.Input(
shape=X_train_transformed.shape[1:],
name='input_layer'),
tf.keras.layers.BatchNormalization(),
tf.keras.layers.Dense(units=UNITS, activation='relu'),
tf.keras.layers.Dense(units=UNITS, activation='relu'),
tf.keras.layers.Dense(units=CLASSES)])
model.save(filepath=MODEL_DIRECTORY)
这是推理脚本,在不同的 python 会话中。
import tensorflow as tf, numpy, random, os
SEED: int = 43
# To ensure reproducibility of the results after persisting into disk
tf.keras.backend.manual_variable_initialization(value=True)
os.environ['PYTHONHASHSEED']: str = '0'
numpy.random.seed(seed=SEED)
tf.random.set_seed(seed=SEED)
random.seed(a=SEED)
X_test_loaded:pandas.DataFrame=pandas.read_csv(filepath_or_buffer='../test_data/test.csv',
index_col='Unnamed: 0')
X_test_transformed: pandas.DataFrame = pandas.DataFrame(
data=X_test_loaded.apply(func=feature_transformation, axis=1).to_list())
for _ in range(5): # Five iterations necessary to get correct result
model=tf.keras.models.load_model(filepath=MODEL_DIRECTORY)
y_pred=model.predict(x=X_test_transformed)
最后一个预测循环是必要的,因为该model.predict
方法似乎直到五次尝试才在测试集上给出正确的结果(即在训练期间观察到的结果)。模型本身加载的权重与训练期间观察到的相同,但预测方法的输出似乎有一些周期性变化,所以每次我使用它时,我必须调用它五次以确保一致性。我不知道为什么会这样。我应该采取什么纠正措施?特别是,5 在这里看起来完全是一个神奇的数字。
如果它很重要,请在 python 3.8、Ubuntu 20.04 上运行它(并打算使用相同的 docker 映像在生产中部署),并使用以下库版本。
matplotlib==3.3.4
numpy==1.19.5
pandas==1.1.5
scikit-learn==0.24.2
tensorflow==2.5.0
编辑:经过更多的实验,我意识到周期不是 5,但实际上没有这样的周期。它在加载和预测时不断给出随机结果,有时它确实给出了正确的结果。