模型实现举一反三
模型实现举一反三
在很长一段时间里,大家都对深度学习模型有所误解,认为模型需要非常大量的数据训练,且只能过训练过的模式起作用——用猫的数据训练就只能识别猫,只有在训练数据中多次出现的模式才能被模型学习和应用,稍有变化,模型就无法正常工作。
实际上随着深度学习模型的发展,这些问题都在逐步改善。现在很多模型学习的不仅是解决具体的问题,比如识别图中的猫或者狗,还可以通过训练学习数据间的关系,在更抽象的层面学习,从而实现了举一反三。另外,随着迁移学习的流行,将海量数据中学到的知识用于只包括少量数据的新场景之中也变成了一种趋势。
本篇介绍几种比较巧妙的方法解决训练集中未出现过的问题。
One-shot 问题
One-shot learning
指需要识别的物体在训练样本中很少出现,甚至在只出现一次的情况下,也能训练模型。Zero-shot
与之类似,即使样本在训练数据中完全没出现过,也能正确识别或分类。
图片搜索是一个 One-shot
问题,比如网购平台上有很多衣服,不可能每一件都放入模型训练,图片搜索的目标是找到与之同款的一种或多种同款商品。同一款衣服自然有很多类似特征,比如颜色,质地,样式 ...
在机器学习中应用数学方法
在机器学习中应用数学方法
我们从初中就开始学习指数和对数,但即使是程序员平时也很少用到这些方法。本篇就来看看如何使用它们解决具体问题。
指数
在多分类问题中,一般在最后一步使用
Softmax,将数值转换成属于各个类别的概率,比如根据输入物品图片,通过一系列处理,判别它是衣服、鞋子、帽子各类别的概率。具体公式如下:
[](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81MzU3ODkzLTE4NTdlMDI0ZDEyOTU5MDAucG5n?x-oss-
process=image/format,png)
其中 i 为某一类别,j 用于遍历所有可能的类别,Si
计算的是某一类别的概率,即某一类别在所有类别中的占比。其中用到了自然指数
e。e 的图型如下:
[](https://imgconvert.csdnimg.cn/aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy81M ...
深度学习资源
深度学习资源
深度学习成为主流是近十年的事,且涉及的知识很多,即使是资深工程师也很难在短时间内学会。学习过程中也有很多弯路,从复习大学数学开始,学习算法原理,工具和框架,看论文,参考别人写的代码,参加大数据比赛。能坚持把以上步骤认真做完已经很难得,但似乎仍然很难建立对深度学习的“直觉”,很难把这些知识融合到自己的架构和代码里,实际应用中看着都眼熟,细看全是盲点,修改结构的时候一改就错,最终成长为“调包侠”。
识字 +
读书≠会写作文,在原理、语法和代码之间似乎有一道沟;从论文、比赛、技术博客之中学到的又往往是琐碎的点,很难连成知识面。
推荐吴恩达老师的《Deep
Learning》线上课程,网易云课堂上有免费课程视频(带中文字幕),课程比较系统,讲解了从线性层的实现到深度学习技巧,再到视觉和自然语言处理等实际的应用。
这门课最大的亮点是:没有太复杂的数学,用直觉代替推导,大家都能听懂;作业难度适中,上课讲原理,下课通过编程实现各种原理,不再是只会调库。作业主要是选择题和程序填空,题量不算小,也不算容易。
比如第一个编程习题:自己写神经网络用于判断图片中是否包含猫,其中涉及优化、前向后向 ...
几种词嵌入方法
几种词嵌入方法
在自然语言处理中常常使用词嵌入。先来看看词嵌入是什么,以及为什么使用词嵌入。
为什么要使用词嵌入
以中文为例,词库中至少包括几千个字,几万个词,将其代入模型时,如果使用
onehot
编码,则变量有成千上万个维度,参数数量和计算量都非常庞大;且无法计算词间的近似性,无法使用“类比”方法将学到的规则泛化到近义词上,也不利于进一步的迁移学习。
词嵌入可将词的特征映射到较低的维度,比如用 200
维特征描述词库中所有的词,使用模型参数更少,训练更快。
词嵌入可视为给每个组一个 n
维的编码,能某一维度可能描述词性,另一维度描述感情色彩;用特征描述取代符号描述,类似于机器视觉中使用深度网络提取图片的基本特征。也便于对比、泛化、以及知识迁移。比如使用大量自然语言数据训练了足够好的词表征,在具体任务中使用少量实例
fine-tune 和 pretrain 训练好的词嵌入数据训练模型。模型对于 fine-tune
训练集中从未出现,但在词嵌入中出现的词也能有很好效果,从而实现知识迁移。
除了作为特征提取器,还可通过词嵌入实现运算,比如:男 - 女=国王 -
王后,因此可通过国王 - ...
RNN循环神经网络公式总结
RNN 循环神经网络公式总结
RNN 网络
RNN
模型计算分为两步,第一步,计算第t个时间步的隐藏层a;第二步,计算 t
步的预测值y。
其中 Wax 和 Waa 两组参数分别与前一层的激活 a 和当前数据 x
结合,也可将其合二为一,并与 x 和 a 的连接计算。
在 RNN 网络中最常用激活函数是 tanh,有时也用
ReLU,一般只在最后一层使用 sigmoid 或 softmax。
LSTM 网络
相对于基础的 RNN,LSTM 增加了 c(Cell)状态单元,可将其看做在计算激活
a 的过程中保存的当前状态。它与 a 都在工作过程中一直向下一步传递。
公式中的Γ表示门控 gate,门控使用 sigmoid 函数计算得出 0-1
之间的值,用于过滤(保留或去掉)数据。LSTM 中增加的门控分别是:遗忘门
f,输入门 i 和输出门 o,它们分别控制在更新当前 cell 内容时,之前的 cell
占比,当前的 cell 占比,以及如何用 cell 生成a。
举个简单的例子:用 LSTM
生成文字,当输入“回车”时,说明本段已结束,之前的内容被遗忘门丢弃;当前输入是“笑脸”时 ...
风格迁移
风格迁移
风格迁移应用非常有趣,通过风格迁移也可以看到深层网络如何在不同层次提取特征。
可以看到,不只是颜色发生了变化,边缘,色块,对比度,甚至是笔触都转换成了明显的绘画效果.
《吴恩达深度学习》第四课第四周练习是一段风格迁移程序填空,编程语言为
Keras,做完后感觉理解了细节的具体实现,但整体搭建框架和数据流向还比较糊涂。于是使用
Pytorch 又实现了一遍。下面列出此过程中的一些收获。
如何使用预训练模型生成图片
例程中涉及三张图片,一张提供内容C,一张提供风格G,目标是生成新图片N,新图片可以从白噪声开始,也可以与内容图片一致。与对抗生成网络不同的是,风格迁移并不使用从小图逐渐放大的方法生成数据,而是将图N的
Tensor 设置成
requires_grad=True,然后通过梯度调整图片内容,类似于梯度攻击中生成对模型更有攻击性的数据。
如何结合风格和内容 误差函数由两部分组成,一部分是 C 内容与 N
内容的差异,另一部分是 G 风格与 N
风格的差异,内容差异比较简单,只需要计算某一层两图输出的距离即可。风格被定义为,同一层各个通道之间的关系,比如在
CNN 第 ...
搭建TensorFlow的GPUDocker环境
搭建 TensorFlow 的 GPU
Docker 环境
推荐的基础镜像列表
https://tianchi.aliyun.com/forum/postDetail?postId=67720
TensorFlow 的 GPU 镜像
12$ docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3$ nvidia-docker run --shm-size 8G --rm -v /exports:/exports -it registry.cn-shanghai.aliyuncs.com/tcc-public/tensorflow:latest-cuda10.0-py3 bash
在镜像中安装其它软件
(最好先更新软件源/root/.pip/pip.conf,
/etc/apt/sources.list,以便更快下载)
进入 docker 内部
1$ pip install pandas sklearn lightgbm catboost
说明
如需使用 GPU 的镜像 ...
Pytorch手工实现ResNet50
用 Pytorch 手工实现 ResNet50
《吴恩达深度学习课程》第四课第二周的作业是:使用 Keras 和 Tensorflow
编写
ResNet50,用程序实现题目中描述的网络结构。由于程序填空提供了不少示例,做完后仍感觉理解不透彻,又使用
Pytorch 实现了一遍。
ResNet50 包含 49 个卷积层和 1
个全连接层,属于较大型的网络,实现起来略有难度。对于理解数据流、卷积层、残差、瓶颈层,以及对大型网络的编写和调试都有很大帮助。
使用的数据仍是第四课第二周中的手势图片识别,题目说明、Keras
例程和相关数据可从以下网址下载:https://blog.csdn.net/u013733326/article/details/80250818
Keras ResNet50 程序填空的代码可从以下网址下载:https://github.com/Kulbear/deep-learning-coursera/blob/master/Convolutional%20Neural%20Networks/Residual%20Networks%20-%20v1.ipynb
Tor ...
卷积网络CNN
卷积网络 CNN
卷积网络是近年来非常流行的网络结构,常用于处理图像(2
维卷积)和自然语言(1
维卷积)。在不明觉厉的情况下使用卷积层,往往使用别人设计的结构,凑参数往模型里塞,同复杂的原理书中的内容又有点对不上号。本篇从应用场景,具体用法入手,深入到每一个重要参数:具体用途、用法及计算方法。
为什么使用卷积网络
先来看看全连接网络的参数:
网络有三个输入 x1,x2,x3 和两个输出 y1,y2,具体计算方法是:
如果 y1 与 x3 没有什么关系,通过训练两者之间的参数 w31 可能趋近于
0,但该连接仍然存在。对于输入为 3 输出为 2 的网络需要训练 32=6
个参数。图片数据非常庞大,如果训练一张 10001000 像素,RGB
三通道的图片,则输入元素有 3M 个,如果第一个隐藏层有 1000
个元素,则需要训练 100010003*1000
个参数,使得网络非常庞大,同时需要非常大量的数据才能避免过拟合。
卷积网络的优势在于共享参数,比如一个 3x3
的检测物体边缘卷积核训练好后,即可用于整个图片,此时需要学习的参数只有
3x3=9 个,如果在一层中训练 20 个 ...
归一化
归一化
为什么使用归一化
如果输入有多个
feature,且它们的数值范围有很大差异,这样训练时学习率就不能设置得太大,以免大幅调参引发越界。反之,如果各个
feature
有相同的均值和方差,则可使用更高的学习率,使收敛更快。归一化解决了梯度爆炸和梯度消失的问题,使构建更深层的网络成为可能,还避免了梯度爆炸和梯度消失。
使用模型时需要保证训练数据和测试数据同分布。在机器学习中往往对输入数据进行归一化处理,在深度学习中则常对网络的每一层都做归一化处理,以保证每次处理的数据分布一致。这也使得层与层之间更加独立,依赖更小。Batch-Normalize(BN)论文中描述:加入
BN 方法后,模型训练提速 14 倍,且精度也有所提升。
Convariate shift(漂移)问题
从原理上看,归一化缓解了内部协变量的移位问题,即漂移问题。深度神经网络中每一层输入都依赖之前层的输出,在训练的不同阶段,前层输出的分布也不相同。调参幅度越大越可能使分布变化,因此,只能使用较小的学习率,这样又使得收敛变慢。
由调参引发的内部数据分布变化的问题叫做内部协变量的移位问题,也被称作漂移问题。归一化方法可以 ...