我需要在训练神经网络时在多次运行之间获得均方误差(MSE)的一致结果。

huangapple go评论107阅读模式
英文:

I need consistent results for MSE between runs when training a Neural Network

问题

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.metrics import mean_squared_error
  5. import tensorflow as tf
  6. from tensorflow.keras.models import Sequential
  7. from tensorflow.keras.layers import Dense
  8. from tensorflow.keras.optimizers import Adam
  9. import matplotlib.pyplot as plt
  10. from bayes_opt import BayesianOptimization
  11. # 从UCI机器学习存储库加载数据
  12. df = pd.read_csv(r'C:\Test_set_Yacht.csv')
  13. df1 = pd.read_csv(r'C:\Train_set_Yacht.csv')
  14. df2 = pd.read_csv(r'C:\Yacht_hydro.csv')
  15. X = df2.drop("residuary_resistance", axis=1)
  16. Y = df2["residuary_resistance"]
  17. # 将数据分割为特征和目标
  18. X_train = df1.drop("residuary_resistance", axis=1)
  19. y_train = df1["residuary_resistance"]
  20. # 将数据分割为训练集和测试集
  21. X_test = df.drop("residuary_resistance", axis=1)
  22. y_test = df["residuary_resistance"]
  23. # 使用StandardScaler对数据进行缩放
  24. scaler = StandardScaler()
  25. X_train_scaled = scaler.fit_transform(X_train)
  26. X_test_scaled = scaler.transform(X_test)
  27. def objective_model_1(hidden_units, learning_rate):
  28. model = Sequential()
  29. model.add(Dense(hidden_units, input_dim=X.shape[1], activation="relu"))
  30. model.add(Dense(hidden_units, activation="relu"))
  31. model.add(Dense(1, activation="linear"))
  32. model.compile(loss="mse", optimizer=Adam(learning_rate=learning_rate))
  33. model.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  34. y_pred = model.predict(X_test_scaled)
  35. return -mean_squared_error(y_test, y_pred)
  36. pbounds_model_1 = {
  37. "hidden_units": (32, 128),
  38. "learning_rate": (1e-5, 1e-1),
  39. }
  40. bo_model_1 = BayesianOptimization(
  41. f=objective_model_1,
  42. pbounds=pbounds_model_1,
  43. random_state=42,
  44. )
  45. bo_model_1.maximize(init_points=10, n_iter=90)
  46. def objective_model_2(hidden_units, learning_rate):
  47. model = Sequential()
  48. model.add(Dense(hidden_units, input_shape=X_train_scaled.shape[1:], activation="relu"))
  49. model.add(Dense(hidden_units, activation="relu"))
  50. model.add(Dense(hidden_units, activation="relu"))
  51. model.add(Dense(hidden_units, activation="relu"))
  52. model.add(Dense(1, activation="linear"))
  53. model.compile(loss="mse", optimizer=Adam(learning_rate=learning_rate))
  54. model.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  55. y_pred = model.predict(X_test_scaled)
  56. return -mean_squared_error(y_test, y_pred)
  57. pbounds_model_2 = {
  58. "hidden_units": (32, 128),
  59. "learning_rate": (1e-5, 1e-1),
  60. }
  61. bo_model_2 = BayesianOptimization(
  62. f=objective_model_2,
  63. pbounds=pbounds_model_2,
  64. random_state=42,
  65. )
  66. bo_model_2.maximize(init_points=10, n_iter=90)
  67. # 获取最佳超参数
  68. # 获取每个模型的最佳超参数
  69. best_params_model_1 = bo_model_1.max["params"]
  70. best_params_model_2 = bo_model_2.max["params"]
  71. # 使用最佳超参数训练和评估模型1
  72. model_1 = Sequential()
  73. model_1.add(Dense(32, input_dim=X.shape[1], activation="relu"))
  74. model_1.add(Dense(32, activation="relu"))
  75. model_1.add(Dense(1, activation="linear"))
  76. model_1.compile(loss="mse", optimizer=Adam(learning_rate=best_params_model_1["learning_rate"]))
  77. model_1.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  78. y_pred_1 = model_1.predict(X_test_scaled)
  79. mse_1 = mean_squared_error(y_test, y_pred_1)
  80. print("模型 1 在测试集上的均方误差:", mse_1)
  81. # 使用最佳超参数训练和评估模型2
  82. model_2 = Sequential()
  83. model_2.add(Dense(64, input_dim=X.shape[1], activation="relu"))
  84. model_2.add(Dense(64, activation="relu"))
  85. model_2.add(Dense(64, activation="relu"))
  86. model_2.add(Dense(64, activation="relu"))
  87. model_2.add(Dense(1, activation="linear"))
  88. model_2.compile(loss="mse", optimizer=Adam(learning_rate=best_params_model_2["learning_rate"]))
  89. model_2.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  90. y_pred_2 = model_2.predict(X_test_scaled)
  91. mse_2 = mean_squared_error(y_test, y_pred_2)
  92. print("模型 2 在测试集上的均方误差:", mse_2)
英文:
  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.metrics import mean_squared_error
  5. import tensorflow as tf
  6. from tensorflow.keras.models import Sequential
  7. from tensorflow.keras.layers import Dense
  8. from tensorflow.keras.optimizers import Adam
  9. import matplotlib.pyplot as plt
  10. from bayes_opt import BayesianOptimization
  11. # load data from UCI Machine Learning Repository
  12. df = pd.read_csv(r'C:\Test_set_Yacht.csv')
  13. df1 = pd.read_csv(r'C:\Train_set_Yacht.csv')
  14. df2 = pd.read_csv(r'C:\Yacht_hydro.csv')
  15. X = df2.drop("residuary_resistance", axis=1)
  16. Y = df2["residuary_resistance"]
  17. # split data into features and target
  18. X_train = df1.drop("residuary_resistance", axis=1)
  19. y_train = df1["residuary_resistance"]
  20. # split data into train and test sets
  21. X_test = df.drop("residuary_resistance", axis=1)
  22. y_test = df["residuary_resistance"]
  23. # scale data using StandardScaler
  24. scaler = StandardScaler()
  25. X_train_scaled = scaler.fit_transform(X_train)
  26. X_test_scaled = scaler.transform(X_test)
  27. def objective_model_1(hidden_units, learning_rate):
  28. model = Sequential()
  29. model.add(Dense(hidden_units, input_dim=X.shape[1], activation="relu"))
  30. model.add(Dense(hidden_units, activation="relu"))
  31. model.add(Dense(1, activation="linear"))
  32. model.compile(loss="mse", optimizer=Adam(learning_rate=learning_rate))
  33. model.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  34. y_pred = model.predict(X_test_scaled)
  35. return -mean_squared_error(y_test, y_pred)
  36. pbounds_model_1 = {
  37. "hidden_units": (32, 128),
  38. "learning_rate": (1e-5, 1e-1),
  39. }
  40. bo_model_1 = BayesianOptimization(
  41. f=objective_model_1,
  42. pbounds=pbounds_model_1,
  43. random_state=42,
  44. )
  45. bo_model_1.maximize(init_points=10, n_iter=90)
  46. def objective_model_2(hidden_units, learning_rate):
  47. model = Sequential()
  48. model.add(Dense(hidden_units, input_shape=X_train_scaled.shape[1:], activation="relu"))
  49. model.add(Dense(hidden_units, activation="relu"))
  50. model.add(Dense(hidden_units, activation="relu"))
  51. model.add(Dense(hidden_units, activation="relu"))
  52. model.add(Dense(1, activation="linear"))
  53. model.compile(loss="mse", optimizer=Adam(learning_rate=learning_rate))
  54. model.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  55. y_pred = model.predict(X_test_scaled)
  56. return -mean_squared_error(y_test, y_pred)
  57. pbounds_model_2 = {
  58. "hidden_units": (32, 128),
  59. "learning_rate": (1e-5, 1e-1),
  60. }
  61. bo_model_2 = BayesianOptimization(
  62. f=objective_model_2,
  63. pbounds=pbounds_model_2,
  64. random_state=42,
  65. )
  66. bo_model_2.maximize(init_points=10, n_iter=90)
  67. # get the best hyperparameters
  68. # get the best hyperparameters for each model
  69. best_params_model_1 = bo_model_1.max["params"]
  70. best_params_model_2 = bo_model_2.max["params"]
  71. # train and evaluate model 1 with best hyperparameters
  72. model_1 = Sequential()
  73. model_1.add(Dense(32, input_dim=X.shape[1], activation="relu"))
  74. model_1.add(Dense(32, activation="relu"))
  75. model_1.add(Dense(1, activation="linear"))
  76. model_1.compile(loss="mse", optimizer=Adam(learning_rate=best_params_model_1["learning_rate"]))
  77. model_1.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  78. y_pred_1 = model_1.predict(X_test_scaled)
  79. mse_1 = mean_squared_error(y_test, y_pred_1)
  80. print("Model 1 MSE on test set:", mse_1)
  81. # train and evaluate model 2 with best hyperparameters
  82. model_2 = Sequential()
  83. model_2.add(Dense(64, input_dim=X.shape[1], activation="relu"))
  84. model_2.add(Dense(64, activation="relu"))
  85. model_2.add(Dense(64, activation="relu"))
  86. model_2.add(Dense(64, activation="relu"))
  87. model_2.add(Dense(1, activation="linear"))
  88. model_2.compile(loss="mse", optimizer=Adam(learning_rate=best_params_model_2["learning_rate"]))
  89. model_2.fit(X_train_scaled, y_train, epochs=100, verbose=0)
  90. y_pred_2 = model_2.predict(X_test_scaled)
  91. mse_2 = mean_squared_error(y_test, y_pred_2)
  92. print("Model 2 MSE on test set:", mse_2)

In the following code, I implement a bayesian optimization for hyperparameter tunning of 2 different NN using the data set from: https://archive.ics.uci.edu/ml/datasets/yacht+hydrodynamics,After running this, I create again those 2 NN in a JupytherNotebook code block and run with the best hyperparameters already determined by the bayesian optimizer. I need each time I run the code to get the same MSE. This is the reason why I am splitting the data already to ensure the same results.

答案1

得分: 1

tensorflow库的内部工作是不确定的。因此,为了获得可重现的结果,你必须设置一个随机种子,在实践中,你只需要在代码开头添加这一行:

  1. tf.random.set_seed(0)
英文:

The inner workings of the tensorflow library are non-deterministic. So you must set a random seed in order to get reproducible results, in practice you just need to add this line at the start of your code:

  1. tf.random.set_seed(0)

huangapple
  • 本文由 发表于 2023年2月19日 01:47:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/75495246.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定