社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

【调参实战】如何开始你的第一个深度学习调参任务?不妨从图像分类中的学习率入手。

有三AI • 5 年前 • 448 次点击  

大家好,欢迎来到专栏《调参实战》,虽然当前自动化调参研究越来越火,但那其实只是换了一些参数来调,对参数的理解和调试在机器学习相关任务中是最基本的素质,在这个专栏中我们会带领大家一步一步理解和学习调参。


本次主要讲述图像分类项目中的学习率的调参实践


作者&编辑 | 言有三

本文资源与结果展示

本文篇幅:3500字

背景要求:会使用Python和任一深度学习开源框架

附带资料:Caffe代码和数据集一份

同步平台:有三AI知识星球(一周内)

1 项目背景与准备工作

对于很多初入机器学习/深度学习领域的朋友来说,往往只会套用公开的模型,对参数的理解和调试非常欠缺经验,很多经验丰富的老鸟则往往自称“炼丹师”,这就是因为参数的调试对于模型性能的影响确实非常大,轻则损害模型性能,重则甚至使得模型无法正常收敛。


图像分类是整个计算机视觉领域中最基础的任务,实验起来比较简单,在学术界也常用于新模型的比较,因此我们选择图像分类任务来进行调参的学习


本次项目开发需要以下环境:


(1) Linux系统,推荐ubuntu16.04或者ubuntu18.04。使用windows系统也可以完成,但是使用Linux效率更高。

(2) 最好拥有一块显存不低于6G的GPU显卡,如果没有使用CPU进行训练速度较慢。

(3) 安装好的Caffe开源框架。

2 数据集和基准模型

下面我们首先介绍一下数据集和基准模型。


2.1 数据集


在计算机视觉领域中,MNIST,CIFAR,ImageNet常常被用于任务比较,但是它们都有各自的问题。MNIST和CIFAR数据集图像太小,与真实的计算机视觉任务相去甚远。ImageNet数据集超过100G,对于大部分个人研究者来说,不适合拿来快速进行学习验证。


基于此,我们选择了GHIM-10k数据集,这是一个图像检索数据集,包含20个类别,分别是日落,船舶,花卉,建筑物,汽车,山脉,昆虫等自然图像,各个类别拥有较好的多样性,而类别之间也有比较好的区分度。数据集共10000张图像,每个类别包含500张JPEG格式的大小为400×300或300×400的图像。

这个数据集有以下几个比较重要的优点。


(1) 数据集规模不大,获取也很容易,所有的读者都可以轻易验证我们的实验结果。

(2) 全部都是真实图片,来自于用户相机拍摄,而且图片清晰度足够高。

(3) 数据集多样性适中,包含了20类场景的自然场景,每一类的场景非常的均匀。图片的尺寸是300*400或者400*300,规格统一,符合大多数深度学习图像任务的处理分辨率,尤其是图像分类。

(4) 数据集类别分布非常的均匀,我们选择数据集的方式也是随机但均匀的选取。我们将数据集按照9:1的比率进行划分,训练集中包含20类,每一类450张图,测试集中包含20类,每一类50张图。


2.2 基准模型


如今深度学习模型已经有了非常多的变种,而它的本质并没有变,就是以卷积+非线性激活函数组成的基础单元进行叠加的模式。


经典的AlexNet是一个8层的网络,包含了5层卷积和3层全连接,这里我们也选择一个类似的模型,包括5层卷积,1层全局池化,1层全连接,因为公开的学术研究表明全连接层并不需要过多。


采用Caffe和Proto协议来定义网络,这样的模型配置可以手动进行,非常适合一边调试一边进行可视化,模型细节如下:

layer {

   name: "data"

   type: "ImageData"

   top: "data"

   top: "label"

   include {

     phase: TRAIN

   }

   transform_param {

     mirror: true

     crop_size: 224

     mean_value: 104.0

     mean_value: 117.0

     mean_value: 124.0

   }

   image_data_param {

     source: "list_train_shuffle.txt"

     batch_size: 16

     shuffle: true

     new_height: 256

     new_width: 256

   }

 }


layer {

   name: "data"

   type: "ImageData"

   top: "data"

   top: "label"

   include {

     phase: TEST

   }

   transform_param {

     mirror: false

     crop_size: 224

     mean_value: 104.0

     mean_value: 117.0

     mean_value: 124.0

   }

   image_data_param {

     source: "list_val_shuffle.txt"

     batch_size: 16

     shuffle: false

     new_height: 224

     new_width: 224

   }

 }


layer {

  bottom: "data"

  top: "conv1"

  name: "conv1"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 64

    pad: 1

    kernel_size: 3    

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv1"

  top: "conv1"

  name: "relu1"

  type: "ReLU"

}

layer {

  bottom: "conv1"

  top: "conv2"

  name: "conv2"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 64

    pad: 1

    kernel_size: 3

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv2"

  top: "conv2"

  name: "relu2"

  type: "ReLU"

}


layer {

  bottom: "conv2"

  top: "conv3"

  name: "conv3"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 128

    pad: 1

    kernel_size: 3

    stride: 2

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv3"

  top: "conv3"

  name: "relu3"

  type: "ReLU"

}

layer {

  bottom: "conv3"

  top: "conv4"

  name: "conv4"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 128

    pad: 1

    stride: 2

    kernel_size: 3

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv4"

  top: "conv4"

  name: "relu4"

  type: "ReLU"

}

layer {

  bottom: "conv4"

  top: "conv5"

  name: "conv5"

  type: "Convolution"

  param {

    lr_mult: 1

    decay_mult: 1

  }

  param {

    lr_mult: 2

    decay_mult: 0

  }

  convolution_param {

    num_output: 256

    pad: 1

    stride: 2

    kernel_size: 3

    weight_filler {

      type: "gaussian"

      std: 0.01

    }

    bias_filler {

      type: "constant"

      value: 0

    }

  }

}

layer {

  bottom: "conv5"

  top: "conv5"

  name: "relu5"

  type: "ReLU"

}


layer {

    bottom: "conv5"

    top: "pool5"

    name: "pool5"

    type: "Pooling"

    pooling_param {

        kernel_size: 7

        stride: 1

        pool: AVE

    }

}


layer {

  bottom: "pool5"

  top: "fc"

  name: "fc"

  type: "InnerProduct"

    inner_product_param {

        num_output: 20

        weight_filler {

            type: "xavier"

        }

        bias_filler {

            type: "constant"

            value: 0

        }

    }

}



layer {

  name: "accuracy_at_1"

  type: "Accuracy"

  bottom: "fc"

  bottom: "label"

  top: "accuracy_at_1"

  accuracy_param {

    top_k: 1

  }

}

layer {

  name: "accuracy_at_5"

  type: "Accuracy"

  bottom: "fc"

  bottom: "label"

  top: "accuracy_at_5"

  accuracy_param {

    top_k: 5

  }

}

layer {

  bottom: "fc"

  bottom: "label"

  top: "loss"

  name: "loss"

  type: "SoftmaxWithLoss"

}


使用在线工具http://ethereon.github.io/netscope/#/editor

对模型的可视化结果如下:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/58630
 
448 次点击