#tensorflow #keras #deep-learning
#tensorflow #keras #глубокое обучение
Вопрос:
Я использую tensorflow 2.3.0
Я создаю RNN для прогнозирования цен на акции, всякий раз, когда я перезапускаю jupyter notebook и повторно запускаю весь свой код, он выдает очень разные прогнозы. Почему это так, когда все гиперпараметры точно такие же?
Я знаю, что это очень простой вопрос, но может кто-нибудь сказать мне или сказать мне, где я могу прочитать об этом?
Вот мой код:
def GetStockData(ticker_name, period, start_date, end_date):
tickerData = yf.Ticker(ticker_name)
df = tickerData.history(period=period, start=start_date, end=end_date)
return df
full_nvda_df = GetStockData("NVDA", "1d", "2016-01-01", "2020-10-10")
nvda_df = full_nvda_df[["Close"]].copy()
train_df = nvda_df[:1000]
test_df = nvda_df[1000:]
train_arr = np.array(train_df)
test_arr = np.array(test_df)
for i in range(30, len(train_df)):
X_train.append(train_arr[i-30:i])
y_train.append(train_arr[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
np.random.seed(1337)
model = tf.keras.Sequential([
tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 1) ),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=60, activation='relu', return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=80, activation='relu', return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(units=120, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(units=1)
])
model.summary()
model.compile(loss = "mean_squared_error",
optimizer = "adam")
Комментарии:
1. Что вы подразумеваете под «перезапуском и запуском». Вы переобучаете свою модель? Или ваша модель обучена (и исправлена), и вы получаете другой результат при выводе?
2. перезапустите мой ноутбук и запустите весь код снова от начала до конца
3. Мы не знаем, что у вас в записной книжке. Вы каждый раз переучиваете модель или нет?
4. Перезапуск jupyter notebook и обучающая модель снова переучиваются?
Ответ №1:
ОБНОВЛЕНИЕ (TF> = 2.9)
Начиная с TF 2.9 (TF> = 2.9), если вы хотите, чтобы ваши модели TF выполнялись детерминированно, в начале программы необходимо добавить следующие строки.
import tensorflow as tf
tf.keras.utils.set_random_seed(1)
tf.config.experimental.enable_op_determinism()
Важное примечание: в первой строке задается случайное начальное значение для следующего: Python, NumPy и TensorFlow. Вторая строка делает каждую операцию TensorFlow детерминированной.
СТАРШЕ TF 2.8
Не видя вашего кода, я могу только сделать вывод, что это связано с тем, что веса нейронной сети инициализируются случайным образом; когда вы ссылаетесь на
«конфигурации все одинаковые»
вы можете ссылаться на гиперпараметры, которые вы фактически установили для них с самого начала, или перебирать набор, чтобы определить наиболее подходящие значения для них в вашей конкретной задаче.
Однако weights
они инициализируются случайным образом, и это неизбежно приведет к другому пути конвергенции вашей сети и, следовательно, очевидно, к другому локальному оптимуму (т. Е. К Разным результатам).
Единственный способ обеспечить воспроизводимость (насколько мне известно) — это «заполнить все», как показано ниже:
random.seed(seed)
np.random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
tf.random.set_seed(seed)
Согласно этой теме на GitHub https://github.com/keras-team/keras/issues/14986,
В TensorFlow >= 2.5
можно использовать TF_DETERMINISTIC_OPS=1
также решение для обеспечения воспроизводимости.
Однако упоминается, что все еще существуют некоторые операции GPU, которые невозможно воспроизвести, и что идеальная воспроизводимость результатов между CPU и GPU может никогда не быть достигнута.
Комментарии:
1. Да, мои ожидания подтверждаются; вы ничего не меняете в коде, а просто перезапускаете его
2. Итак, если вы используете Rnn для перевода каждый раз, он будет переводиться по-разному, если я не заполню все?
3. Не обязательно. Вы достигнете другого локального оптимума, что означает, что ваш набор весов будет другим. Если ваш набор весов отличается, это может привести (но не обязательно) к другому переводу (возможно, первые 4 слова из перевода одинаковые, но 5-е отличается). Обратите внимание, что это доступно для всех задач / задач с нейронными сетями и недоступно только в случае машинного перевода.
4. Добро пожаловать. Если у вас возникнут еще какие-либо вопросы, я был бы готов / рад помочь.