如何获得可重现的结果(Keras、Tensorflow):

Ale*_*nov 6 neural-network keras tensorflow tensorflow2.0

为了使结果可重现,我已将 20 多篇文章添加到我的脚本中,并将最多的功能添加到我的脚本中……但失败了。

在官方来源我红色有 2 种种子 - 全局和操作。可能是,解决我的问题的关键是设置操作种子,但我不知道在哪里应用它。

请您帮我用 tensorflow(版本 > 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()
Run Code Online (Sandbox Code Playgroud)

lok*_*oki 13

从 TensorFlow 2.8 开始,有 tf.config.experimental.enable_op_determinism().

即使在 GPU 上,您也可以通过以下方式确保再现性:

import tensorflow as tf

tf.keras.utils.set_random_seed(42)  # sets seeds for base-python, numpy and tf
tf.config.experimental.enable_op_determinism()
Run Code Online (Sandbox Code Playgroud)

但请注意,这会带来显着的性能损失。


TF_*_*ort 6

作为来自文档的参考
,依赖于随机种子的操作实际上是从两个种子中派生出来的:全局种子和操作级种子。这设置了全局种子。

它与操作级种子的交互如下:

  1. 如果全局种子和操作种子均未设置:此操作使用随机选取的种子。
  2. 如果未设置操作种子但设置了全局种子:系统从全局种子确定的种子流中选择操作种子。
  3. 如果设置了操作种子,但未设置全局种子:使用默认的全局种子和指定的操作种子来确定随机序列。
  4. 如果全局和操作种子都设置了:两个种子结合使用来确定随机序列。

第一个场景

默认情况下将选择随机种子。从结果中可以很容易地注意到这一点。每次重新运行程序或多次调用代码时,它都会有不同的值。

x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(x_train)
Run Code Online (Sandbox Code Playgroud)

第二个场景

全局已设置,但操作尚未设置。尽管它从第一个和第二个随机生成了不同的种子。如果重新运行或重新启动代码。两者的种子仍然相同。它一遍又一遍地产生相同的结果。

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)
Run Code Online (Sandbox Code Playgroud)

第三个场景

对于此场景,设置了操作种子但未设置全局种子。如果您重新运行代码,它将为您提供不同的结果,但如果您重新启动运行时,它会为您提供与上次运行相同的结果序列。

x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=2)
print(x_train)
Run Code Online (Sandbox Code Playgroud)

第四个场景

两个种子都将用于确定随机序列。更改全局和操作种子将产生不同的结果,但使用相同的种子重新启动运行时仍将产生相同的结果。

tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=1)
print(x_train) 
Run Code Online (Sandbox Code Playgroud)

创建了一个可重现的代码作为参考。
通过设置全局种子,它总是给出相同的结果。

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)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明
注意:如果您使用 TensorFlow 2 更高版本,Keras 已经在 API 中,因此,您应该使用 TF.Keras 而不是原生的。
所有这些都是在 google colab 上模拟的。