# 项目面试 **Repository Path**: zhaojc648/project-interview ## Basic Information - **Project Name**: 项目面试 - **Description**: 软件杯决赛答辩提问前端+后端 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-09-22 - **Last Updated**: 2024-05-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Django - 优点 - 高效性:Django具有高效性和请求处理速度,它使用了许多优化技术,如延迟加载和缓存机制,以确保网站能够处理大量流量和高并发请求。(延迟加载(Lazy Loading)是一种优化技术,用于减少初始加载时的资源消耗和加快页面加载速度。它的原理是将页面上的某些内容或资源推迟加载,只有在用户需要时才进行加载。) - 功能完整:Django提供了许多内置的功能和模块,如认证系统、URL路由、表单处理、数据库模型和管理界面等。这使得开发者可以专注于业务逻辑的实现,而无需从头开始构建所需的功能。 - 安全性:Django拥有丰富的安全功能,包括防止常见的安全漏洞和攻击,如跨站脚本(XSS)、跨站请求伪造(CSRF)和SQL注入等。它还提供了用户认证和授权系统,可以轻松实现访问控制和权限管理。 - 易于扩展:Django使用模块化的设计和组件化的结构,允许开发者轻松地扩展和定制应用程序。它支持许多第三方的插 s件和扩展,同时也鼓励开发者遵循最佳实践,以保持代码的可维护性和可扩展性。 - 文档丰富:Django拥有详细和完善的文档,包括官方文档和社区贡献的文档,对于开发者来说是非常有价值的资源。这些文档提供了清晰的指导和示例,帮助开发者快速上手和解决问题。 - 缺点 - 大包大揽: 对于一些轻量级应用不需要的功能模块Django也包括了,不如Flask轻便。 - 过度封装: 很多类和方法都封装了,直接使用比较简单,但改动起来就比较困难。 - 性能劣势: 与C, C++性能上相比,Django性能偏低,当然这是python的锅,其它python框架在流量上来后会有同样问题。 - 模板问题: django的模板实现了代码和样式完全分离,不允许模板里出现python代码,灵活度对某些程序员来说可能不够。 # Django和Flask对比 - https://www.cnblogs.com/keyou1/p/10861212.html - Flask是轻量级的框架,自由灵活,可扩展性,核心基于Werkzeug WSGI工具和jinja2模板引擎适合做小网站以及web服务的API,开发大型网站无压力,但是架构需要自己设计。与关系型数据库的结合不弱于Django,而与非关系型数据库的结合远远优于Django。 # PaddlePaddle、PyTorch、TensorFlow PaddlePaddle、PyTorch和TensorFlow都是流行的深度学习框架,用于构建和训练神经网络模型。以下是它们之间的主要区别: 1. 设计理念: - PaddlePaddle(飞桨):PaddlePaddle注重产业应用,其设计目标是提供易于使用、高效可靠、灵活的深度学习平台,旨在帮助开发者快速实现产业落地。动态图(例如eager execution)静态图都支持。代码相对来说也比较干净统一,bug较少。并且可以实现更好的性能和跨平台的部署。 - PyTorch:PyTorch注重研究和实验,以动态图为核心,强调代码的简洁和交互式调试性能。它允许开发者灵活地定义和修改模型结构,适合快速迭代和实验,调试简单。但是可能在速度上不如TensorFlow。后来也增加了静态图 - TensorFlow:TensorFlow注重生产环境和推理部署,v1使用静态图作为计算表示,侧重于对大规模分布式训练和推理的支持,具有广泛的运算库和工具生态系统。但是调试麻烦,后来v2增加了动态图,但是由于和v1的区别太大,在v1基础上部署的项目转移到v2需要大量修改1,所以很少人用 - PaddlePaddle优点 - 高性能和高效:PaddlePaddle在性能方面非常出色,特别适用于大规模数据和高并发请求的处理。 - 可扩展性:PaddlePaddle提供了分布式训练和预测的能力,可以方便地在分布式环境下进行大规模深度学习任务。 - 算法丰富:PaddlePaddle提供了丰富的预训练模型和算法库,包括图像分类、目标检测、机器翻译等多个领域。 - PaddlePaddle缺点 - 学习曲线较陡:相对于其他框架,PaddlePaddle的学习曲线较陡,可能需要一些时间和精力来熟悉其特定的API和工作方式。 - 社区相对较小:相比于TensorFlow和PyTorch,PaddlePaddle的社区规模较小,可能在文档和支持方面相对有限。 - PyTorch优点 - 易于使用和理解:PyTorch提供了简洁的API和动态计算图,使得开发者能够更快地进行实验和迭代,对于研究人员来说非常友好。 - 训练和调试的灵活性:PyTorch的动态计算图和易于调试的特性使其非常适用于模型调整和实验。 - PyTorch缺点 - 性能相对较低:与TensorFlow相比,在处理大规模数据和高并发请求时,PyTorch的性能可能相对较低。 - 应用开发相对较少:相较于TensorFlow,PyTorch在应用开发和工业界的应用方面还相对较少。 - TensorFlow优点 - 广泛应用和强大的生态系统:TensorFlow是目前应用最广泛的深度学习框架之一,拥有庞大的社区和丰富的生态系统,提供了各种工具、库和模型供开发者使用。 - 深度定制和可扩展性:TensorFlow提供了灵活的API和图计算模型,能够满足广泛不同的深度学习需求,同时也支持分布式训练和部署。 - TensorFlow缺点 - 学习曲线较陡:与PaddlePaddle类似,TensorFlow的学习曲线也相对较陡,新手可能需要一些时间来熟悉其底层概念和工作方式。 # 动态图和静态图 动态图和静态图是深度学习框架中两种表示计算图的不同方法。 1. 静态图: 静态图是指在程序运行之前就完全定义好计算图的结构,然后在执行阶段将输入数据通过计算图进行计算得到输出结果。在静态图中,计算图的结构是固定的,不会随着数据的变化而改变。最典型的静态图框架是TensorFlow 1.x版本。 优势: - 提前定义好计算图结构,有利于优化和静态编译,适用于需要高性能和高效计算的场景; - 可以进行图的剪枝和优化等操作,提高计算效率。 劣势: - 需要预先定义整个计算图的结构,增加了编码和调试的复杂性; - 对于动态变化的计算图,静态图需要通过循环或条件语句来处理,不够灵活。 2. 动态图: 动态图是指在程序执行期间逐步地构建计算图,并即时进行计算。在动态图中,计算图的结构可以根据数据的变化而动态调整。最典型的动态图框架是PyTorch和TensorFlow 2.x版本。 优势: - 可以根据数据的变化而动态调整计算图的结构,对于复杂的条件和循环逻辑更加灵活; - 更易于理解和调试,可以使用Python的控制流语句进行动态计算。 劣势: - 动态图无法提前进行静态编译和优化,可能会导致一些性能上的损失; - 可能需要更多的内存和计算资源。 总结而言,静态图在程序运行之前就定义好计算图结构,适用于需要静态编译和优化的场景;而动态图在程序执行期间逐步构建计算图,适用于需求灵活和动态调整计算图的场景。选择使用哪种图形方法取决于具体的需求和应用场景。 # Celery https://zhuanlan.zhihu.com/p/64595171 B站视频 https://www.bilibili.com/video/BV1Di4y1d7AD/?spm_id_from=333.337.search-card.all.click&vd_source=d7aca56109713ddc32634ea5f37c237c # Uni-app Uni-app是一个基于Vue.js的跨平台应用开发框架,它可以快速地使用一套代码开发多个平台的应用,包括iOS、Android、Web、微信小程序、支付宝小程序等。 Uni-app提供了一套统一的开发语法和组件库,使得开发者可以使用熟悉的Vue.js开发技术来构建跨平台的应用。开发者只需要编写一次代码,即可在不同平台上运行和发布应用。 Uni-app的主要特点包括: 1. 跨平台:Uni-app使用了一套相同的代码结构和开发语法,通过编译和适配层将代码转换为不同平台的原生应用。这样就不需要为每个平台单独开发应用,大大减少了开发工作量和成本。 2. 组件化开发:Uni-app提供了丰富的跨平台组件库,开发者可以直接使用这些组件来构建应用界面。组件化开发可以提高开发效率,同时保持了应用的界面一致性。 3. 跨端API和能力:Uni-app兼容了各个平台的原生API和能力,比如拍照、定位、支付等。开发者可以通过一套统一的API来访问不同平台的功能,简化了跨平台开发的难度。 4. 高性能:Uni-app采用了基于原生渲染的方式,能够使用原生渲染引擎来提供更好的性能和用户体验。 Uni-app提供了丰富的开发工具和插件支持,包括HBuilderX开发工具、uni-ui组件库、uniCloud云开发等,使得开发者能够更加高效地开发和调试跨平台应用。 总结而言,Uni-app是一个跨平台应用开发框架,基于Vue.js,通过一套代码可以开发多个平台的应用,具有跨平台、组件化开发、统一API和高性能等特点。它可以大幅度简化跨平台应用开发的难度和成本。 Uni-app是一款基于Vue.js开发的跨平台应用框架,它能够通过一套代码同时构建iOS、Android、Web等多个平台的应用。Uni-app的设计理念是"写一次,到处运行",大大简化了跨平台开发的复杂性。 Uni-app的特点和优势包括: - 跨平台能力:借助Uni-app,开发者可以使用Vue.js语法一次编写代码,然后打包生成同时兼容iOS、Android以及Web的应用。这种能力帮助开发者节省了大量的时间和精力。 - 性能优化:Uni-app在运行时使用了一层高性能的渲染引擎,通过原生渲染和性能优化策略提供了较好的运行性能,确保应用在不同平台上都能有流畅的表现。 - 组件库和插件生态系统:Uni-app支持丰富的组件库和插件生态系统,开发者可以直接使用和集成各种组件和插件,从而快速构建功能丰富的应用。 - 开发效率高:Uni-app使用统一的代码结构、语法和开发工具,开发者只需要对Vue.js有一定的了解即可进行跨平台开发,减少了学习和上手的成本。 - 支持原生能力:Uni-app提供了对原生能力的访问,开发者可以使用JavaScript直接调用设备的原生功能。同时,Uni-app也允许在需要的时候编写原生代码来满足特定需求。 需要注意的是,虽然Uni-app提供了跨平台开发的便利,但由于不同平台的特性和限制不尽相同,一些原生平台的特性可能无法完全满足。在开发过程中,开发者可能需要考虑适配性和平台差异性的问题。 总的来说,Uni-app是一个强大的跨平台开发框架,可以极大地提高开发效率和降低开发成本,适用于构建中小型应用和简单的移动端应用。 # 原生渲染 原生渲染(Native Rendering)是指将应用的界面和图形元素直接由操作系统和底层硬件进行渲染和显示的过程。在原生渲染中,应用利用操作系统提供的图形库和渲染引擎,将界面元素转化为底层图形指令,然后由操作系统和硬件进行图形绘制和显示。 原生渲染具有以下特点和优势: 1. 性能优化:原生渲染利用底层硬件和操作系统的优化能力,可以实现高效的图形渲染和显示,提供流畅的用户体验。 2. 完全访问底层功能:原生渲染可以直接访问底层硬件和操作系统提供的图形功能,如GPU加速、硬件加速等,从而实现更高级的图形特效和功能。 3. 设备适应性:原生渲染能够根据不同设备的特性和分辨率,进行优化和适配,以提供最佳的视觉效果和用户体验。 4. 界面一致性:原生渲染可以保持应用界面与操作系统的一致性,使得应用更加融入操作系统的整体风格和用户习惯。 然而,原生渲染也存在一些限制和挑战: 1. 平台限制:原生渲染通常只针对特定的操作系统和硬件平台,需要额外开发工作来适配不同平台。 2. 开发成本高:原生渲染需要使用特定的图形库和API,因此开发成本会相对较高,并且需要掌握相关的底层开发技术和知识。 3. 跨平台兼容性:原生渲染通常不具备跨平台兼容性,需要单独开发不同平台的渲染逻辑。 总结而言,原生渲染是指应用界面和图形元素直接由操作系统和底层硬件进行渲染和显示的过程,具有性能优化、完全访问底层功能和设备适应性等优势,但也面临平台限制和开发成本较高的挑战。选择原生渲染取决于应用需求、目标平台和开发资源的具体情况。 # insightface https://zhuanlan.zhihu.com/p/76541084 InsightFace(ArcFace)在SphereFace基础上改进了对特征向量归一化和加性角度间隔,提高了类间可分性同时加强类内紧度和类间差异 ArcFace的核心是使用角度余弦距离来度量人脸特征之间的相似度。通过将人脸图像映射到一个高维特征空间,ArcFace将人脸特征向量与相应的标签进行关联,使得同一类别的特征向量更加接近,而不同类别的特征向量相对较远。 为了实现更好的人脸识别效果,ArcFace在分布式面部特征的学习过程中采用了角度间隔损失函数,该损失函数可以提供更大的边界间隔,并使得特征向量之间的距离更具区分度。这种优化技术使得ArcFace在鲁棒性方面更加出色,能够在复杂的场景中准确地识别人脸。 总的来说,ArcFace是一种强大的人脸识别方法,它通过优化特征提取和相似度度量,实现了更准确和鲁棒的人脸识别效果。在实际应用中,ArcFace已广泛用于人脸验证、人脸识别和人脸搜索等领域。 # crop 在深度学习中,"crop(裁剪)"通常是指对图片进行随机裁剪来增加样本的多样性和泛化能力。常见的随机裁剪方式有以下几种: - 随机裁剪:在输入图片的不同位置进行裁剪,裁剪时可以使用随机尺寸、长宽比和位置等参数。 - 随机大小裁剪:在输入图片中随机选择一个目标尺寸,然后将其缩放到该尺寸,再随机裁剪得到最终的输出图片。 - 随机多尺度裁剪:在不同的尺度下对输入图片进行随机裁剪,并通过随机选择一个尺度来增加样本的多样性。 对于后图像的数量,这通常取决于训练数据集的大小和模型的需求。通常情况下,使用更多的图像可以提高模型的性能,但同时也会增加存储和计算资源的需求。一般来说,建议使用尽可能多的训练图像,但要考虑到硬件资源和训练时间的限制。 SGD(Stochastic Gradient Descent,随机梯度下降)是深度学习中常用的优化器之一,它通过随机选择少量样本来估计梯度,然后更新模型的参数。SGD的优点是计算简单、快速、内存占用小,适用于大规模数据集和复杂模型的训练。 差分学习率(Differential Learning Rates)是一种优化技巧,用于不同层次的网络参数使用不同的学习率。通过设置不同层次的学习率,可以更加精细地调整网络各层参数的更新速度,从而提高训练性能和收敛速度。通常来说,浅层网络(如前几层)使用较小的学习率,而深层网络(如后几层)使用较大的学习率。 需要注意的是,具体的随机裁剪方式、后图像数量、SGD优化器和差分学习率的设置应根据具体问题和数据集进行调试和优化,以达到最佳的训练效果。 # unet https://zhuanlan.zhihu.com/p/313283141 Unet的好处我感觉是:网络层越深得到的特征图,有着更大的视野域,浅层卷积关注纹理特征,深层网络关注本质的那种特征,所以深层浅层特征都是有意义的;另外一点是通过反卷积得到的更大的尺寸的特征图的边缘,是缺少信息的,毕竟每一次下采样提炼特征的同时,也必然会损失一些边缘特征,而失去的特征并不能从上采样中找回,因此通过特征的拼接,来实现边缘特征的一个找回。 1. 医疗影像语义较为简单、结构固定。因此语义信息相比自动驾驶等较为单一,因此并不需要去筛选过滤无用的信息。医疗影像的所有特征都很重要,因此低级特征和高级语义特征都很重要,所以U型结构的skip connection结构(特征拼接)更好派上用场 2. 医学影像的数据较少,获取难度大,数据量可能只有几百甚至不到100,因此如果使用大型的网络例如DeepLabv3+等模型,很容易过拟合。大型网络的优点是更强的图像表述能力,而较为简单、数量少的医学影像并没有那么多的内容需要表述,因此也有人发现在小数量级中,分割的SOTA模型与轻量的Unet并没有神恶魔优势 3. 医学影像往往是多模态的。比方说ISLES脑梗竞赛中,官方提供了CBF,MTT,CBV等多中模态的数据(这一点听不懂也无妨)。因此医学影像任务中,往往需要自己设计网络去提取不同的模态特征,因此轻量结构简单的Unet可以有更大的操作空间。 # vnet VNet是在UNet的基础上进行改进的,其中最大的改进就是引入了类似于ResNet的短路连接,也称为ResBlock。并且使用了医学图像常用的Dice loss VNet(Volumetric UNet)是用于三维医疗图像分割的网络架构,旨在解决医疗图像领域中的分割任务。与UNet相似,VNet的架构也分为编码器和解码器两个部分,用于对三维体积图像进行分割。 在VNet中,每个stage都采用了ResNet的短路连接方式,也就是在处理每个stage的卷积层之前,增加了一个跳跃连接(ResBlock)。这种跳跃连接将输入特征与输出特征进行相加,从而解决了梯度消失和信息丢失的问题,使得网络训练更加稳定,并且能够更好地捕捉细节和上下文信息。 通过引入ResBlock,VNet在每个stage中可以更好地保留和传播低级特征,从而提高了分割的准确性。此外,VNet还采用了3D卷积和3D上采样操作,以适应三维医疗图像的特点。 因此,VNet在保留了UNet的优点的同时,通过引入ResBlock的短路连接方式,解决了UNet在梯度传播和信息丢失方面的问题,进一步改善了分割结果的精度和稳定性。这使得VNet在三维医疗图像分割任务中更加适用,并取得了令人满意的结果。 # 面经 https://blog.csdn.net/weixin_44934424/article/details/115066562 https://zhuanlan.zhihu.com/p/186235116 # 算法 边缘检测findContours https://zhuanlan.zhihu.com/p/107257870 基于BiLSTM+CRF的中文分词(CWS) https://blog.csdn.net/Yang_137476932/article/details/105468784