简历中项目部分内容梳理

  • 摘要
  • 基于检索的肺结节分类算法
  • 基于GNN特征融合的肺结节分类方法
  • WEB开发
  • 比赛
  • web服务器
    • 为什么要用协程?
    • 项目难点是哪些?
    • 怎么实现同步的写法实现异步性能的呢?
    • 有栈协程和无栈协程的区别?
    • 线程上放多少个协程?
    • 非对称协程调度
    • 多线程异步日志的实现方案?
    • 多线程不加锁对日志文件的影响是什么?
    • 对协程上下文切换速度的影响有哪些?
  • 正在做但是还没有成果的工作
    • 论文
  • 总结

摘要

  经过上次面贝壳机器学习算法岗总结出来的经验,一定要对自己简历里面写的东西掌握得清清楚楚才行,如果你说得模模糊糊的会给面试官很不好的感觉,比如,问你你的论文比起其他方法提升了多少,你说,大概2个点吧?你自己觉得合适吗?对自己简历中的项目部分做一个梳理,这样能在面试的时候从容应对?起码不会说的不清楚吧~然后列举了一点对于项目面试官可能会问到的问题做了一下解答。如果有同学能坚持看完,就把自己当成面试官,有什么问题,就问,来蹂躏我!

基于检索的肺结节分类算法

  我的研究方向是医学图像处理,细化的分支是计算机辅助诊断中的肺结节分类。从本科毕业论文开始接触深度学习,本科毕业论文就是肺结节分类,主要工作是用2019年CVPR上的一个叫DeML的模型来对肺结节进行分类。然后我的第一篇论文就是基于本科毕业论文,引入了检索的思想,对2D的肺结节进行分类。
  如果说要问工作细节,那么可以这么描述
  前面提到了,这个工作使用的是检索的思想进行肺结节分类。先说说为什么要用检索的思想:从常理上来看,医生在诊断过程中,就算是有计算机辅助诊断系统,有这么多学术界的分类思想,但事实上,这个辅助诊断系统还只是能起到辅助的作用,如果一个模型只能够给医生提供输入的肺结节的类别以及预测类别的概率,信息有点单薄,是存在不足的;而且,现在的肺结节一般是通过CT来获取的,CT叫计算机断层扫描,一次CT出来的结果是许多2D图像的堆叠,对于同一个结节一定会有多张切片,如果说模型性能不好,同一个结节的不同切片作为输入,预测结果可能不同。介于这两点,我们引入了检索的思想来对肺结节进行分类。具体的做法是,使用前面提到的DeML模型对肺结节切片进行特征提取,一个结节切片对应一个512维的特征,然后计算特征之间的余弦相似度,并根据这个相似度进行排序。指定前K个做为一个结节的检索结果,一个结节有N张切片,那么一个结节就对应NxK个检索结果。我们根据这NxK个检索结果的大多数类别对待检索结节进行分类。这样就能解决我们前面提出来的两个问题,一个是融合一个结节的多张切片检索结果,一个是可以把检索结果返回给医生,医生能够根据检索结果对一个结节做更全面的评价。最后我们的结节分类准确率为95.49%,AUC为0.9792,准确率比之前SOTA的提升了1.99%,AUC提升了0.127。
针对这个工作,面试官可能会提问的问题

  1. DeML模型细节?
      DeML.arxiv是2019年CVPR上发表的论文提出来的模型,以GoogLeNet做为backbone,利用混合注意力,包括像素注意力、通道注意力来对多尺度的输入进行特征提取,并完成zero-shot分类任务。通过最大化每个通道输出的特征之间的距离,最小化每个尺度之间的特征距离做为目标函数对模型参数进行优化。
  2. ROC曲线如何绘制?AUC如何计算?
      首先是ROC曲线,中文名是接受者操作特性曲线。横坐标为FPR,纵坐标为TPR。FPR是所有阴性样本中分错的样本比例,TPR是所有阳性样本中分对的比例。当TPR为1,FPR为0的时候,在图中就是矩形左上方的角点,这个时候没有分错的阴性样本,阳性样本全部分对,分类准确率为100%,性能最好。设定不同的分类阈值,可以得到对应的(FPR, TPR),在坐标轴中将不同的点连接起来,就绘制出了ROC曲线。
      AUC表示ROC曲线下的面积。我了解的有两种计算方法:
    a. 第一种:直接使用积分来计算ROC曲线和x坐标轴围成的面积,或者说是在计算每一个图中的小柱子的面积之后求和。但这么计算稍显复杂,有更简化的方法。
    b. 第二种:也可以从另一个方面理解AUC,他表示的是从一个样本集中抽出一个样本,正样本的预测值大于负样本的预测值的概率。 如果模型是完美的,预测正确率为100%,那么预测的正样本的概率全都大于负样本的概率,此时的AUC为1。因此我们可以有这种计算方法:
    AUC=(∑i∈isPostiveranki)−M∗(M+1)2M∗NAUC = \frac{(\sum_{i\in isPostive}rank_{i})-\frac{M*(M+1)}{2}}{M*N} AUC=M∗N(∑i∈isPostive​ranki​)−2M∗(M+1)​​
    思想就是,按照预测概率对所有样本进行排序,并按照从大到小的顺序指定从n到1的rank值,然后计算所有正样本之间的组合数占正负样本所有组合数的比例,计算出来的就是AUC值。

基于GNN特征融合的肺结节分类方法

  这是我的第二个工作。前面的肺结节分类方法是使用2D切片作为模型的训练数据,显然2D的切片没有3D肺结节包含的信息丰富,代码是caffe框架的,然后当时我们实验室老师又有了资金,购入了几张卡,有计算资源了,于是就转到3D肺结节分类方向来了。这个工作最主要的思路就是使用GCN来融合肺结节传统的手工特征以及深度学习不同模型的特征,输出一个最终的特征用于对肺结节分类。
  如果说要问工作细节,那么可以这么描述
  前面也有提到,这个工作是使用GCN对结节传统特征和深度特征融合进行分类。先说说我们为什么要这么做:阅读了许多文献,特征融合方向的工作要么是单一融合传统特征,要么是单一融合深度特征,没有说把深度特征和传统特征融合的工作。我自己的思考是:传统特征具有可解释性,而且特征针对的方向很单一;深度特征,也就是这么多大神提出来的那些backbone提取出来的特征,虽说是一种黑箱的特征,但是它本质上还是一个特征,那是不是可以试试深度特征和传统特征的融合呢?然后我就开始干了。一般一些论文上特征融合工作都是将特征之间简单的相加、取平均值、去最大值。前两年不是图神经网络兴起么?然后图神经网络就是通过聚合节点之间的特征,自动捕获他们之间的关系,从而生成一个更具有辨别性的特征。这不就正好是我想要的么?然后我就把传统特征(包括LBP、HOG、GLCM)和深度特征(ResNet、GoogLeNet、ShuffleNet、Lenet、VGG)做为图神经网络里面的图节点,使用GCN的方法进行卷积,最后得出特征进行分类。这就是这个工作的主要思想。最后使用ACC、AUC、F1、Spec、Sens、Prec这些指标对模型做了一个全面的评价,最后的分类准确率有93.25%,比起同类方法总体的ACC有了0.68的提升。
针对这个工作,面试官可能会提问的问题

  1. LBP、HOG、GLCM这些传统特征是怎么算的,怎么把他们引入3D呢?
      LBP是局部二值模式,具有光照不变性,最主要是提取图像的对比度信息,主要工作原理是对比当前像素值和领域像素值的大小,比当前像素值大的像素点对应位置标记为1,比当前像素值小的像素点位置标记为0,最后将这些0-1连起来形成一个二进制数,转化为10进制,可以使用直方图来统计一定区间的数量,形成一个特征描述符,即可得到LBP特征;把它引入3D的思想是:一个像素在2维图像中有8个邻居像素,在3维图像中有26个邻居像素,这样想,LBP的思想不久可以迁移到3D中了么?但是这样会存在一个问题,就是产生的二进制数是26位的,这个数是非常大的。我们就用LBP的等价模式来对特征进行维度缩减,然后在进行直方图统计形成特征描述子。
      HOG特征是梯度直方图,用于描述图像的梯度、轮廓信息特征。计算方法是:计算每一个像素点的x、y轴方向上的梯度,然后然后使用计算出像素点的方向和强度,然后统计不同方向上的梯度个数,得到最终的特征描述符。
      GLCM特征是描述图像的灰度特征,他的主要思想是:通过统计不同间隔像素相邻像素对重现的个数得到一个GLCM矩阵,然后通过这个GLCM矩阵可以计算该矩阵的反差、对比度、能量、熵等信息,然后利用这些计算出来的特征值来描述这个图像。
  2. GNN主要有哪些类别,常见的GNN有哪些?
      GNN主要有频域有空域两个方向。其中空域指的是空间域,做图信息聚合的时候特征直接和邻接矩阵操作;频域则引入了拉普拉斯矩阵,空域的卷积等于频域上的乘积、傅立叶变换、车比雪夫多项式进行严格证明,最后得出需要对邻接矩阵左乘一个D^1/2 ,右乘一个D^1/2变换。
      常见的空域GNN有:graphSAGE、GAT、JKNet
      常见的频域GCN有:GCN、ChebNet
  3. F1、Prec这些指标怎么计算?
      Prec也就是精确度表示分成正类的样本中,正确分类的正例样本的比例,计算公式如下:
    Precision=TPTP+FPPrecision=\frac{TP}{TP+FP} Precision=TP+FPTP​
      F1通常用在类别不平衡的任务中,用于衡量prec和recall指标的,计算公式如下:
    F1=2∗prec∗recallprec+recallF1=2*\frac{prec * recall}{prec + recall} F1=2∗prec+recallprec∗recall​

WEB开发

  这个是学校组织的软件工程实训项目,是有和客户真实对接的,也就是有需求沟通等企业项目开发流程步骤的,主要是做一个围棋教育在线管理系统,主要的功能就是家长买课、管理员排课处理请求、超级管理员管理系统等。严格遵守软件工程那一套流程,包括需求分析、项目原型设计、数据库设计、前后端分离开发、代码风格、文档撰写、测试、部署,的项目。项目的技术栈是Vue+Django,我在项目中担任的角色是组长。那个时候是大二刚结束,也算是刚对软件工程入了个门,做这个项目很累、但是收获还挺大的。一整套软件工程的东西,vue+django的技术栈,还考虑了客户的体验,加入了celery异步处理任务队列、redis缓存数据库、JWT身份认证技术,顺带把css、html、javascript、python都给学了。因为做得不够深入,分布式、多线程这些并没有考量进这个项目。这就是这个项目的大概介绍。
针对这个工作,面试官可能会提问的问题

  1. 在项目中碰到哪些困难?
      难点?那难点可多了
    a. 由于是初学者,刚开始连npm、pip之类的包管理工具使用起来都费劲,但是在经过几天适应、了解之后,还是学会了怎么使用的;
    b. 还有就是初学者永远绕不开的坎,登录注册、记住登录状态,觉得思想挺简单的,但是实现起来还是觉得逻辑很复杂。刚开始查资料说要用session和cookie,但是说这个策略会存在不支持单点登录的问题,所以使用了更好的JWT策略;
    c. 第三方SDK的使用。当时还没有那种凡事看文档的自觉,每个东西都在csdn上查,零零碎碎的,还需要自己整合知识,所以那段时间学习效率很低、使用第三方SDK太难;
    d. 项目开发团队合作问题也是个问题。组长嘛,要分配任务,可是当时自己也不会啥,也不知道怎么分配任务合理,所以团队合作,谁做什么,配合得并不是很好;
    e. axios的使用,不知道为什么,那个时候愣是学不会怎么用axios,现在想起来还挺傻逼的。
  2. JWT、Redis、Celery等原理是什么?
      由于我之前写过这些了,就直接贴连接,不再赘述了:
    JWT:https://blog.csdn.net/weixin_42065178/article/details/124205515
    Redis:https://blog.csdn.net/weixin_42065178/article/details/124224353
    Celery:https://blog.csdn.net/weixin_42065178/article/details/124231326
  3. django后端创建了几个app,数据库有多少表?
      让我来数数哈,主要是首页、用户、课程、合同、购物车、支付、折扣等7个应用分别处理对应的客户端请求;数据库的话,有十来个表,具体多少个记不清楚了,比如用户表、课程表、老师表、课程章节、课程课时、折扣类型、折扣计算、课程和折扣关系表、活动表、支付记录表等等,他们通过外键来连接。
  4. 主要负责那些工作?
      组长嘛,啥都做。但是最主要是做前端。但是前期在css、html这一块浪费了好多时间,导致页面做的并不是很好。

比赛

  CVPR2022的workshop比赛,主题是对抗攻击图像分类。有两个阶段,初赛和复赛。初赛阶段不允许使用预训练模型,但是可以使用大模型。所以,在初赛阶段,我们首先对数据进行了统计,得到了一些关于数据的总体信息:1.20类动物图像,但是每一类的数据量不是很均衡,图片大小不一;2.噪声类型,包括patch attack、对抗噪声、淤血噪声、椒盐噪声、径向模糊、旋转攻击、高斯噪声、黑白阈值化;3.还存在一些类别非常相似,比如说,斑马和马,耗牛和水牛等相似样本,这个也是在可视化混淆矩阵的时候才发现的。

  针对上面的数据信息,初赛我们使用了下面几点策略:1.数据增强,就根据总结出来的原始数据集中的噪声进行增强,当然还包括一些前段时间提出来的mixup、mixcut类似的增强模型鲁棒性的数据增强策略。2.对于存在相似样本的情况,我们使用困难样本挖掘的损失函数,topk损失,也就是在一个batchsize里面选择损失较高的前k个样本损失来梯度回传。3.对于图片大小不一的问题,我们也使用了多尺度的训练来提升模型的鲁棒性。当然了,还有部分的调参工作,主要是调整超参数以及backbone。

  复赛重新给了一个数据集,这次对模型的大小有限制,5G flops,30M参数。也首先对数据进行分析:1.存在PGD和FGSM攻击,这是主办方说的;2.类别相对均匀。

  经过分析之后,我们在初赛的基础上,加入了一些新的策略:1.加入label smoothing的策略,增加标签的信息表达能力,防止网络过度自信;2.对抗训练的策略,即在训练的时候,随机选择epoch进行PGD/FGSM梯度攻击;3.引入cosLoss,也是为了更进一步解决相似类别的问题;4.梯度隐藏策略,也就是在训练好模型之后,我们会重新load模型加入梯度隐藏策略进行finetune。这个策略是最主要提升性能的方法,思路是:将输入的像素值首先复原成0-255之间,随机在一个区间里面选择一个最小值,随机在一个区间里面选择一个最大值,然后将像素值clip到这个区间里面来,最后再归一化到0-1之间。这个策略在测试集上提升了10个点。为什么有用?首先最大最小值是随机的,那么这增强了输入的随机性,能够使一些白盒攻击失效;其次,这样能让网络每次获得的梯度不一样,从而一定程度上防御白盒攻击。

web服务器

这是一个基于Linux、C++的多线程多协程的web服务器框架。包括一个框架基本的模块,例如日志、配置、线程、协程等模块,以及对TCP/HTTP这一套网络编程接口的封装。核心模块就是多线程多协程的并发访问,以及HOOK模块,用同步的写法,实现异步的功能。当然了,还有像HTTP、SOCKET这些封装,但是这些相对资源多一些,比较好实现。

单线程下协程并不是并发执行,而是顺序执行的,所以不要在协程里使用线程级别的锁来做协程同步。

IO管理器是基于epoll实现的,使用hook对一些网络接口进行了包装,是想让调用者只注重业务逻辑就行。

协程切换性能:200万/s(ucontext)

为什么要用协程?

协程适用于IO密集型的任务,一旦被阻塞了,我们就可以将当前协程挂起,执行任务队列中的其他协程。

项目难点是哪些?

协程调度器:协程之间应该怎么切换?当协程被挂起的时候,我们是直接切换到目标协程,就像线程那样上下文切换嘛?思想是,有一个主协程来负责协程调度,当一个协程打算swapout的时候,先切换回主协程,然后再切换到目标协程运行。为什么说它是难点呢?因为我们要控制协程什么时候切入,什么时候切出。

对于IO这一块的写成调度,是基于EPOLL实现的。就举个例子,比如服务器接受新的socket之后,那么我们将这个socket对应的文件描述符加入到epoll中进行监听,一旦相应的文件描述符发生了变化,我们就将epoll监听的读或者写事件加入到调度器管理的任务队列中。这个队列根据执行时间进行排序的,一旦任务的执行时间大于当前的时间,那么我们就放到协程中去执行。

当当前没有任务执行的时候,线程池就都陷入idle状态,一但有事情来了,通过往管道中写入数据来激活调度器工作。

HOOK:用同步的写法实现异步性能。阻塞,并不会阻塞整个线程,而是阻塞对应的协程。

怎么实现同步的写法实现异步性能的呢?

举个例子:read函数,通过dlysm这个函数找到标准库提供的函数签名,使用函数指针指向这个标准库的函数,这样我们可以使用原本的名字在这个原函数上增加一些操作(有点像装饰器)。我们设置文件描述符为非阻塞,当没有读到数据,返回的事EAGAIN,那么我们就将这个任务设置一个定时器,知道定时器到期,我们再次去尝试read。

有栈协程和无栈协程的区别?

https://www.zhihu.com/question/538063010/answer/2540063814这篇的例子一看就懂。

有栈协程是可以在其任意嵌套函数中被挂起的——毕竟它都能保存和恢复自己完整的上下文了。有栈协程切入切出点非常明确,这可以减少锁的使用,也是提升性能的一点。

无栈协程使用类似Wait这类的动作函数来实现,它类似于一个状态机,比如前面提到的使用switch来实现,这样就保证了整个协程的运行过程,更像在系统栈上的跳跃,而不会有任何的进出栈的开销,自然效率就大很多了。

线程上放多少个协程?

非对称协程调度

协程之间的切换只能通过:先切换回调度协程,然后切换到目标协程。

多线程异步日志的实现方案?

https://zhuanlan.zhihu.com/p/396202677
我认为一个多线程程序的每个进程最好只写一个日志文件,这样分析日志更容易,不必在多个文件中跳来跳去。再说多线程写多个文件也不一定能提速。解决办法不难想到,用一个背景线程负责收集日志消息,并写入日志文件, 其他业务线程只管往这个“日志线程"发送日志消息,这称为“异步日志"。

muduo日志库采用的是双缓冲( double buffering)技术, 基本思路是准备两块buffer: A和B, 前端负责往buffer A填数据(日志消息), 后端负责将buffer B的数据写入文件。当buffer A写满之后,交换A和B, 让后端将buffer A的数据写入文件,而前端则往buffer B填入新的日志消息,如此往复。用两个buffer的好处是:在新建日志消息的时候不必等待磁盘文件操作,也避免每条新日志消息都触发(唤醒)后端日志线程。前端不是将一条条日志消息分别发送到后端,而是将多条日志消息拼接成一个大的buffer传送给后端,相当于批处理,减少了线程唤醒的开销。

muduo日志库处理日志堆积的方法很简单: 直接丢掉多余的日志buffer, 以腾出内存。

多线程不加锁对日志文件的影响是什么?

如果是同时写日志,那竞争的资源是IO流,或者是写缓冲区?这个问题有点模糊。

  1. 可能导致日志文件的内容不是预期的,比如,一个线程写入11111,一个线程写入22222,一个线程写入33333,可能得到的结果是123123123123123.

对协程上下文切换速度的影响有哪些?

协程上下文切换,会用寄存器RBP、RSP等保存其使用到的变量,包括局部变量,调用逻辑等相关信息。

正在做但是还没有成果的工作

论文

  继上一篇论文,继续在GNN上做工作,这次使用结节的特征做为图的节点加入一些策略来提升肺结节分类的性能,目前的阶段,是比之前的论文有提升了的,正在探索还有没有继续改进的余地。

总结

  其实也没啥总结的,两篇论文、一个项目,在做一个项目、一个比赛,就酱紫。如果有同学能坚持看完,就把自己当成面试官,有什么问题,就问,来蹂躏我!

简历中项目部分内容梳理相关推荐

  1. java软件工程师简历项目经验pdf_java软件工程师简历中项目经验怎么写?

    java软件工程师简历-项目经验怎么写(优秀范文)Java开发工程师-简历模板-项目经验怎么写 [网盘]100+清新大气简历模板下载: Java开发工程师-项目经验范文1 项目名称:电子商务后台管理系 ...

  2. 简历中项目总结怎么写(项目总结模板)

    项目在简历中的书写和项目介绍是两码事 1.简历中的项目填充 项目流程 (1)需求分析(产品) (2)项目原型 (3)产品经理 - 和项目经理之间的沟通 (4)项目的选型 项目经理决定 用户需求(并发量 ...

  3. 【软件测试】可以写进简历的项目实战内容

    本次,小编再度出马,给大家找了一个非常适合练手的软件测试项目,此项目涵盖web端.app端.h5端.小程序端,可以说非常之全面. 缘起 在这之前,小编已经推出了九套实战教程. 但是,这些教程以web测 ...

  4. oa项目经验描述_简历中项目经验模版

    项目名称: OA (办公自动化) 开发工具 : MyEclipse 8.6 , Oracle 11g , Tomcat 6.0.18 项目描述 (1, SSH 框架版 ) : OA 主要功能模块分为首 ...

  5. python项目经验怎么写 范例_java软件工程师简历中项目经验怎么写?

    作者:暗灭 链接:https://www.zhihu.com/question/20695310/answer/180691302

  6. 简历中项目描述怎么写啊

    http://wenda.tianya.cn/question/7ade6dc9324bed88

  7. 如何描述简历中的项目经历?

    之前,我按照个人经历(经验)写了一篇如何书写个人简历的文章,面向对象是校招生.如何写一份让HR在6秒钟能pick你的简历?其中的建议是我校招时请我一位经验较丰富的朋友帮我修改简历学到的,之后也请了一位 ...

  8. 面试官:介绍一下你简历中的项目,细讲一点,附项目实战

    最近很多朋友跟我说目前学得差不多了,就是简历中项目不好写.也不知道面试官会问关于项目的哪些问题,心里没底. 这里我可以放心大胆的告诉你:不要慌,都会问,你不会的八成会问! 所以你要对你简历中所呈现的项 ...

  9. 如果在简历中描述项目

    转载地址:http://www.xdaiz.com/post/20090601839.html 许多学习软件开发的学员不知道如何在个人简历中如何填写"项目经验"或"项目描 ...

最新文章

  1. 小学数学闯关游戏 java代码_Java语言实现小学数学练习
  2. python列表推导式_聊一聊:python的各种推导式(列表推导式、字典推导式、集合推导式)...
  3. 好用的工具---screen命令
  4. GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
  5. python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...
  6. RecycleView嵌套滑动机制
  7. jenkins远程构建job_jenkins分布式构建job
  8. 公司技术部的罗强月薪10000,要跳槽
  9. lr11 打开controller时,会提示提示cannot initialize driver dll,exiting
  10. 轻巧实用的web ssh工具使用笔记——WGCLOUD
  11. 腾讯电脑管家修复代理服务器,腾讯电脑管家修复msvcp140.dll丢失的方法
  12. 【定积分】基本知识点+考点
  13. 机器人行业疫情之下的“危”与“机”
  14. 《Robust Consistent Video Depth Estimation》论文笔记
  15. opencv-python:16_形态学处理【二】(开操作、闭操作、形态学梯度、顶帽变换、黑帽变换,去除皮肤镜中的毛发噪音、cv2.morphologyEx())
  16. A题 序号互换(进制转换)
  17. Digital Image processing 数字图像处理最佳陷波滤波器设计(频域)
  18. h5跳转app指定页面及各种坑的总结
  19. 集成公告|Moonbeam宣布与ShowMe集成
  20. Node.js 任务队列Bull的源码浅析

热门文章

  1. Windows Service 2012 R2安装步骤
  2. 使用 Next.js 缓解静态站点的压力
  3. 使用IDEA调试DBeaver
  4. MySQL——条件查询
  5. 计算机上n,在n上的另一台计算机上启动进程
  6. 微软GPT-4 Office王炸来袭,10亿打工人被革命
  7. Apache Kafka教程--Kafka新手入门
  8. 八岐大蛇蛇的伤害算谁的伤害_避免诱惑损害网站性能
  9. [软考考点解析]软件设计师--正规式与正规集
  10. 这五款青少年常用的手机APP 你手机上有多少