使用PyTorch进行情侣幸福度测试指南
欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/
欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/
计算机视觉–图像和视频数据分析是深度学习目前最火的应用领域之一。因此,在学习深度学习的同时尝试运用某些计算机视觉技术做些有趣的事情会很有意思,也会让你发现些令人吃惊的事实。长话短说,我的搭档(Maximiliane Uhlich)和我决定将深度学习应用于浪漫情侣的形象分类上,因为Maximiliane是一位关系研究员和情感治疗师。具体来说,我们想知道我们是否可以准确地判断图像或视频中描绘的情侣是否对他们的关系感到满意? 事实证明,我们可以!我们的最终模型(我们称之为DeepConnection)分类准确率接近97%,能够准确地区分幸福与不幸福的情侣。大家可以在我们的论文预览链接[^1]里阅读完整介绍,上图是我们为这个任务设计的框架草图。
在数据集收集方面,我们使用这个Python脚本[^2]进行网页数据抽取(webscraping)来获取幸福和不幸福的情侣数据。最后,我们整理出了大约包含1000张图像的训练集。这并不是特别多,所以我们使用数据增强与迁移学习来增强我们模型在数据集上的表现。数据增强–图像方向的微小变化,色调和色彩强度以及许多其他因素都会增强模型的泛化能力,从而避免学习一些不相关信息。 例如,如果数据中幸福夫妻的图像平均比不幸福夫妻的图像更亮,我们并不希望我们的模型映射这种关联。我们使用了强大的ImgAug库[^3]进行了相当多策略的数据扩充,以确保我们模型的鲁棒性。基本上对于每个批次的每个图像,我们至都至少应用多种数据增强技术。下图是一张图片应用了48种数据增强策略的示例。
我们决定使用ResNet模型作为DeepConnection的基础网络,在大型数据集ImageNet上预先训练。通过预训练,模型已经具有了一定的识别能力。我们所有的模型都借用PyTorch实现,我们使用Google Colab上的免费GPU资源进行训练和测试。这个基础模型本身已经具备了良好的分类能力,但我们决定更进一步,用空间金字塔池化层(SPP)[^4] 替换ResNet-34基础模型的最后一个自适应池模块。这里,处理后的图像数据被分成不同数量的正方形,并且仅传递最大值以进行进一步分析(最大池化)。这使得模型可以专注于重要的特征,使其对不同大小的图像具有鲁棒性,并且不受图像扰动的影响。之后,我们放置了一个均值变换(PMT)层[^5],用数学函数转换数据以引入非线性,使得DeepConnection可以从数据中捕获更复杂的关系。这两个模块均提高了我们的分类准确度,我们在单独的验证集上得到了大约97%准确率。SPP / PMT和后续分类层的代码如下所示:
class SPP(nn.Module):
def __init__(self):
super(SPP, self).__init__()
## features incoming from ResNet-34 (after SPP/PMT)
self.lin1 = nn.Linear(2*43520, 100)
self.relu = nn.ReLU()
self.bn1 = nn.BatchNorm1d(100)
self.dp1 = nn.Dropout(0.5)
self.lin2 = nn.Linear(100, 2)
def forward(self, x):
# SPP
x = spatial_pyramid_pool(x, x.shape[0], [x.shape[2], x.shape[3]], [8, 4, 2, 1])
# PMT
x_1 = torch.sign(x)*torch.log(1 abs(x))
x_2 = torch.sign(x)*(torch.log(1 abs(x)))**2
x = torch.cat((x_1, x_2), dim = 1)
# fully connected classification part
x = self.lin1(x)
x = self.bn1(self.relu(x))
#1
x1 = self.lin2(self.dp1(x))
#2
x2 = self.lin2(self.dp1(x))
#3
x3 = self.lin2(self.dp1(x))
#4
x4 = self.lin2(self.dp1(x))
#5
x5 = self.lin2(self.dp1(x))
#6
x6 = self.lin2(self.dp1(x))
#7
x7 = self.lin2(self.dp1(x))
#8
x8 = self.lin2(self.dp1(x))
x = torch.mean(torch.stack([x1, x2, x3, x4, x5, x6, x7, x8]), dim = 0)
return x
仔细观察代码可以看出,最终分类层上有八个变种。看似浪费了算力实际上恰恰相反。这个概念是最近提出的,叫做multi-sample dropout(多样本随机丢弃),它在训练期间显着加速了收敛[^6]。它基本上是防止模型学习虚假关系(过度拟合)和试图不丢弃丢失掩码中的信息之间的折衷。
我们在项目中对这个方法进行了其他一些调整优化,具体参看我们在GitHub放出的项目代码[7]以获取更多信息。简单地提一下:我们使用混合精度(使用Apex库[8]实现)训练模型,以大大降低内存使用率,使用早停(earlystopping)来防止过度拟合,并根据余弦函数进行学习率退火。
在达到令人满意的分类准确度(具有相应高的召回率和精确度)后,我们想知道我们是否可以从DeepConnection执行的分类中学到一些东西。因此,我们尝试模型解释性探索并使用梯度加权类激活映射技术(Grad-CAM)进行分析[^9]。基本地,Grad-CAM获取最终卷积层的输入梯度以确定显著区域,其可以被视为原始图像之上的上采样热图。具体实现与可视化结果如下:
## from https://github.com/eclique/pytorch-gradcam/blob/master/gradcam.ipynb
def GradCAM(img, c, features_fn, classifier_fn):
feats = modulelist_conv(img.cuda().half())
feats = feats.cuda()
_, N, H, W = feats.size()
out = modulelist_fc(feats)
c_score = out[0, c]
grads = torch.autograd.grad(c_score, feats)
w = grads[0][0].mean(-1).mean(-1)
sal = torch.matmul(w, feats.view(N, H*W))
sal = sal.view(H, W).cpu().detach().numpy()
sal = np.maximum(sal, 0)
return sal
我们在论文中对此进行了进一步讨论,并将其嵌入到了现有的心理学研究中,但DeepConnection似乎主要关注面部区域。从研究的角度来看,这很有意义,因为面部表情会传达沟通和情感。除了Grad-CAM获得的视觉感知之外,我们还想看看我们是否可以通过模型解释得出实际特征。为此,我们创建了激活状态图,以显示最终分类层的哪些神经元被哪些给定图像区域激活。
与其他模型相比,DeepConnection还学习到了代表不幸福的特征,并不仅仅将缺乏代表幸福的特征的分类为不幸福。但是,我们需要进一步的研究才能将这些特征实际映射到人类行为可解释性方面。我们还尝试过在未知的情侣视频帧上使用DeepConnection,效果非常好。
总体而言,该模型的稳健性是其强大优势之一。准确的分类同样适用于同性恋伴侣,不同肤色人种,除情侣外包含其他人的视频帧中,不能完整显示情侣人脸的视频帧中等等。对于图像中存在其他人的情况,DeepConnection甚至可以识别其他人是否感到满意,但仍然将其预测集中在这对情侣身上。
除了进一步的模型解释之外,下一步的工作将是使用更大的训练数据集,从而训练更复杂的模型。使用DeepConnection作为情侣治疗师的助手将会很有意思,可以在会话期间或之后对情侣的当前关系状态进行实时反馈。此外,我建议您与女票/男票一起输入你们的合照,看看DeepConnection对你们的关系有何看法!希望这会是一个好的开始!
1: https://psyarxiv.com/df25j/
2: https://github.com/Bribak/DeepConnection
3: https://github.com/aleju/imgaug
4: https://arxiv.org/abs/1406.4729
5: https://www.sciencedirect.com/science/article/pii/S0031320318304503
6: https://arxiv.org/abs/1905.09788
7: https://github.com/Bribak/DeepConnection
8: https://github.com/NVIDIA/apex
9: https://arxiv.org/abs/1610.02391
使用PyTorch进行情侣幸福度测试指南的更多相关文章
- 腾讯GT的流畅度测试方案研究
GT源码:https://github.com/TencentOpen/GT 一.流畅度模块的代码结构 流畅度插件总共就几个类,其实处理方式也比较简单粗暴,就是通过Choreographer输出的lo ...
- Android流畅度测试
Android流畅度测试 测试方法一:系统自带-开发者模式 测试方法二:FPS Meter测试安卓帧数 H5页面加载速度:window.performance.timing 测试方法一:系统自带-开发 ...
- 《大话移动APP测试:Android与iOS应用测试指南》
<大话移动app测试:android与ios应用测试指南> 基本信息 作者: 陈晔 出版社:清华大学出版社 ISBN:9787302368793 上架时间:2014-7-7 出版日期:20 ...
- 推荐——Monkey《大话 app 测试——Android、iOS 应用测试指南》
<大话移动——Android与iOS应用测试指南> 京东可以预购啦!http://item.jd.com/11495028.html 当当网:http://product.dangdang ...
- app流畅度测试--使用手机自带功能
1.进入开发者选项,在“监控”选项卡找到“GPU呈现模式分析”的选项 2.开启后,即可以条形图和线形图的方式显示系统的界面相应速度 3.那么要如何根据曲线判断系统是否流畅呢?实际上这个曲线表达的是GP ...
- OWASP固件安全性测试指南
OWASP固件安全性测试指南 固件安全评估,英文名称 firmware security testing methodology 简称 FSTM.该指导方法主要是为了安全研究人员.软件开发人员.顾问. ...
- 基于XGBoost模型的幸福度预测——阿里天池学习赛
加载数据 加载的是完整版的数据 happiness_train_complete.csv . import numpy as np import pandas as pd import matplot ...
- Web安全测试指南--认证
认证: 5.1.1.敏感数据传输: 编号 Web_Authen_01_01 用例名称 敏感数据传输保密性测试 用例描述 测试敏感数据是否通过加密通道进行传输以防止信息泄漏. 严重级别 高 前置条件 1 ...
- pytorch: 准备、训练和测试自己的图片数据
大部分的pytorch入门教程,都是使用torchvision里面的数据进行训练和测试.如果我们是自己的图片数据,又该怎么做呢? 一.我的数据 我在学习的时候,使用的是fashion-mnist.这个 ...
随机推荐
- [红日安全]Web安全Day4 - SSRF实战攻防
本文由红日安全成员: MisakiKata 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目 ...
- meterpreter会话渗透利用常用的32个命令归纳小结
仅作渗透测试技术实验之用,请勿针对任何未授权网络和设备. 1.background命令 返回,把meterpreter后台挂起 2.session命令 session 命令可以查看已经成功获取的会话 ...
- 如何在windows server上安装 Windows评估和部署工具包
此文是<.NET内存宝典>一书的售后服务系列文章之一. 在<.NET内存宝典>一书(目前我还在翻译本书,预计年底出版)的第3章 “内存测量”里的“Windows性能工具包”一节 ...
- 使用MySQL练习增删改查时因为版本问题出现连接错误
使用MySQL练习增删改查时出现连接错误,错误提示如下: 2020-02-19 19:53:51.088 ERROR 16328 --- [reate-249798694] com.alibaba.d ...
- SpringBoot图文教程12—SpringData Jpa的基本使用
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...
- JAVA基础之IO流知识总结
一.IO流体系图 IO常用的几个流: [I/O流原理作用] Input/Output:输入输出机制 输入机制:允许java程序获取外部设备的数据(磁盘,光盘,网络等). 输出机制:保留java程序中的 ...
- spring boot actuator服务监控与管理
1.引入actuator所需要的jar包 <dependency> <groupId>org.springframework.boot</groupId> < ...
- 使用JS检测自定义协议是否存在
[该博客是拼接他人的,原因我们这边PC的开发人员问我,有没有关于js某个对象直接能检测手机或者电脑的自定义协议的,我上网搜了下,貌似移动端的解决比较多] 最终解决方案:还是需要github上面大神写的 ...
- HTTP/1.1 与 HTTP/2.0
HTTP/1.1 与 HTTP/2.0 HTTP/1.1 持久连接 非持久连接
- go学习第四天、条件和循环
循环 Go语言仅支持循环关键字 for for i := 0; i<5; i++ 示例 while 条件循环 while(n<5) n := 0 for n < 5 { n++ fm ...