机器之心编辑部发布

基础入门,怎样用PaddlePaddle优雅地写VGG与ResNet

图像相比文字能够提供更加生动、容易理解及更具艺术感的信息, 图像分类是根据图像的语义信息将不同类别图像区分开来,是图像检测、 图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。 图像分类在安防、交通、互联网、医学等领域有着广泛的应用。

一般来说, 图像分类通过手工提取特征或特征学习方法对整个图像进行全部描述,然后使用分类器判别物体类别,因此如何提取图像的特征至关重要。基于 深度学习图像分类方法,可以通过有监督或无监督的方式学习层次化的特征描述,从而取代了手工设计或选择图像特征的工作。

深度学习模型中的 卷积神经网络(Convolution Neural Network, CNN) 直接利用图像像素信息作为输入,最大程度上保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于"输入-输出"直接端到端的学习方法取得了非常好的效果。

本教程主要介绍 图像分类深度学习模型,以及如何使用PaddlePaddle在CIFAR10数据集上快速实现CNN模型。

项目地址:

http://paddlepaddle.org/documentation/docs/zh/1.3/beginners_guide/basics/image_classification/index.html

基于ImageNet数据集训练的更多 图像分类模型,及对应的预训练模型、finetune操作详情请参照Github:

https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md

效果

图像分类包括通用 图像分类、细粒度 图像分类等。图1展示了通用 图像分类效果,即模型可以正确识别图像上的主要物体。

图1. 通用 图像分类展示

图2展示了细粒度 图像分类-花卉识别的效果,要求模型可以正确识别花的类别。

图2. 细粒度 图像分类展示

一个好的模型既要对不同类别识别正确,同时也应该能够对不同视角、光照、背景、变形或部分遮挡的图像正确识别(这里我们统一称作图像扰动)。图3展示了一些图像的扰动,较好的模型会像聪明的人类一样能够正确识别。

图3. 扰动图片展示[7]

模型概览:CNN

传统CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类 交叉熵 损失函数,一个典型的 卷积神经网络如图4所示,我们先介绍用来构造CNN的常见组件。

图4. CNN网络示例[5]

•   卷积层(convolution layer): 执行卷积操作提取底层到高层的特征,发掘出图片局部关联性质和空间不变性质。

•   池化层(pooling layer): 执行 降采样操作。通过取卷积输出特征图中局部区块的最大值(max-pooling)或者均值(avg-pooling)。 降采样也是 图像处理中常见的一种操作,可以过滤掉一些不重要的高频信息。

•   全连接层(fully-connected layer,或者fc layer): 输入层到隐藏层的 神经元是全部连接的。

•   非线性变化: 卷积层、全连接层后面一般都会接非线性变化函数,例如Sigmoid、Tanh、ReLu等来增强网络的表达能力,在CNN里最常使用的为ReLu 激活函数

•   Dropout [1] : 在模型训练阶段随机让一些隐层节点 权重不工作,提高网络的泛化能力,一定程度上防止 过拟合

接下来我们主要介绍 VGG,ResNet网络结构。

1、VGG

牛津大学 VGG(Visual Geometry Group)组在2014年ILSVRC提出的模型被称作 VGG模型[2] 。该模型相比以往模型进一步加宽和加深了网络结构,它的核心是五组卷积操作,每两组之间做Max-Pooling空间 降维。同一组内采用多次连续的3X3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是一样的。卷积之后接两层全连接层,之后是分类层。由于每组内卷积层的不同,有11、13、16、19层这几种模型,下图展示一个16层的网络结构。

VGG模型结构相对简洁,提出之后也有很多文章基于此模型进行研究,如在ImageNet上首次公开超过人眼识别的模型[4]就是借鉴 VGG模型的结构。

图5. 基于ImageNet的 VGG16模型

2、ResNet

ResNet(Residual Network) [3] 是2015年ImageNet 图像分类、图像物体定位和图像物体检测比赛的冠军。针对随着网络训练加深导致准确度下降的问题,ResNet提出了残差学习方法来减轻训练深层网络的困难。在已有设计思路(BN, 小卷积核, 全卷积网络)的基础上,引入了残差模块。每个残差模块包含两条路径,其中一条路径是输入特征的直连通路,另一条路径对该特征做两到三次卷积操作得到该特征的残差,最后再将两条路径上的特征相加。

残差模块如图7所示,左边是基本模块连接方式,由两个输出通道数相同的3x3卷积组成。右边是瓶颈模块(Bottleneck)连接方式,之所以称为瓶颈,是因为上面的1x1卷积用来 降维(图示例即256->64),下面的1x1卷积用来升维(图示例即64->256),这样中间3x3卷积的输入和输出通道数都较小(图示例即64->64)。

图7. 残差模块

3、数据准备

由于ImageNet数据集较大,下载和训练较慢,为了方便大家学习,我们使用CIFAR10数据集。CIFAR10数据集包含60,000张32x32的彩色图片,10个类别,每个类包含6,000张。其中50,000张图片作为训练集,10000张作为测试集。图11从每个类别中随机抽取了10张图片,展示了所有的类别。

图11. CIFAR10数据集[6]

Paddle API提供了自动加载cifar数据集模块paddle.dataset.cifar。

通过输入python train.py,就可以开始训练模型了,以下小节将详细介绍train.py的相关内容。

模型结构

1、Paddle 初始化

让我们从导入Paddle Fluid API 和辅助模块开始。

from __future__ import print_function
import os
import paddle
import paddle.fluidas fluid
import numpy
import sys
from vgg import vgg_bn_drop
from resnet import resnet_cifar10

本教程中我们提供了VGG和ResNet两个模型的配置。

2、VGG

首先介绍 VGG模型结构,由于CIFAR10图片大小和数量相比ImageNet数据小很多,因此这里的模型针对CIFAR10数据做了一定的适配。卷积部分引入了BN和 Dropout操作。 VGG核心模块的输入是数据层,vgg_bn_drop定义了16层 VGG结构,每层卷积后面引入BN层和 Dropout层,详细的定义如下:

def vgg_bn_drop(input):
 def conv_block(ipt, num_filter, groups, dropouts):
 return fluid.nets.img_conv_group(
 input=ipt,
 pool_size=2,
 pool_stride=2,
 conv_num_filter=[num_filter] * groups,
 conv_filter_size=3,
 conv_act='relu',
 conv_with_batchnorm=True,
 conv_batchnorm_drop_rate=dropouts,
 pool_type='max')
 conv1= conv_block(input, 64, 2, [0.3, 0])
 conv2= conv_block(conv1, 128, 2, [0.4, 0])
 conv3= conv_block(conv2, 256, 3, [0.4, 0.4, 0])
 conv4= conv_block(conv3, 512, 3, [0.4, 0.4, 0])
 conv5= conv_block(conv4, 512, 3, [0.4, 0.4, 0])
 drop= fluid.layers.dropout(x=conv5, dropout_prob=0.5)
 fc1= fluid.layers.fc(input=drop, size=512, act=None)
 bn= fluid.layers.batch_norm(input=fc1, act='relu')
 drop2= fluid.layers.dropout(x=bn, dropout_prob=0.5)
 fc2= fluid.layers.fc(input=drop2, size=512, act=None)
 predict= fluid.layers.fc(input=fc2, size=10, act='softmax')
 return predict

首先定义了一组卷积网络,即conv_block。卷积核大小为3x3, 池化窗口大小为2x2,窗口滑动大小为2,groups决定每组 VGG模块是几次连续的卷积操作,dropouts指定 Dropout操作的概率。所使用的img_conv_group是在paddle.fluit.net中预定义的模块,由若干组Conv->BN->ReLu-> Dropout 和一组Pooling 组成。

五组卷积操作,即5个conv_block。第一、二组采用两次连续的卷积操作。第三、四、五组采用三次连续的卷积操作。每组最后一个卷积后面 Dropout概率为0,即不使用 Dropout操作。

最后接两层512维的全连接。

在这里, VGG网络首先提取高层特征,随后在全连接层中将其 映射到和类别维度大小一致的向量上,最后通过Softmax方法计算图片划为每个类别的概率。

3、ResNet

ResNet模型的第1、3、4步和 VGG模型相同,这里不再介绍。主要介绍第2步即CIFAR10数据集上ResNet核心模块。

先介绍resnet_cifar10中的一些基本函数,再介绍网络连接过程。

•   conv_bn_layer: 带BN的卷积层。

•   shortcut: 残差模块的"直连"路径,"直连"实际分两种形式:残差模块输入和输出特征通道数不等时,采用1x1卷积的升维操作;残差模块输入和输出通道相等时,采用直连操作。

•   basicblock: 一个基础残差模块,即图9左边所示,由两组3x3卷积组成的路径和一条"直连"路径组成。

•   layer_warp: 一组残差模块,由若干个残差模块堆积而成。每组中第一个残差模块滑动窗口大小与其他可以不同,以用来减少特征图在垂直和水平方向的大小。

def conv_bn_layer(input,
 ch_out,
 filter_size,
 stride,
 padding,
 act='relu',
 bias_attr=False):
 tmp= fluid.layers.conv2d(
 input=input,
 filter_size=filter_size,
 num_filters=ch_out,
 stride=stride,
 padding=padding,
 act=None,
 bias_attr=bias_attr)
 return fluid.layers.batch_norm(input=tmp, act=act)
def shortcut(input, ch_in, ch_out, stride):
 if ch_in!= ch_out:
 return conv_bn_layer(input, ch_out, 1, stride, 0, None)
 else:
 return input
def basicblock(input, ch_in, ch_out, stride):
 tmp= conv_bn_layer(input, ch_out, 3, stride, 1)
 tmp= conv_bn_layer(tmp, ch_out, 3, 1, 1, act=None, bias_attr=True)
 short= shortcut(input, ch_in, ch_out, stride)
 return fluid.layers.elementwise_add(x=tmp, y=short, act='relu')
def layer_warp(block_func, input, ch_in, ch_out, count, stride):
 tmp= block_func(input, ch_in, ch_out, stride)
 for iin range(1, count):
 tmp= block_func(tmp, ch_out, ch_out, 1)
 return tmp

resnet_cifar10的连接结构主要有以下几个过程。

底层输入连接一层conv_bn_layer,即带BN的卷积层。

然后连接3组残差模块即下面配置3组layer_warp,每组采用图10 左边残差模块组成。

最后对网络做均值 池化并返回该层。

注意:除第一层卷积层和最后一层全连接层之外,要求三组layer_warp总的含参层数能够被6整除,即resnet_cifar10的depth 要满足(depth - 2) % 6 = 0

def resnet_cifar10(ipt, depth=32):
 # depth should be one of 20, 32, 44, 56, 110, 1202
 assert (depth- 2) % 6== 0
 n= (depth- 2) // 6
 nStages= {16, 64, 128}
 conv1= conv_bn_layer(ipt, ch_out=16, filter_size=3, stride=1, padding=1)
 res1= layer_warp(basicblock, conv1, 16, 16, n, 1)
 res2= layer_warp(basicblock, res1, 16, 32, n, 2)
 res3= layer_warp(basicblock, res2, 32, 64, n, 2)
 pool= fluid.layers.pool2d(
 input=res3, pool_size=8, pool_type='avg', pool_stride=1)
 predict= fluid.layers.fc(input=pool, size=10, act='softmax')
 return predict

4、Infererence配置

网络输入定义为data_layer(数据层),在 图像分类中即为图像像素信息。CIFRAR10是RGB 3通道32x32大小的彩色图,因此输入数据大小为3072(3x32x32)。

def inference_network():
 # The image is 32 * 32 with RGB representation.
 data_shape = [3, 32, 32]
 images = fluid.layers.data(name='pixel', shape=data_shape, dtype='float32')
 predict = resnet_cifar10(images, 32)
 # predict = vgg_bn_drop(images) # un-comment to use vgg net
return predict    

5、Train 配置

然后我们需要设置训练程序train_network。它首先从推理程序中进行预测。在训练期间,它将从预测中计算avg_cost。在有监督训练中需要输入图像对应的类别信息,同样通过fluid.layers.data来定义。训练中采用多类 交叉熵作为 损失函数,并作为网络的输出,预测阶段定义网络的输出为分类器得到的概率信息。

注意:训练程序应该返回一个数组,第一个返回 参数必须是avg_cost。训练器使用它来计算梯度。

def train_network(predict):
 label = fluid.layers.data(name='label', shape=[1], dtype='int64')
 cost = fluid.layers.cross_entropy(input=predict, label=label)
 avg_cost = fluid.layers.mean(cost)
 accuracy = fluid.layers.accuracy(input=predict, label=label)
return [avg_cost, accuracy]

6、Optimizer 配置

在下面的Adam optimizer,learning_rate是 学习率,与网络的训练 收敛速度有关系。

def optimizer_program():
 return fluid.optimizer.Adam(learning_rate=0.001)

7、训练模型

1)Data Feeders 配置

cifar.train10()每次产生一条样本,在完成shuffle和batch之后,作为训练的输入。

# Each batch will yield 128 images
BATCH_SIZE= 128
# Reader for training
 train_reader = paddle.batch(
 paddle.reader.shuffle(
 paddle.dataset.cifar.train10(), buf_size=128 * 100),
 batch_size=BATCH_SIZE)
# Reader for testing. A separated data set for testing.
 test_reader = paddle.batch(
 paddle.dataset.cifar.test10(), batch_size=BATCH_SIZE)

2)Trainer 程序的实现

我们需要为训练过程制定一个main_program, 同样的,还需要为测试程序配置一个test_program。定义训练的place,并使用先前定义的 优化器

place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
 feed_order = ['pixel', 'label']
 main_program = fluid.default_main_program()
 star_program = fluid.default_startup_program()
 predict = inference_network()
avg_cost, acc = train_network(predict)
# Test program
 test_program = main_program.clone(for_test=True)
 optimizer = optimizer_program()
 optimizer.minimize(avg_cost)
 exe = fluid.Executor(place)
 EPOCH_NUM = 1
# For training test cost
 def train_test(program, reader):
 count = 0
 feed_var_list = [
 program.global_block().var(var_name) for var_name in feed_order
 ]
 feeder_test = fluid.DataFeeder(feed_list=feed_var_list, place=place)
 test_exe = fluid.Executor(place)
 accumulated = len([avg_cost, acc]) * [0]
 for tid, test_data in enumerate(reader()):
 avg_cost_np = test_exe.run(
 program=program,
 feed=feeder_test.feed(test_data),
 fetch_list=[avg_cost, acc])
 accumulated = [
 x[0] + x[1][0] for x in zip(accumulated, avg_cost_np)
 ]
 count += 1
 return [x / count for x in accumulated]

3)训练主循环以及过程输出

在接下来的主训练循环中,我们将通过输出来来观察训练过程,或进行测试等。

# main train loop.
 def train_loop():
 feed_var_list_loop = [
 main_program.global_block().var(var_name) for var_name in feed_order
 ]
 feeder = fluid.DataFeeder(feed_list=feed_var_list_loop, place=place)
 exe.run(star_program)
 step = 0
 for pass_id in range(EPOCH_NUM):
 for step_id, data_train in enumerate(train_reader()):
 avg_loss_value = exe.run(
 main_program,
 feed=feeder.feed(data_train),
 fetch_list=[avg_cost, acc])
 if step_id % 100 == 0:
 print("
Pass %d, Batch %d, Cost %f, Acc %f" % (
 step_id, pass_id, avg_loss_value[0], avg_loss_value[1]))
 else:
 sys.stdout.write('.')
 sys.stdout.flush()
 step += 1
 avg_cost_test, accuracy_test = train_test(
 test_program, reader=test_reader)
 print('
Test with Pass {0}, Loss {1:2.2}, Acc {2:2.2}'.format(
 pass_id, avg_cost_test, accuracy_test))
 if params_dirname is not None:
 fluid.io.save_inference_model(params_dirname, ["pixel"],
 [predict], exe)
train_loop()

4)训练

通过trainer_loop函数训练, 这里我们只进行了2个Epoch, 一般我们在实际应用上会执行上百个以上Epoch

注意:CPU,每个Epoch 将花费大约15~20分钟。这部分可能需要一段时间。请随意修改代码,在GPU上运行测试,以提高训练速度。

train_loop()

一轮训练log示例如下所示,经过1个pass,训练集上平均Accuracy 为0.59 ,测试集上平均Accuracy 为0.6 。

Pass 0, Batch 0, Cost 3.869598, Acc 0.164062

...................................................................................................

Pass 100, Batch 0, Cost 1.481038, Acc 0.460938

...................................................................................................

Pass 200, Batch 0, Cost 1.340323, Acc 0.523438

...................................................................................................

Pass 300, Batch 0, Cost 1.223424, Acc 0.593750

..........................................................................................

Test with Pass 0, Loss 1.1, Acc 0.6

图13是训练的分类错误率曲线图,运行到第200个pass后基本 收敛,最终得到测试集上分类错误率为8.54%。

图13. CIFAR10数据集上 VGG模型的分类错误率

应用模型

可以使用训练好的模型对图片进行分类,下面程序展示了如何加载已经训练好的网络和 参数进行推断。

1、生成预测输入数据

dog.png是一张小狗的图片. 我们将它转换成numpy数组以满足feeder的格式.

from PIL import Image
 def load_image(infer_file):
 im = Image.open(infer_file)
 im = im.resize((32, 32), Image.ANTIALIAS)
 im = numpy.array(im).astype(numpy.float32)
 # The storage order of the loaded image is W(width),
 # H(height), C(channel). PaddlePaddle requires
 # the CHW order, so transpose them.
 im = im.transpose((2, 0, 1)) # CHW
 im = im / 255.0
 # Add one dimension to mimic the list format.
 im = numpy.expand_dims(im, axis=0)
 return im
 cur_dir = os.path.dirname(os.path.realpath(__file__))
 img = load_image(cur_dir + '/image/dog.png')

2、Inferencer 配置和预测

与训练过程类似,inferencer需要构建相应的过程。我们从params_dirname加载网络和经过训练的 参数。我们可以简单地插入前面定义的推理程序。现在我们准备做预测。

place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
 exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
 with fluid.scope_guard(inference_scope):
 # Use fluid.io.load_inference_model to obtain the inference program desc,
 # the feed_target_names (the names of variables that will be feeded
 # data using feed operators), and the fetch_targets (variables that
 # we want to obtain data from using fetch operators).
 [inference_program, feed_target_names,
 fetch_targets] = fluid.io.load_inference_model(params_dirname, exe)
 # The input's dimension of conv should be 4-D or 5-D.
 # Use inference_transpiler to speedup
 inference_transpiler_program = inference_program.clone()
 t = fluid.transpiler.InferenceTranspiler()
 t.transpile(inference_transpiler_program, place)
 # Construct feed as a dictionary of {feed_target_name: feed_target_data}
 # and results will contain a list of data corresponding to fetch_targets.
 results = exe.run(
 inference_program,
 feed={feed_target_names[0]: img},
 fetch_list=fetch_targets)
 transpiler_results = exe.run(
 inference_transpiler_program,
 feed={feed_target_names[0]: img},
 fetch_list=fetch_targets)
 assert len(results[0]) == len(transpiler_results[0])
 for i in range(len(results[0])):
 numpy.testing.assert_almost_equal(
 results[0][i], transpiler_results[0][i], decimal=5)
 # infer label
 label_list = [
 "airplane", "automobile", "bird", "cat", "deer", "dog", "frog",
 "horse", "ship", "truck"
 ]
 print("infer results: %s" % label_list[numpy.argmax(results[0])])

总结

传统 图像分类方法由多个阶段构成,框架较为复杂,而端到端的CNN模型结构可一步到位,而且大幅度提升了分类 准确率。本文我们首先介绍 VGG、ResNet两个经典的模型;然后基于CIFAR10数据集,介绍如何使用PaddlePaddle配置和训练CNN模型;最后介绍如何使用PaddlePaddle的API接口对图片进行预测和特征提取。对于其他数据集比如ImageNet,配置和训练流程是同样的。请参照Github

https://github.com/PaddlePaddle/models/blob/develop/PaddleCV/image_classification/README_cn.md。

参考文献

[1] G.E. Hinton, N. Srivastava, A. Krizhevsky, I. Sutskever, and R.R. Salakhutdinov. Improving neural networks by preventing co-adaptation of feature detectors. arXiv preprint arXiv:1207.0580, 2012.

[2] K. Chatfield, K. Simonyan, A. Vedaldi, A. Zisserman. Return of the Devil in the Details: Delving Deep into Convolutional Nets. BMVC, 2014。

[3] K. He, X. Zhang, S. Ren, J. Sun. Deep Residual Learning for Image Recognition. CVPR 2016.

[4] He, K., Zhang, X., Ren, S., and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. ArXiv e-prints, February 2015.

[5] http://deeplearning.net/tutorial/lenet.html

[6] https://www.cs.toronto.edu/~kriz/cifar.html

[7] http://cs231n.github.io/classification/

PaddlePaddle
PaddlePaddle

PaddlePaddle是百度独立研发的深度学习平台,易用,高效,灵活可伸缩,可支持海量图像识别分类、机器翻译和自动驾驶等多个领域业务需求,现已全面开源。

工程图像分类PaddlePaddle百度
3
相关数据
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

图像分割技术

图像分割就是把图像分成若干个特定的、具有独特性质的区域并提出感兴趣目标的技术和过程。它是由图像处理到图像分析的关键步骤。现有的图像分割方法主要分以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法以及基于特定理论的分割方法等。从数学角度来看,图像分割是将数字图像划分成互不相交的区域的过程。图像分割的过程也是一个标记过程,即把属于同一区域的像索赋予相同的编号。

全卷积网络技术

全卷积网络最开始在论文 Fully Convolutional Networks for Semantic Segmentation(2015)中提出,它将传统卷积神经网络最后几个全连接层替换为卷积层。引入全卷积的意义在于它能实现密集型的预测,即在二维卷积下对图像实现像素级的分类,在一维卷积下对序列实现元素级的预测。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

交叉熵技术

交叉熵(Cross Entropy)是Loss函数的一种(也称为损失函数或代价函数),用于描述模型预测值与真实值的差距大小

Dropout技术

神经网络训练中防止过拟合的一种技术

VGG技术

2014年,牛津大学提出了另一种深度卷积网络VGG-Net,它相比于AlexNet有更小的卷积核和更深的层级。AlexNet前面几层用了11×11和5×5的卷积核以在图像上获取更大的感受野,而VGG采用更小的卷积核与更深的网络提升参数效率。VGG-Net 的泛化性能较好,常用于图像特征的抽取目标检测候选框生成等。VGG最大的问题就在于参数数量,VGG-19基本上是参数量最多的卷积网络架构。VGG-Net的参数主要出现在后面两个全连接层,每一层都有4096个神经元,可想而至这之间的参数会有多么庞大。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

学习率技术

在使用不同优化器(例如随机梯度下降,Adam)神经网络相关训练中,学习速率作为一个超参数控制了权重更新的幅度,以及训练的速度和精度。学习速率太大容易导致目标(代价)函数波动较大从而难以找到最优,而弱学习速率设置太小,则会导致收敛过慢耗时太长

损失函数技术

在数学优化,统计学,计量经济学,决策理论,机器学习和计算神经科学等领域,损失函数或成本函数是将一或多个变量的一个事件或值映射为可以直观地表示某种与之相关“成本”的实数的函数。

降采样技术

降采样是数位信号处理领域中的一种多速频数字信号处理(multi-rate digital signal processing)系统中采样率转换(sample rate conversion)技术的一种,或指代用来降低信号采样率的过程,与插值相反——插值用来增加取样频率——降采样通常用于降低数据传输速率或者数据大小。因为降采样会有混叠的情形发生,系统中具有降采样功能的部分称为降频器(decimator)。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

过拟合技术

过拟合是指为了得到一致假设而使假设变得过度严格。避免过拟合是分类器设计中的一个核心任务。通常采用增大数据量和测试样本集的方法对分类器性能进行评价。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

降维技术

降维算法是将 p+1 个系数的问题简化为 M+1 个系数的问题,其中 M<p。算法执行包括计算变量的 M 个不同线性组合或投射(projection)。然后这 M 个投射作为预测器通过最小二乘法拟合一个线性回归模型。两个主要的方法是主成分回归(principal component regression)和偏最小二乘法(partial least squares)。

图像处理技术

图像处理是指对图像进行分析、加工和处理,使其满足视觉、心理或其他要求的技术。 图像处理是信号处理在图像领域上的一个应用。 目前大多数的图像均是以数字形式存储,因而图像处理很多情况下指数字图像处理。

图像分类技术

图像分类,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。

优化器技术

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

推荐文章
暂无评论
暂无评论~