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)
但请注意,这会带来显着的性能损失。
作为来自文档的参考
,依赖于随机种子的操作实际上是从两个种子中派生出来的:全局种子和操作级种子。这设置了全局种子。
它与操作级种子的交互如下:
默认情况下将选择随机种子。从结果中可以很容易地注意到这一点。每次重新运行程序或多次调用代码时,它都会有不同的值。
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 上模拟的。
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |