2018-12-22 00:11:17 u011240016 阅读数 1642

内容大纲

  • 分类和回归之外的机器学习形式
  • 评估机器学习模型的规范流程
  • 为深度学习准备数据
  • 特征工程
  • 解决过拟合问题
  • 处理机器学习问题的通用流程

监督学习的主要种类及其变种

主要包括两大类问题:

  • 分类
  • 回归

变种问题主要有:

  • 序列生成:给定一张图像,输出描述图像的文字;可以被重新表示为分类问题
  • 语法树预测:给定一个句子,输出其分解生成的语法树
  • 目标检测:给定一张图像,在图中的目标周围绘制一个边界框;可以被表示为分类问题,或者分类与回归联合问题
  • 图像分割:给定图像,在特定的物体上画一个像素级别的mask

无监督学习

不给定目标值,模型需要从输入数据中寻找到有价值的变换,常常用来做数据可视化,数据压缩,数据去噪或者辅助我们更好理解数据中的相关性等。

无监督学习是数据分析的必备技能。

为了更好的理解数据集,无监督学习是一个必要步骤。比如降维和聚类分析方法。

自监督学习

这个是监督学习的一个特例。它的特殊之处在于没有人工标注的标签,但是标签仍然存在,而这些标签是如何生成的呢?它们来自输入数据,常常用启发式算法来生成。

强化学习

智能体接收有关环境的信息,并学会选择使得奖励函数最大化的动作。

部分术语解析

  • 二分类:每个输入样本被划分到两个互斥的类别之一
  • 多分类:每个输入样本被划分到两个以上的类别之一,如手写体数字分类
  • 多标签分类:每个输入样本都可以被划分到多个标签,如图像标注任务
  • 标量回归:输出一个标量,连续值
  • 向量回归:输出一组连续值的任务,比如输出图像中物体的边界框
  • 小批量,批量:模型同时处理的一部分样本,通常取2的幂,便于GPU分配内存

模型评估

训练集,验证集和测试集

三者的具体分工是:在训练集上训练模型,在验证集上评估模型以及在测试集上最后测试。

在验证集上可以调节超参数,比如前面训练时,我们用验证集上的效果来得出训练多少轮次合适,这就是超参数选择的过程。调节模型时,是万万不能用到测试集的,测试集就像最后的高考,验证集则是月考,训练集则是我们平时的作业。

三种经典的评估方法

  • 留出验证
  • K折验证
  • 含打乱数据的重复验证

留出验证

即留出一定比例的数据作为测试集,为了调节模型我们还需要从训练集中拿出一部分数据做验证集。

在这里插入图片描述

这个图只表达了划分出两部分数据,训练集里还要再细分出一部分数据做验证,本质上,验证集也是训练调节模型,大类仍可归于训练集。

num_validation_samples = 10000
np.random.shuffle(data) # 打乱数据
validation_data = data[:num_validation_samples] # 验证集
train_data = data[num_validation_samples:]

model = build_model()
model.fit(train_data, train_targets)
validation_score = model.evaluate(validation_data) # 验证集上评估模型并得出最优超参数

# 找到最优超参数,重新训练
model = build_model()
model.fit(np.concatenate([train_data, validation_data], train_targets)
test_score = model.evaluate(test_data) 

在知晓超参数以后,重新训练模型时,验证集数据也作为训练集数据,这样可以更好的训练模型。

这个验证方法不适用于样本数据量较少的情况。

K折验证

在这里插入图片描述

这个一图就说明白了,但还是需要特别强调一下,这里的数据确定后是个整体,当然之前可以先打乱使得分布均匀。然后砍成一段一段的,拼在一起就是完整的数据集。之所以这么强调,是为了和下面的打乱随机K折验证区分一下。

k = 3
num_validation_samples = len(data) // k

np.random.shuffle(data)
validation_scores = [] # 每一折得出一个验证分数
for fold in range(k):
    validation_data= data[num_validation_samples * fold: num_validation_samples * (fold + 1)]
    train_data = data[:num_validation_samples * fold] + data[num_validation_samples * (fold + 1):]
    
    model = build_model()
    model.fit(train_data)
    validation_score = model.evaluate(validation_data)
    validation_scores.append(validation_score)
    
validation_score = np.average(validation_scores)

model = build_model()
model.fit(data)
test_score = model.evaluate(test_data) 

包含打乱数据的重复K折验证

一句话描述就是,多次使用上面的K折验证,每次都打乱数据一下。假设重复P次,那么需要训练和评估的模型个数是PxK个,这种做法代价很大,但是效果很好,在Kaggle比赛里很有用。

评估模型的注意事项

数据代表性

将数据随机打乱,可以使得训练集和测试集都能代表当前数据。

时间箭头

如果是用过去数据来预测未来,则不能随机打乱数据,否则会导致时间泄露问题。

数据冗余

我们需要保证训练集和验证集之间不存在交集。

数据预处理,特征工程,特征学习

在具体使用模型之前,需要耗费很大精力来处理数据。

数据预处理

针对神经网络,我们将数据处理得更加适用于神经网络处理。主要包括如下几种方法:

  • 向量化
  • 标准化
  • 缺失值处理
  • 特征提取

特征工程

通常机器学习模型无法从完全任意的数据中学习。所以我们需要利用先验知识对数据进行编码转换,以改善模型的效果。

特征工程的本质是:用更简单的方式表述问题,使得问题更加容易解决。这需要我们深入理解问题。

现代深度学习,大部分特征工程是不需要的。神经网络可以从原始数据中自动提取有用特征。但是并不表示深度神经网络不需要特征工程。使用特征工程,一方面可以用更少的资源解决问题,另一方面,定义良好的特征可以更少的数据解决问题。样本很少时,恰当的特征工程价值极大。

处理过拟合和欠拟合问题

欠拟合表示模型仍有改进的空间,还需要继续训练,所以这个问题不大,更需要特别设计解决的是过拟合问题。降低过拟合的方法叫作正则化。常用的正则化的方法有:

  • 减小网络大小
  • 添加权重正则化
    • L1
    • L2
  • 添加dropout正则化

减小网络大小

这是防止过拟合的最简单的方法,通过减少模型的学习参数个数。

**模型容量:**可学习参数的个数。

深度学习模型通常都很擅长拟合训练数据,但是真正的挑战在于泛化,而不是拟合。

更大的网络的训练损失容易很快就接近0,即网络的容量越大,则拟合数据的速度就越快,也就容易过拟合。

添加权重正则化

from keras import regularizers

model = models.Sequential()
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu'))
model.add(layers.Dense(1, kernel_regularizer=regularizers.l2(0.001), activation='relu'))

其中,l2(0.001)的意思是:该层权重矩阵的每个系数都会使网络总损失增加0.001 * weight_coefficient_calue,惩罚项只在训练时添加,测试时不计算,所以训练损失会大于测试损失。

添加dropout正则

这是训练神经网络最有效也最常用的方法。对某一层使用dropout,会在训练过程中随机将该层的一些输出特征置为0。设置的dropout比率是元素被设置为0的比例。测试时没有单元会被舍弃。

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))

深度学习流程

这部分再单独写一篇笔记,之前也写过一次。

END.

参考:

《Deep Learning with Python》

2018-10-13 23:31:28 dss875914213 阅读数 117

主要内容:

  1. 机器学习形式
  2. 评估机器学习模型的规范流程
  3. 为深度学习准备数据
  4. 特征工程
  5. 解决过拟合
  6. 处理机器学习问题的通过流程

机器学习核心难题:过拟合


4.1  机器学习的四个分支

  1. 监督学习:分类、回归、序列生成(sequence generation)、语法树预测(syntax tree prediction)、目标预测(object detection)、图像分割(image segmentation)
  2. 无监督学习:降维(dimensionality reduction)、聚类(clustering)
  3. 自监督学习:自编码器(autoencoder)
  4. 强化学习:选择使奖励最大化的行动

相关术语:

样本(sample)或输入(input)

预测(predict)或输出(output)

目标(target)

预测误差(prediction error)

类别(class)

标签(label)

真值(ground-truth)或标注(annotation)

二分类(binary classification)

多分类(multiclass classification)

多标签分类(multilabel classification)

标量回归(scalar regression)

向量回归(vector regression)

小批量(mini-batch)或批量(batch):通常是2的幂次。8~128


4.2  评估机器学习模型

机器学习目的:得到好的泛化(generalize)模型

4.2.1  训练集、验证集和测试集

验证模型时,有可能会发生消息泄露(information leak)

评估方法:

  1. 简单的留出验证(hold-out validation)
  2. K折验证(K-fold validation)
  3. 带打乱数据的重复K折验证(iterated K-fold validation with shuffling)

4.2.2  评估模型的注意事项

  1. 数据代表性(data representativeness):随机打乱数据
  2. 时间箭头(the arrow of time):预测与时间相关,不能随机打乱;且确保测试集数据晚于训练集数据
  3. 数据冗余(redundancy in your data):确保训练集和数据集没有交集

4.3  数据预处理、特征工程和特征学习

4.3.1  神经网络的数据预处理

预处理目的:使原始数据更适合于神经网络处理,向量化、标准化、处理缺失值和特征处理

  1. 向量化:输入和预测值必须是浮点数张量。数据向量化(data vectorization)
  2. 值标准化:取值较小,同质化(homogeneous)平均值为0,标准差为1。   x-=x.mean(axis=0)   x/=x.std(axis=0)
  3. 处理缺失值:缺失值设为0,让网络学到,0意味着缺失值。当测试集有缺失值,而训练集没有时,要手动给训练集加缺失值。

4.3.2  特征工程(feature engineering)

特征工程:将数据输入模型前,利用人对数据的认识,先对数据进行处理。

本质:更简单的方式表述问题,是问题变得简单。

例:钟表识别

良好的特征可以用较少的资源解决问题。


4.4  过拟合与欠拟合

优化(optimization)

泛化(generalization)

4.4.1  减小网络大小

4.4.2  添加权重正则化

奥卡姆剃刀(Occam/s razor)

成本(cost)

L1正则化:系数绝对值

L2正则化:系数平方

惩罚只在训练时有,所以测试误差会小很多。

4.4.3  添加dropout正则化

训练过程中随机把改层输出特征舍弃

dropout比率:通常0.2~0.5

测试时没有单元舍弃,层输出需要按dropout比率缩小。

 

防止过拟合:

  1. 更多数据
  2. 减小网络容量
  3. 添加正则化
  4. 添加dropout

4.5  机器学习的通用工作流程

4.5.1  定义问题,收集数据集

假设:

  1. 输出可由输入进行预测
  2. 数据包含足够信息,能够学习输入和输出的关系

非平稳问题(nonstationary problem):如随季节变化问题

4.5.2  选择衡量成功的指标

平衡分类问题:精度和接受者操作特征曲线下面积(area under the receiver operating characteristic curve,ROC AUC)

非平衡分类问题:准确率和召回率

排序和多标签分类:平均准确率均值(mean average precision)

4.5.3  选择评估方法

  1. 简单的留出验证(hold-out validation):数据量大
  2. K折验证(K-fold validation):数据量小,无法保证准确性
  3. 带打乱数据的重复K折验证(iterated K-fold validation with shuffling):数据量小,准确性要求高

4.5.4  准备数据

张量

较小值,[-1,1],[0,1]

标准化

缺失值

特征工程

4.5.5  开发比基准好的模型

统计功效(statistical power)

纯随机基准(dumb baseline)

  1. 最后一层的激活
  2. 损失函数
  3. 优化配置

ROC AUC不可直接优化,用交叉熵替代。两者成逆相关。

问题类型 最后一层激活函数 损失函数
二分类 sigmoid binary_rossentropy
多分类、单标签 softmax catrgorical_crossentropy
多分类、多标签 sigmoid binary_crossentropy
回归 mse
回归,0~1取值 sigmoid mse或binary_crossentropy

4.5.6  扩大模型规模:开发过拟合的模型

使模型过拟合:

  1. 添加更多层
  2. 让每一层变得更大
  3. 训练更多轮次

4.5.7  模型正则化与调节超参数

  1. 添加dropout
  2. 尝试不同的架构:增加或减少层数
  3. 添加L1和L2正则化
  4. 尝试不同的超参数
  5. 做特征工程

 

2019-10-17 16:32:05 weixin_43056275 阅读数 6

课堂学习笔记

  • 传统机器学习
    • 数据预处理–归一化、降维、去躁
    • 特征提取–图像:SIFT、LBP、Fisher,语言:Word2vec、MFCC
    • 选择分类器–SVM、决策树、随机森林、贝叶斯网络、线性回归、聚类
  • 深度机器学习
    • 数据准备–数据、label
    • 设计模型–CNN、RNN
    • 训练–调结构、损失函数、训练参数
  • 基本概念
    • y=WX+by = W*X+b
    • 神经元:模型的基本单位
    • 卷积核:图像处理基本算子
    • 分类
    • 回归
2017-02-21 10:04:01 heyc861221 阅读数 7176

上周 TensorFlow 1.0 的发布使之成为最有前景的深度学习框架,也在中国 AI 社区中掀起了学习 TensorFlow 的热潮,不过光跑例子怎能脱颖而出?本文是数据科学公司(Silicon Valley Data Science)的数据工程师 Matt Rubashkin 的一篇实战派文章,介绍了他如何创造性的将深度学习与物联网结合起来解决一个实际问题的思路和过程,非常具有启发性。

SVDS(Silicon Valley Data Science)曾使用过实时、公开的数据来优化对加州火车到达时间的预测。但是,加州火车的到站时间数据不可靠,因此难以准确预测。我们使用 Raspberry Pi 摄像头和 USB 麦克风,能够侦测到火车的经过及其速度和方向。当在 Mountain View 办公室里装配了一台新的 Raspberry Pi 时,我们遇到了一个棘手的问题:Pi 不单单侦测到了加州火车(true positive),也侦测到了太平洋联合货运的火车和 VTA 轻轨(false positive)。为了确保侦测到的是加州火车的延迟,我们不得不对不同的火车做个靠谱的分类。

图片描述

视频:https://youtu.be/n0lCPXzaxTg

传统的背景图像分类技术是远远不够的,因为我们在整个加州火车系统的铁轨上——包括不同的距离,不同的方向,不同的高度——放满了 Raspberry Pi。而且我们的操作时间也很有限,没有足够的时间来为系统里每一个 RaspberryPi 手动选择模式和特征。

用 TensorFlow 解围

幸好是在2016年遇到这个图像分类问题,因为在这一年里很多深度学习相关的图像识别技术的代码被公开了。我们选择使用 Google 的 TensorFlow 卷积神经网络,因为它有简单易用的 Python 库和丰富的在线文档。我拜读过 Pete Warden 关于 TensorFlow 的博客——TensorFlow for Poets(https://codelabs.developers.google.com/codelabs/tensorflow-for-poets/#0),这篇博客里介绍了如何在高性能的 Inception V3 模型上创建定制化图像分类器。而且,我可以用我的笔记本电脑来对这个新模型的增强版通宵进行训练。这样就不需要很贵的 GPU(显卡),也可以在未来对模型进行微调,非常有用。

我是从 TensorFlow 教程页面中花的识别教程开始的。我使用命令行接口来分类数据集中的图片,也包括 Van Gough 的向日葵这样的定制图片。

图片描述

图像中的名称,从上到下依次雏菊,向日葵,蒲公英,郁金香,玫瑰。

现在我有了用 TensorFlow 来创建图像分类器的经验,便希望建立一个稳健无偏的图像识别模型用来识别火车。虽然之前 Raspberry Pi 拍摄到的图片可以用于训练模型,但我还是选择了更大更多样的数据集。我也将小汽车和卡车包括进模型中,因为他们也可能在某些位置上经过 Raspberry Pi 的侦测点。为了得到这个汽车分类器的训练数据集,我用 Google 找了1000张图片,含:

  • 加州火车
  • 货运火车
  • 轻轨
  • 卡车
  • 小汽车

测试及配置模型

对模型训练了一个通宵,第二天一早,我回到办公桌来查看模型运行得怎么样。首先我测试了不包含在训练集里图片,并惊奇的发现,分类器似乎一直可以挑出正确的分类。这里面包括从 Google 上找到的训练集的图片,也包括从 Raspberry Pi 采集到的图片。

图片描述

图片中的名称,从上到下依次是:加州火车,运输火车,轻轨,汽车,卡车。

我在 Raspberry Pi 上运行图片分类器,来保证这套设备用户是可以支付得起的。此外,由于不能保证网络连接的速度,我必须直接在设备上运行分类器以避免把图片发送到中心服务器所造成的延迟。

Raspberry Pi3 马力(功率)充足,可以直接在设备上进行流处理,因此我们只需要用网络发送小容量的,处理过的数据流,并且这套设备也便宜。这个传感器整体的硬件成本是130美金,所有的代码都是用的开源库。我用 JupyterHub 对其进行了测试,以便控制多个位置上的 Raspberry Pi 设备。有了一个正常运行的车辆分类集,接下来我把模型加载到 Raspberry Pi 上,并在视听流架构下实现了它。

图片描述

为了能够在 Raspberry Pi 32Bit ARM芯片上编译,我使用的是来自SamAbraham 的 Pi-TensorFlow enthusiasts 小社区的指引(https://github.com/samjabrahams/tensorflow-on-raspberry-pi),同时也与 Pete Warden,Google 的 TensorFlow 团队进行了沟通。

解决 TensorFlow 在 Raspberry Pi 上出现的问题

虽然有好的文档记录如何在 Android 和其他小型计算设备上安装 TensorFlow,但大多数的例子都是单张图片识别或批处理,而非流媒体图片识别。在Pi上单张图片可以简单稳健地给出分数,如下面这个成功的分类所示:

图片描述

但是,把85MB的模型加载到内存里需要太长的时间了,因此需要把分类器图表加载到内存里。分类器图表加载到内存之后,Raspberry Pi 拥有总计1G的内存,在我们定制的火车侦测 Python 应用中,有足够的计算资源来处理连续运行的摄像头和麦克风。

图片描述

即便如此,用 TensorFlow 分析 PiCamera 拍摄到的每一张图片也是不可行的,因为这样 CPU 的使用率最终将达到100%,导致 Raspberry Pi 系统过热,因此只有运动物体的图片传送给了 Pi 上的图片分类器,并用 TensorFlow 识别不同类型车辆。

结论

如果你对使用物联网设备做实时图像分类感兴趣,请从这里开始:

图片描述


原文: TensorFlow Image Recognition on a Raspberry Pi
作者: Matthew Rubashkin,目前是数据科学公司 Silicon Valley Data Science 的数据工程师,并且是UC Berkeley 博士,拥有光学物理和生物医学研究的背景,并且在软件开发,数据库工程和数据分析方面拥有广泛的经验。
本文来源AI100公众号(rgznai100),授权CSDN发布。
欢迎人工智能领域技术投稿、约稿、给文章纠错,请发送邮件至heyc@csdn.net


图片描述图片描述


SDCC 2017·上海站将于2017年3月17-19日登陆申城,三大技术峰会24位嘉宾,汇聚国内一线的互联网公司大牛,畅谈运维、数据库和架构的热门话题和技术热点,精益运维发起人&优维科技CEO王津银、MongoDB 大中华区首席架构师唐建法和华为软件API开放平台架构师李林锋等亲临现场。3月5日前门票八折优惠中,5人以上团购立减400元,详情点击注册参会

2016-10-09 10:26:20 qqzj_bupt 阅读数 7128

卷积神经网络(CNN)是深度学习在图像处理领域的一个应用。在学习卷积神经网络之前,先了解下它的两个基本思想:

1、局部感受:

一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。网络部分连通的思想,也是受启发于生物学里面的视觉系统结构。视觉皮层的神经元就是局部接受信息的(即这些神经元只响应某些特定区域的刺激)。

局部感受的思想既符合实际生物学里面的视觉系统结构的思想,同时它的一个最大好处是可以降维:

比如一个1000×1000的图像,可以表示为一个1000000的向量,如果隐含层数目与输入层一样,即也是1000000时,那么输入层到隐含层全映射的参数数据为1000000×1000000=10^12。但是,假如隐藏层每个神经元只和10×10个像素值相连,那么权值数据为1000000×100个参数,减少为原来的千分之一。而那10×10个像素值对应的10×10个参数,其实就相当于卷积操作。

卷积神经网络



2、共享权值和偏置:

为进一步降维,还有另一个办法,即权值和偏置共享。在上面的局部连接中,每个神经元都对应100个参数和一个偏置,一共1000000个神经元,如果这1000000个神经元的100个参数和偏置都是相等的,那么参数数目就变为101了。

怎么理解权值共享呢?我们可以这100个参数(也就是卷积操作)看成是提取特征的方式,该方式与位置无关。这其中隐含的原理则是:图像的一部分的统计特性与其他部分是一样的。这也意味着我们在这一部分学习的特征也能用在另一部分上,所以对于这个图像上的所有位置,我们都能使用同样的学习特征。偏置共享的意义与权值共享的意义一样。

更直观一些,当从一个大尺寸图像中随机选取一小块,比如说 8×8 作为样本,并且从这个小块样本中学习到了一些特征,这时我们可以把从这个 8×8 样本中学习到的特征作为探测器,应用到这个图像的任意地方中去。特别是,我们可以用从 8×8 样本中所学习到的特征跟原本的大尺寸图像作卷积,从而对这个大尺寸图像上的任一位置获得一个不同特征的激活值。

如下图所示,展示了一个33的卷积核在55的图像上做卷积的过程。每个卷积都是一种特征提取方式,就像一个筛子,将图像中符合条件(激活值越大越符合条件)的部分筛选出来。

卷积神经网络

3、特征的概念:

如上图展示的一个33的卷积核在55的图像上做卷积的过程,这个33方块对应的参数称为一个卷积核,这个卷积核在原始图像上卷积之后得到的图像称为原始图像在这个卷积核下的一个特征。  更换卷积核的各个参数,就可以得到原始图像各个不同的特征。

如上图中卷积核为,得到原始图像的特征为

假如更换卷积核为,则得到的原始图像特征为,即只获取图像的中间部分。

一般为了充分提取图像特征,我们可以添加多个卷积核,比如32个卷积核,可以学习32种特征。


4、隐藏层的卷积:

假设m-1层隐藏层得到4幅图片,这4幅图片是通过m-2层的4个卷积核生成的,这4幅图片可以看成m-2层图片的4个不同通道。  再假设m-1层通过2个卷积核w1和w2来继续进行卷积,则卷积的方法为:

先将w2忽略,只看w1,那么在w1的卷积特征的某位置(i,j)处的值,是由四个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的,即:

卷积神经网络

同理,用相同的方法可得到w2对应的卷积特征。如下图所示:

卷积神经网络


5、池化

为了降低卷积特征的维度,往往会对卷积后的图片进行降维处理,这个过程成为池化 (pooling)。

池化思想的依据是:我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值 (或最大值)。这些概要统计特征不仅具有低得多的维度 (相比使用所有提取得到的特征),同时还会改善结果(不容易过拟合)。这种聚合的操作就叫做池化 (pooling),有时也称为平均池化或者最大池化 (取决于计算池化的方法)。

卷积神经网络


至此,我们脑海中的卷积神经网络是长成这样的:图像上的每一个像素对应输入层的每个神经元,输入层经过多个卷积核卷积,映射到第一层隐藏层的多个卷积特征,每一个卷积特征经过池化聚合处理,降低维度后,再进一步经过多个卷积核进行卷积,卷积的方法见  隐藏层的卷积 部分,卷积后再进行池化,反复进过若干次卷积和池化,最后隐藏层与输出层全连接。

以上就是卷积神经网络的基本思想。

参考文献:http://www.36dsj.com/archives/24006

图像面试小结

阅读数 82

没有更多推荐了,返回首页