深度学习课程学习记录,与吴恩达深度学习课程、《动手学深度学习》相结合。
Yolo
模型结构:
损失函数:
NMS:
1. 首先丢弃概率小于预定IOU阈值(例如0.5)的所有边界框;对 于剩余的边界框:
2. 选择具有最高概率的边界框并将其作为输出预测;
3. 计算 “作为输出预测的边界框”,与其他边界框的相关联IoU 值;舍去IoU大于阈值的边界框;其实就是舍弃与“作为输出预 测的边界框” 很相近的框框。
4. 重复步骤2,直到所有边界框都被视为输出预测或被舍弃
预训练与训练:
YOLO先使用ImageNet数据集对前20层卷积网络进行预训练,然后使用完整的网络,在PASCAL VOC数据集上进行对象识别和定位的训练和预测训练中采用了drop out和数据增强来防止过拟合。 YOLO的最后一层采用线性激活函数(因为要回归bb位置),其它层都是采用Leaky ReLU激活函数:
FCN模型
语义分割关注如何将图像分割成属于不同语义类别的区域。值得一提的是, 这些语义区域的标注和预测都是像素级的。下图展示了语义分割中图像有关 狗、猫和背景的标签。可以看到,与目标检测相比,语义分割标注的像素级 的边框显然更加精细。
实例分割:同一类型目标要分出来具体实例(谁是谁) 目标检测:标出来外包围矩形
语义分割目标:对图中每一个像素进行分类,得到对应标签。
网络结构:
网络结构分为两个部分:全卷积部分和反卷积部分。全卷积部分借用了一些经典的CNN网络,并把最后的全连接层换成卷积,用于提取特征,形成热点图;反卷积部分则是将小尺寸的热点图上采样得到原尺寸的语义分割图像。
卷积部分:
FCN中第6、7、8层都是通过1 × 1卷积得到的,第6层的输出是4096 × 7 × 7, 第7层的输出是4096 × 7 × 7 ,第8层的输出是1000 × 7 × 7,即1000个大小是 7 × 7的特征图(称为heatmap)
反卷积部分:
蓝色:卷积层;绿色:Max Pooling层;黄色: 求和运算;灰色: 裁剪
FCN-32s:
FCN-16s:
FCN-8s:
训练结果:
风格迁移
如果你是一位摄影爱好者,也许接触过滤镜。它能改变照片的颜色样式,从 而使风景照更加锐利或者令人像更加美白。但一个滤镜通常只能改变照片的 某个方面。如果要照片达到理想中的样式,经常需要尝试大量不同的组合, 其复杂程度不亚于模型调参。这里我们需要两张输入图像,一张是内容图像,另一张是样式图像,我们将 使用神经网络修改内容图像使其在样式上接近样式图像。
首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图 像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模 型参数。然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中 的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽 取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式特征 。
以之前放的图像为例,这里选取的预训练的神经网络含有3个卷积层, 其中第二层输出图像的内容特征,而第一层和第三层的输出被作为图像 的样式特征。 接下来,我们通过正向传播(实线箭头方向)计算样式迁移的损失函数 ,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。
样式迁移常用的损失函数由3部分组成:内容损失(content loss)使合成图像与内容图像在内容特征上接近,样式损失(style loss)令合成图像与样式图像在样式特征上接近,总变差损失(total variation loss)则有助于减少合成图像中的噪点。
量化风格差异,使用风格矩阵计算。
风格代价函数量化风格差异。
总体代价函数:
人脸识别
Siamese网络 对输入图片进行编码。
双输入结构:
相似度函数:
面部验证及二分类
通过训练神经网络,我们希望同一人的两张照片间的相似度函数值尽可能小,不同人的两张片间的相似度函数值尽可能大,下以此为目标制作训练集、定义Loss函数。
制作训练集
定义代价函数
我们希望A与P的差距永远不超过A与N,即:
移项
更强的条件:
得到损失函数:
将所有样本的loss函数累加得到cost函数如下:
运行神经网络:
利用人脸验证实现人脸识别:
对于训练完毕的神经网络,输入照片,通过简单的for循环语句遍历数据库中存储的所有照片,依次通过相似度函数进行计算,记录遍历过程中相似程度最大的值,在遍历结束后与预先设定的阈值进行比较,得出预测结果,完成人脸识别。
循环神经网络与NLP
第1列表示年龄,是一个数值特征,第2列表示性别,是一个只有一位(0,1)的特征,0代表Male,1代表Female,第3列表示国籍,目前有197个国家,可分别用一个整数表示。
数值特征不适合表示类别,因此一般使用独热编码, 国家编码从1开始,1~197,因为实际国籍有可能不填(对应0)。
使用199维特征向量表达一个人的特征:
文本处理
第一步:文本切分
给定文本片段,如:S = “… to be or not to be…”.
将文本切分为单词序列:L = […, to, be, or, not, to, be, …],
第二步:统计词频
创建一个字典(实际中经常使用Hash表)进行词频统计,初始字典为空,遍历文本,如果单词不在字典中,加入该单词,否则将其词频加1, 直到完成整个遍历,按照词频降序进行排序,将词频索引化, 如果词汇太多,则只保留排序在前的k个单词。
第三步:独热编码
将每一个词映射到索引号上,需要时,将索引转换为独热编码。词典上没有的词(低频词或拼写错误,直接忽略,或编码为0)
文本预处理
一篇文章可以被简单地看作一串单词序列,甚至是一串字符序列。 文本的常见预处理步骤通常包括:
1.将文本作为字符串加载到内存中。
2.将字符串切分为词元(如单词和字符)。
3.建立一个字典,将拆分的词元映射到数字索引。
4.将文本转换为数字索引序列,方便模型操作。
如何将词映射成向量,直接想法是使用之前所述的独热向量。带来的问题是维数过高。使用词嵌入(word embedding),将独热向量映射为低维向量。
原始向量:d维;映射后:v维,d远小于v。
词嵌入训练效果:
RNN:
LSTM: