使用TensorBoard进行超参数优化的实现


Posted in Python onJuly 06, 2020

在本文中,我们将介绍超参数优化,然后使用TensorBoard显示超参数优化的结果。

深度神经网络的超参数是什么?

深度学习神经网络的目标是找到节点的权重,这将帮助我们理解图像、文本或语音中的数据模式。

要做到这一点,可以使用为模型提供最佳准度和精度的值来设计神经网络参数。

那么,这些被称为超参数的参数是什么呢?

用于训练神经网络模型的不同参数称为超参数。这些超参数像旋钮一样被调优,以提高神经网络的性能,从而产生一个优化的模型。超参数的一个通俗的解释是:用来优化参数的参数。

神经网络中的一些超参数是:

1.隐藏层的数量
2.隐含层中单位或节点的集合的数量
3.学习速率
4.DropOut比例
5.迭代次数
6.优化器的选择如SGD, Adam, AdaGrad, Rmsprop等
7.激活函数选择如ReLU, sigmoid, leaky ReLU等
8.批次大小

如何实现超参数优化?

超参数优化是寻找深度学习算法的优化器、学习率、等超参数值,从而获得最佳模型性能的过程。

使用TensorBoard进行超参数优化的实现

可以使用以下技术执行超参数优化。

  • 手动搜索
  • 网格搜索:对指定超参数的所有可能组合进行穷举搜索,从而得到笛卡尔积。
  • 随机搜索:超参数是随机选择的,不是每一个超参数的组合都被尝试。随着超参数数量的增加,随机搜索是一个更好的选择,因为它可以更快地得到超参数的良好组合。
  • 贝叶斯优化:整合关于超参数的先验数据,包括模型的准确性或损失。先验信息有助于确定模型超参数选择的更好近似。

为了在TensorBoard中可视化模型的超参数并进行调优,我们将使用网格搜索技术,其中我们将使用一些超参数,如不同的节点数量,不同的优化器,或学习率等看看模型的准确性和损失。

为什么使用TensorBoard进行超参数优化?

一幅图片胜过千言万语,这也适用于复杂的深度学习模型。深度学习模型被认为是一个黑盒子,你发送一些输入数据,模型做一些复杂的计算,输出结果。

TensorBoard是Tensorflow的一个可视化工具包,用于显示不同的指标、参数和其他可视化,帮助调试、跟踪、微调、优化和共享深度学习实验结果

TensorBoard可以跟踪模型在每个训练迭代的精度和损失;

还有不同的超参数值。不同超参数值的跟踪精度将帮助您更快地微调模型。

我们将使用猫和狗数据集使用TensorBoard可视化标量、图形和分布。

https://www.kaggle.com/c/dogs-vs-cats/data

导入所需的库

导入TensorFlow和TensorBoard HParams插件以及Keras库来预处理图像和创建模型。

import tensorflow as tf
from tensorboard.plugins.hparams import api as hp
import datetime
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator, img_to_array, load_img
import numpy as np

加载TensorBoard notebook扩展

# Load the TensorBoard notebook extension
%load_ext tensorboard

创建图像分类的深度学习模型

为训练设置关键参数

BASE_PATH = 'Data\\dogs-vs-cats\\train\\'
TRAIN_PATH='Data\\dogs-vs-cats\\train_data\\'
VAL_PATH='Data\\dogs-vs-cats\\validation_data\\'batch_size = 32 
epochs = 5
IMG_HEIGHT = 150
IMG_WIDTH = 150

对训练图像进行缩放和不同的增强

train_image_generator = ImageDataGenerator(                        
rescale=1./255,
rotation_range=45, 
width_shift_range=.15,
height_shift_range=.15,
horizontal_flip=True,
zoom_range=0.3)

重新调节验证数据

validation_image_generator = ImageDataGenerator(rescale=1./255)

为训练和验证生成成批的规范化数据

train_data_gen = train_image_generator.flow_from_directory(
batch_size = batch_size,           
directory=TRAIN_PATH,
shuffle=True,
target_size=(IMG_HEIGHT, IMG_WIDTH),
class_mode='categorical')
val_data_gen = validation_image_generator.flow_from_directory(batch_size = batch_size,
directory=VAL_PATH,
target_size=(IMG_HEIGHT, IMG_WIDTH), 
class_mode='categorical')

为网格搜索(Grid Search)设置超参数

我们通过列出超参数的不同值或取值范围,使用了四个超参数来运行我们的实验。

对于离散超参数,将尝试所有可能的参数组合,对于实值参数,只使用下界和上界。

第一层的单元数量:256和512

dropout比例:范围在0.1到0.2之间。所以dropout比例是0。1和0。2。

优化器:adam, SGD, rmsprop

优化器的学习率:0.001,0.0001和0.0005,

我们还将准确率显示在TensorBoard 上

## Create hyperparameters
HP_NUM_UNITS=hp.HParam('num_units', hp.Discrete([ 256, 512]))
HP_DROPOUT=hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
HP_LEARNING_RATE= hp.HParam('learning_rate', hp.Discrete([0.001, 0.0005, 0.0001]))
HP_OPTIMIZER=hp.HParam('optimizer', hp.Discrete(['adam', 'sgd', 'rmsprop']))METRIC_ACCURACY='accuracy'

创建和配置日志文件

log_dir ='\\logs\\fit\\' + datetime.datetime.now().strftime('%Y%m%d-%H%M%S')
with tf.summary.create_file_writer(log_dir).as_default():
  hp.hparams_config(
  hparams=
  [HP_NUM_UNITS, HP_DROPOUT, HP_OPTIMIZER, HP_LEARNING_RATE],
  metrics=[hp.Metric(METRIC_ACCURACY, display_name='Accuracy')],
  )

创建、编译和训练模型

超参数不是硬编码的,但从hparams字典为不同的参数:HP_DROPOUT , HP_NUM_UNITS ,HP_OPTIMIZER ,HP_LEARNING_RATE。

函数返回最后一个批次的验证准确性。

def create_model(hparams):
  model = Sequential([
  Conv2D(64, 3, padding='same', activation='relu', 
      input_shape=(IMG_HEIGHT, IMG_WIDTH ,3)),
  MaxPooling2D(),
  #setting the Drop out value based on HParam
  Dropout(hparams[HP_DROPOUT]),
  Conv2D(128, 3, padding='same', activation='relu'),
  MaxPooling2D(),
  Dropout(hparams[HP_DROPOUT]),
  Flatten(),
  Dense(hparams[HP_NUM_UNITS], activation='relu'),
  Dense(2, activation='softmax')])
  
  #setting the optimizer and learning rate
  optimizer = hparams[HP_OPTIMIZER]
  learning_rate = hparams[HP_LEARNING_RATE]
  if optimizer == "adam":
    optimizer = tf.optimizers.Adam(learning_rate=learning_rate)
  elif optimizer == "sgd":
    optimizer = tf.optimizers.SGD(learning_rate=learning_rate)
  elif optimizer=='rmsprop':
    optimizer = tf.optimizers.RMSprop(learning_rate=learning_rate)
  else:
    raise ValueError("unexpected optimizer name: %r" % (optimizer_name,))
  
  # Comiple the mode with the optimizer and learninf rate specified in hparams
  model.compile(optimizer=optimizer,
       loss='categorical_crossentropy',
       metrics=['accuracy'])
  
  #Fit the model 
  history=model.fit_generator(
  train_data_gen,
  steps_per_epoch=1000,
  epochs=epochs,
  validation_data=val_data_gen,
  validation_steps=1000,
  callbacks=[
    tf.keras.callbacks.TensorBoard(log_dir), # log metrics
    hp.KerasCallback(log_dir, hparams),# log hparams
    
  ])
  return history.history['val_accuracy'][-1]

对于模型的每次运行,使用超参数和最终批次精度记录hparams都会被纪律。我们需要将最后一个批次的验证精度转换为标量值。

def run(run_dir, hparams):
 with tf.summary.create_file_writer(run_dir).as_default():
  hp.hparams(hparams) # record the values used in this trial
  accuracy = create_model(hparams)
  #converting to tf scalar
  accuracy= tf.reshape(tf.convert_to_tensor(accuracy), []).numpy()
  tf.summary.scalar(METRIC_ACCURACY, accuracy, step=1)

用不同的超参数值运行模型

这里的实验使用网格搜索,并测试第一层单元数的所有可能的超参数组合,Dropout比例、优化器及其学习率,以及准确度用于准确性。

session_num = 0for num_units in HP_NUM_UNITS.domain.values:
 for dropout_rate in (HP_DROPOUT.domain.min_value, HP_DROPOUT.domain.max_value):
  for optimizer in HP_OPTIMIZER.domain.values:
    for learning_rate in HP_LEARNING_RATE.domain.values:
     hparams = {
       HP_NUM_UNITS: num_units,
       HP_DROPOUT: dropout_rate,
       HP_OPTIMIZER: optimizer,
       HP_LEARNING_RATE: learning_rate,
     }
     run_name = "run-%d" % session_num
     print('--- Starting trial: %s' % run_name)
     print({h.name: hparams[h] for h in hparams})
     run('logs/hparam_tuning/' + run_name, hparams)
     session_num += 1

在HParams中可视化结果

python -m tensorboard.main --logdir="logs/hparam_tuning"

当按精度降序排序时,可以看到最优化的模型是256台,dropout比例为0.2,rmsprop优化器学习率为0.0005。

使用TensorBoard进行超参数优化的实现

在jupyter notebook中可以使用以下命令查看

%tensorboard --logdir='\logs\hparam_tuning'

使用TensorBoard进行超参数优化的实现

在Tensorboard中使用Parallel Coordinates视图,显示每个超参数的单独运行情况并显示精度,查找最优化的超参数,以获得最佳的模型精度

使用TensorBoard进行超参数优化的实现

总结

Tensorboard为超参数调优提供了一种可视化的方式来了解哪些超参数可以用于微调深度学习模型以获得最佳精度,更多的操作可以查看官方文档:

https://www.tensorflow.org/tensorboard/hyperparameter_tuning_with_hparams

作者:Renu Khandelwal

deephub翻译组

到此这篇关于使用TensorBoard进行超参数优化的实现的文章就介绍到这了,更多相关TensorBoard 超参数优化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
在Windows系统上搭建Nginx+Python+MySQL环境的教程
Dec 25 Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 Python
python PyTorch预训练示例
Feb 11 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Python使用正则表达式分割字符串的实现方法
Jul 16 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
matplotlib交互式数据光标实现(mplcursors)
Jan 13 Python
Python用requests库爬取返回为空的解决办法
Feb 21 Python
详解Python+OpenCV绘制灰度直方图
Mar 22 Python
Python进程间的通信之语法学习
Apr 11 Python
Django中F函数的使用示例代码详解
Jul 06 #Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 #Python
Django-imagekit的使用详解
Jul 06 #Python
大数据分析用java还是Python
Jul 06 #Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 #Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 #Python
python如何调用java类
Jul 05 #Python
You might like
php smarty模版引擎中的缓存应用
2009/12/02 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
ThinkPHP5.1验证码功能实现的示例代码
2020/06/08 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
javascript实现树形菜单的方法
2015/07/17 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
babel基本使用详解
2017/02/17 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
2016/03/01 HTML / CSS
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
英国的潮牌鞋履服饰商店:size?
2019/03/26 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
环境科学专业个人求职信
2013/12/15 职场文书
宣传工作经验材料
2014/06/02 职场文书
春游踏青活动方案
2014/08/14 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
文言文辞职信
2015/02/28 职场文书
幼儿园校车安全责任书
2015/05/08 职场文书
Python基础详解之邮件处理
2021/04/28 Python