Как ссылка на документацию
Операции, в которых используется случайное начальное число, на самом деле получают его из двух начальных значений: начального числа и начального уровня. Это устанавливает глобальное начальное число.
Его взаимодействия с начальными значениями уровня операции являются следующими:
- Если не заданы ни глобальное начальное число, ни начальное значение операции: используется случайно выбранное начальное число для этой операции.
- Если начальное число операции не установлено, но задано глобальное начальное значение: Система выбирает начальное значение операции из потока начальных значений, определенного глобальным начальным значением.
- Если операция seed установлен, но глобальное seed не задано: глобальное начальное значение по умолчанию и указанное начальное значение операции используются для определения случайной последовательности.
- Если заданы как глобальное начальное значение, так и начальное значение операции: используются оба начальных значения вместе для определения случайной последовательности.
1-й сценарий
Случайное начальное число будет выбрано по умолчанию. Это можно легко заметить по результатам. Он будет иметь разные значения каждый раз, когда вы перезапускаете программу или вызываете код несколько раз.
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(x_train)
2-й сценарий
Глобальный установлен, но операция не была установлена. Хотя это произвело различное семя от первого и второго случайного. Если вы перезапустите или перезапустите код. Семя для обоих останется прежним. Он оба генерировал один и тот же результат снова и снова.
tf.random.set_seed(2)
first = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(first)
sec = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(sec)
3-й сценарий
Для этого сценария, где задано начальное значение операции, но не глобальное. Если вы повторно запустите код, он даст вам другие результаты, но если вы перезапустите среду выполнения, если вы получите ту же последовательность результатов из предыдущего запуска.
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=2)
print(x_train)
4-й сценарий
Оба семени будут использованы для определения случайной последовательности. Изменение глобального и начального числа операций даст разные результаты, но перезапуск среды выполнения с тем же начальным значением все еще даст те же результаты.
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=1)
print(x_train)
Создан воспроизводимый код в качестве ссылки.
Устанавливая глобальное начальное число, оно всегда дает одинаковые результаты.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
## GLOBAL SEED ##
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
y_train = tf.math.sin(x_train)
x_test = tf.random.normal((10,1), 2, 3, dtype=tf.float32)
y_test = tf.math.sin(x_test)
model = Sequential()
model.add(Dense(1200, input_shape=(1,), activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
loss="binary_crossentropy"
optimizer=tf.keras.optimizers.Adam(lr=0.01)
metrics=['mse']
epochs = 5
batch_size = 32
verbose = 1
model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
histpry = model.fit(x_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(x_test)
print(predictions)
Примечание. Если вы используете TensorFlow 2 выше, Keras уже есть в API, поэтому вам следует использовать TF.Keras, а не нативный.
Все они смоделированы в Google Colab.