ОБНОВЛЕНИЕ: этот вопрос касался Tensorflow 1.x. Я обновился до 2.0, и (по крайней мере, в простом коде ниже) проблема воспроизводимости кажется исправленной в 2.0. Так что это решает мою проблему; но мне все еще интересно, какие «передовые методы» использовались для решения этой проблемы в 1.x.
Обучение одной и той же модели / параметров / данных на keras / tenorflow не дает воспроизводимых результатов, и потери значительно отличаются каждый раз, когда вы тренируете модель. По этому поводу есть много вопросов о stackoverflow (например, Как получить воспроизводимые результаты в keras), но рекомендуемые обходные пути, похоже, не работают для меня или многих других людей в StackOverflow. Хорошо, это то, что есть.
Но учитывая это ограничение невоспроизводимости с keras на тензорном потоке - каков наилучший способ сравнения моделей и выбора гиперпараметров? Я тестирую разные архитектуры и активации, но поскольку оценка потерь каждый раз разная, я никогда не уверен, что одна модель лучше другой. Есть ли лучший способ справиться с этим?
Я не думаю, что проблема связана с моим кодом, но на всякий случай это помогает; вот пример программы:
import os
#stackoverflow says turning off the GPU helps reproducibility, but it doesn't help for me
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""
os.environ['PYTHONHASHSEED']=str(1)
import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers
import random
import pandas as pd
import numpy as np
#StackOverflow says this is needed for reproducibility but it doesn't help for me
from tensorflow.keras import backend as K
config = tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=config)
K.set_session(sess)
#make some random data
NUM_ROWS = 1000
NUM_FEATURES = 10
random_data = np.random.normal(size=(NUM_ROWS, NUM_FEATURES))
df = pd.DataFrame(data=random_data, columns=['x_' + str(ii) for ii in range(NUM_FEATURES)])
y = df.sum(axis=1) + np.random.normal(size=(NUM_ROWS))
def run(x, y):
#StackOverflow says you have to set the seeds but it doesn't help for me
tf.set_random_seed(1)
np.random.seed(1)
random.seed(1)
os.environ['PYTHONHASHSEED']=str(1)
model = keras.Sequential([
keras.layers.Dense(40, input_dim=df.shape[1], activation='relu'),
keras.layers.Dense(20, activation='relu'),
keras.layers.Dense(10, activation='relu'),
keras.layers.Dense(1, activation='linear')
])
NUM_EPOCHS = 500
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(x, y, epochs=NUM_EPOCHS, verbose=0)
predictions = model.predict(x).flatten()
loss = model.evaluate(x, y) #This prints out the loss by side-effect
#Each time we run it gives a wildly different loss. :-(
run(df, y)
run(df, y)
run(df, y)
Учитывая невоспроизводимость, как я могу оценить, помогают ли изменения в моих гиперпараметрах и архитектуре?