Как получить воспроизводимые результаты (Keras, Tensorflow): - PullRequest
1 голос
/ 07 апреля 2020

Чтобы сделать результаты воспроизводимыми, я добавил более 20 статей и добавил в свой скрипт максимум функций ... но не смог.

В официальном источнике I red есть 2 вида семян - глобальный и оперативный. Может быть, ключом к решению моей проблемы является установка рабочего семени, но я не понимаю, где его применить.

Не могли бы вы помочь мне получить воспроизводимые результаты с помощью tenorflow (версия> 2.0) ? Большое спасибо.

from keras.models import Sequential
from 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 keras.optimizers import adam
from sklearn.preprocessing import MinMaxScaler


np.random.seed(7)
import tensorflow as tf
tf.random.set_seed(7) #analogue of set_random_seed(seed_value)
import random
random.seed(7)
tf.random.uniform([1], seed=1)
tf.Graph.as_default #analogue of  tf.get_default_graph().finalize()

rng = tf.random.experimental.Generator.from_seed(1234)
rng.uniform((), 5, 10, tf.int64)  # draw a random scalar (0-D tensor) between 5 and 10

df = pd.read_csv("s54.csv", 
                 delimiter = ';', 
                 decimal=',', 
                 dtype = object).apply(pd.to_numeric).fillna(0)

#data normalization
scaler = MinMaxScaler() 
scaled_values = scaler.fit_transform(df) 
df.loc[:,:] = scaled_values


X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,1:],
                                                    df.iloc[:,:1],
                                                    test_size=0.2,
                                                    random_state=7,
                                                    stratify = df.iloc[:,:1])

model = Sequential()
model.add(Dense(1200, input_dim=len(X_train.columns), 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=adam(lr=0.01)
metrics=['accuracy']
epochs = 2
batch_size = 32
verbose = 0

model.compile(loss=loss,  
              optimizer=optimizer, 
              metrics=metrics) 
model.fit(X_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(X_test)
tn, fp, fn, tp = confusion_matrix(y_test, predictions>.5).ravel()

1 Ответ

2 голосов
/ 09 апреля 2020

Как ссылка на документацию
Операции, в которых используется случайное начальное число, на самом деле получают его из двух начальных значений: начального числа и начального уровня. Это устанавливает глобальное начальное число.

Его взаимодействия с начальными значениями уровня операции являются следующими:

  1. Если не заданы ни глобальное начальное число, ни начальное значение операции: используется случайно выбранное начальное число для этой операции.
  2. Если начальное число операции не установлено, но задано глобальное начальное значение: Система выбирает начальное значение операции из потока начальных значений, определенного глобальным начальным значением.
  3. Если операция seed установлен, но глобальное seed не задано: глобальное начальное значение по умолчанию и указанное начальное значение операции используются для определения случайной последовательности.
  4. Если заданы как глобальное начальное значение, так и начальное значение операции: используются оба начальных значения вместе для определения случайной последовательности.

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)

enter image description here Примечание. Если вы используете TensorFlow 2 выше, Keras уже есть в API, поэтому вам следует использовать TF.Keras, а не нативный.
Все они смоделированы в Google Colab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...