东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2298|回复: 0
打印 上一主题 下一主题

[TensorFlow2.0] 07、神经网络的超参数搜索

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14435
QQ
跳转到指定楼层
楼主
发表于 2019-10-30 16:03:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
07、神经网络的超参数搜索




# 搜索学习率这个超参:[1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
手动搜索:需要用多层for循环 同时每次只能搜索一组超参 无法并行化
  1. # 搜索学习率这个超参:[1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
  2. learning_rates = [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
  3. historys = []
  4. test_losses = []
  5. for lr in learning_rates:
  6.     model = keras.models.Sequential(layers=[
  7.         keras.layers.Dense(30, activation='relu', input_shape=(x_train.shape[1], )),
  8.         keras.layers.Dense(1)
  9.     ], name='model_dfy')

  10.     model.compile(optimizer=keras.optimizers.Adam(lr), loss='mean_squared_error')
  11.     callbacks = [
  12.         keras.callbacks.EarlyStopping(patience=5, min_delta=1e-2)
  13.     ]
  14.     history = model.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
  15.                         callbacks=callbacks)
  16.     # Returns the loss value & metrics values for the model in test mode.
  17.     test_losses.append(model.evaluate(x_test_scaled, y_test))
  18.     historys.append(history)
复制代码

sklearn封装keras模型Demo:
  1. import numpy as np
  2. import matplotlib as mpl
  3. import matplotlib.pyplot as plt
  4. import sklearn
  5. import pandas as pd
  6. import os
  7. import sys
  8. import time
  9. import tensorflow as tf
  10. from tensorflow import keras

  11. print(sys.version_info)
  12. for module in mpl, np, pd, sklearn, tf, keras:
  13.     print(module.__name__, module.__version__)

  14. from sklearn.datasets import fetch_california_housing

  15. housing = fetch_california_housing()
  16. # print(housing.DESCR)
  17. print(housing.data.shape)
  18. print(housing.target.shape)

  19. from sklearn.model_selection import train_test_split

  20. x_train_all, x_test, y_train_all, y_test = train_test_split(
  21.     housing.data, housing.target, random_state=7)
  22. x_train, x_valid, y_train, y_valid = train_test_split(
  23.     x_train_all, y_train_all, random_state=11)
  24. print(x_train.shape, y_train.shape)
  25. print(x_valid.shape, y_valid.shape)
  26. print(x_test.shape, y_test.shape)

  27. from sklearn.preprocessing import StandardScaler

  28. scaler = StandardScaler()
  29. x_train_scaled = scaler.fit_transform(x_train)
  30. x_valid_scaled = scaler.transform(x_valid)
  31. x_test_scaled = scaler.transform(x_test)


  32. # 使用sklearn中RandomizedSearchCV
  33. # 1、sklearn封装keras模型
  34. # 2、定义超参集合
  35. # 3、搜索超参

  36. def build_model(hidden_layer=2, layer_size=30, learning_rate=3e-3):
  37.     model = keras.models.Sequential(name='model_for_sklearn')
  38.     model.add(keras.layers.Dense(layer_size, activation='relu', input_shape=(x_train.shape[1], )))
  39.     for _ in range(hidden_layer-1):
  40.         model.add(keras.layers.Dense(layer_size, activation='relu'))
  41.     model.add(keras.layers.Dense(1))
  42.     optimizer = keras.optimizers.Adam(learning_rate)
  43.     model.compile(optimizer, loss='mse')
  44.     model.summary()
  45.     return model


  46. # Implementation of the scikit-learn regressor API for Keras
  47. # 注意 build_fn= 函数名
  48. sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(build_fn=build_model)
  49. # sklearn_model.summary()
  50. callbacks = [
  51.     keras.callbacks.EarlyStopping(patience=5, min_delta=1e-2)
  52. ]

  53. history = sklearn_model.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
  54.                     callbacks=callbacks)


  55. def plot_learning_curve(history):
  56.     # ValueError: arrays must all be same length
  57.     # 表格型数据 要求每一列的len一致 这里即:history.history字典里每个key对应的value长度一致
  58.     df_history = pd.DataFrame(data=history.history)
  59.     print(df_history)
  60.     df_history.plot(figsize=(8, 5))
  61.     plt.grid(True)
  62.     # x就是DataFrame的索引
  63.     plt.ylim(0, 1)
  64.     plt.show()


  65. plot_learning_curve(history)

  66. from sklearn.metrics import mean_squared_error
  67. # Returns the loss value & metrics values for the model in test mode.
  68. # print(sklearn_model.score(x_test_scaled, y_test))
  69. print(mean_squared_error(y_test, sklearn_model.predict(x_test_scaled)))
复制代码


使用sklearn(封装keras模型)中RandomizedSearchCV示例:
  1. import numpy as np
  2. import matplotlib as mpl
  3. import matplotlib.pyplot as plt
  4. import sklearn
  5. import pandas as pd
  6. import os
  7. import sys
  8. import time
  9. import tensorflow as tf
  10. from tensorflow import keras

  11. print(sys.version_info)
  12. for module in mpl, np, pd, sklearn, tf, keras:
  13.     print(module.__name__, module.__version__)

  14. from sklearn.datasets import fetch_california_housing

  15. housing = fetch_california_housing()
  16. # print(housing.DESCR)
  17. print(housing.data.shape)
  18. print(housing.target.shape)

  19. from sklearn.model_selection import train_test_split

  20. x_train_all, x_test, y_train_all, y_test = train_test_split(
  21.     housing.data, housing.target, random_state=7)
  22. x_train, x_valid, y_train, y_valid = train_test_split(
  23.     x_train_all, y_train_all, random_state=11)
  24. print(x_train.shape, y_train.shape)
  25. print(x_valid.shape, y_valid.shape)
  26. print(x_test.shape, y_test.shape)

  27. from sklearn.preprocessing import StandardScaler

  28. scaler = StandardScaler()
  29. x_train_scaled = scaler.fit_transform(x_train)
  30. x_valid_scaled = scaler.transform(x_valid)
  31. x_test_scaled = scaler.transform(x_test)


  32. # 使用sklearn中RandomizedSearchCV, GridSearchCV
  33. # 1、sklearn封装keras模型
  34. # 2、定义超参集合
  35. # 3、搜索超参

  36. def build_keras_model(hidden_layer=2, layer_size=30, learning_rate=3e-3):
  37.     model = keras.models.Sequential(name='model_for_sklearn')
  38.     model.add(keras.layers.Dense(layer_size, activation='relu', input_shape=(x_train.shape[1], )))
  39.     for _ in range(hidden_layer-1):
  40.         model.add(keras.layers.Dense(layer_size, activation='relu'))
  41.     model.add(keras.layers.Dense(1))
  42.     optimizer = keras.optimizers.Adam(learning_rate)
  43.     model.compile(optimizer, loss='mse')
  44.     model.summary()
  45.     return model


  46. # Implementation of the scikit-learn regressor API for Keras
  47. # 注意 build_fn= 函数名
  48. sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(build_fn=build_keras_model)
  49. # sklearn_model.summary()


  50. from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
  51. # 参数网格
  52. param_grid = [
  53.     {
  54.         'hidden_layer': [2, 3, 4, 5, 6],
  55.         'layer_size': np.arange(30, 100),
  56.         'learning_rate': [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2]
  57.     }
  58. ]

  59. # grid_search = GridSearchCV(estimator=sklearn_model, param_grid=param_grid, n_jobs=1, cv=5, verbose=1)
  60. # grid_search.fit(x_train_scaled, y_train)
  61. # print(grid_search.best_params_)
  62. # print(grid_search.best_score_)

  63. from scipy.stats import reciprocal
  64. # 参数分布
  65. param_distributions = {
  66.         'hidden_layer': [2, 3, 4, 5, 6],
  67.         'layer_size': np.arange(30, 100),
  68.         'learning_rate': reciprocal(1e-4, 1e-2)
  69. }

  70. # estimator 推算子  n_iter=10 随机生成10个候选candidates参数集合
  71. # Fitting 5 folds for each of 10 candidates, totalling 50 fits
  72. random_search = RandomizedSearchCV(estimator=sklearn_model, param_distributions=param_distributions,
  73.                                    n_iter=10, n_jobs=1, cv=5, verbose=1, random_state=666)
  74. # 报错:PicklingError: Could not pickle the task to send it to the workers. 原因:无法并行化 设置n_jobs=1
  75. # random_search.fit(x_train_scaled, y_train)

  76. callbacks = [
  77.     keras.callbacks.EarlyStopping(patience=3, min_delta=1e-2)
  78. ]
  79. random_search.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
  80.                     callbacks=callbacks)
  81. print(random_search.best_params_)
  82. # {'hidden_layer': 6, 'layer_size': 32, 'learning_rate': 0.0048794771174957945}
  83. print(random_search.best_score_)
  84. print(random_search.best_estimator_)
  85. best_sklearn_model = random_search.best_estimator_


  86. def plot_learning_curve(history):
  87.     # ValueError: arrays must all be same length
  88.     # 表格型数据 要求每一列的len一致 这里即:history.history字典里每个key对应的value长度一致
  89.     df_history = pd.DataFrame(data=history.history)
  90.     print(df_history)
  91.     df_history.plot(figsize=(8, 5))
  92.     plt.grid(True)
  93.     # x就是DataFrame的索引
  94.     plt.ylim(0, 1)
  95.     plt.show()


  96. # plot_learning_curve(history)

  97. from sklearn.metrics import mean_squared_error
  98. print(best_sklearn_model.score(x_test_scaled, y_test))
  99. print(mean_squared_error(y_test, best_sklearn_model.predict(x_test_scaled)))

  100. best_keras_model = best_sklearn_model.model
  101. # # Returns the loss value & metrics values for the model in test mode.
  102. print(best_keras_model.evaluate(x_test_scaled, y_test))
复制代码


使用sklearn(封装keras模型)中GridSearchCV示例:
  1. import numpy as np
  2. import matplotlib as mpl
  3. import matplotlib.pyplot as plt
  4. import sklearn
  5. import pandas as pd
  6. import os
  7. import sys
  8. import time
  9. import tensorflow as tf
  10. from tensorflow import keras

  11. print(sys.version_info)
  12. for module in mpl, np, pd, sklearn, tf, keras:
  13.     print(module.__name__, module.__version__)

  14. from sklearn.datasets import fetch_california_housing

  15. housing = fetch_california_housing()
  16. # print(housing.DESCR)
  17. print(housing.data.shape)
  18. print(housing.target.shape)

  19. from sklearn.model_selection import train_test_split

  20. x_train_all, x_test, y_train_all, y_test = train_test_split(
  21.     housing.data, housing.target, random_state=7)
  22. x_train, x_valid, y_train, y_valid = train_test_split(
  23.     x_train_all, y_train_all, random_state=11)
  24. print(x_train.shape, y_train.shape)
  25. print(x_valid.shape, y_valid.shape)
  26. print(x_test.shape, y_test.shape)

  27. from sklearn.preprocessing import StandardScaler

  28. scaler = StandardScaler()
  29. x_train_scaled = scaler.fit_transform(x_train)
  30. x_valid_scaled = scaler.transform(x_valid)
  31. x_test_scaled = scaler.transform(x_test)


  32. # 使用sklearn中RandomizedSearchCV, GridSearchCV
  33. # 1、sklearn封装keras模型
  34. # 2、定义超参集合
  35. # 3、搜索超参

  36. def build_keras_model(hidden_layer=2, layer_size=30, learning_rate=3e-3):
  37.     model = keras.models.Sequential(name='model_for_sklearn')
  38.     model.add(keras.layers.Dense(layer_size, activation='relu', input_shape=(x_train.shape[1], )))
  39.     for _ in range(hidden_layer-1):
  40.         model.add(keras.layers.Dense(layer_size, activation='relu'))
  41.     model.add(keras.layers.Dense(1))
  42.     optimizer = keras.optimizers.Adam(learning_rate)
  43.     model.compile(optimizer, loss='mse')
  44.     model.summary()
  45.     return model


  46. # Implementation of the scikit-learn regressor API for Keras
  47. # 注意 build_fn= 函数名
  48. sklearn_model = keras.wrappers.scikit_learn.KerasRegressor(build_fn=build_keras_model)
  49. # sklearn_model.summary()


  50. from sklearn.model_selection import GridSearchCV
  51. # 参数网格
  52. param_grid = [
  53.     {
  54.         'hidden_layer': [3, 4, 5, 6],
  55.         'layer_size': [30, 35, 40],
  56.         'learning_rate': [1e-4, 3e-4, 1e-3, 3e-3, 1e-2]
  57.     }
  58. ]
  59. # Fitting 3 folds for each of 60 candidates, totalling 180 fits
  60. grid_search = GridSearchCV(estimator=sklearn_model, param_grid=param_grid, n_jobs=1, cv=3, verbose=1)

  61. # 报错:PicklingError: Could not pickle the task to send it to the workers. 原因:无法并行化 设置n_jobs=1
  62. # grid_search.fit(x_train_scaled, y_train)

  63. callbacks = [
  64.     keras.callbacks.EarlyStopping(patience=3, min_delta=1e-2)
  65. ]
  66. grid_search.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
  67.                     callbacks=callbacks)
  68. print(grid_search.best_params_)
  69. # {'hidden_layer': 6, 'layer_size': 40, 'learning_rate': 0.001}
  70. print(grid_search.best_score_)
  71. print(grid_search.best_estimator_)
  72. best_sklearn_model = grid_search.best_estimator_


  73. def plot_learning_curve(history):
  74.     # ValueError: arrays must all be same length
  75.     # 表格型数据 要求每一列的len一致 这里即:history.history字典里每个key对应的value长度一致
  76.     df_history = pd.DataFrame(data=history.history)
  77.     print(df_history)
  78.     df_history.plot(figsize=(8, 5))
  79.     plt.grid(True)
  80.     # x就是DataFrame的索引
  81.     plt.ylim(0, 1)
  82.     plt.show()


  83. history = best_sklearn_model.fit(x_train_scaled, y_train, validation_data=(x_valid_scaled, y_valid), epochs=50,
  84.                     callbacks=callbacks)

  85. plot_learning_curve(history)


  86. from sklearn.metrics import mean_squared_error
  87. print(best_sklearn_model.score(x_test_scaled, y_test))
  88. print(mean_squared_error(y_test, best_sklearn_model.predict(x_test_scaled)))

  89. best_keras_model = best_sklearn_model.model
  90. # # Returns the loss value & metrics values for the model in test mode.
  91. print(best_keras_model.evaluate(x_test_scaled, y_test))
复制代码



东方老师AI官网:http://www.ai111.vip
有任何问题可联系东方老师微信:dfy_88888
【微信二维码图片】








01.png (186.32 KB, 下载次数: 139)

01.png

02.png (62.33 KB, 下载次数: 139)

02.png

03.png (155.19 KB, 下载次数: 140)

03.png

04.png (174.14 KB, 下载次数: 142)

04.png

05.png (114.45 KB, 下载次数: 136)

05.png

06.png (99.46 KB, 下载次数: 139)

06.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-29 09:54 , Processed in 0.183825 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表