金山办公春招CV算法工程师一面&二面 面试题(含答案)

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗技术与面试交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:加群

一面

主要分成python基础、C++基础、机器学习、深度学习四个部分进行提问。

1.传统算子了解吗?

我了解不多,面试官没有继续针对提问

2.Python列表的extend和+有什么不同

extend方法是用来将一个列表的所有元素添加到另一个列表的末尾。

使用extend方法时,第一个列表(调用extend的列表)会被修改,因为它的末尾会添加第二个列表的所有元素。

extend方法不会创建一个新的列表,而是在原有列表的基础上进行扩展

使用+运算符连接列表时,会创建一个新的列表,其中包含两个原始列表的所有元素。

使用+运算符不会修改原始列表,原始列表会保持不变。+运算符可以用于连接任意数量的列表,不仅仅是两个。

3.Python的深浅拷贝

浅拷贝只复制对象的第一层,而深拷贝会复制对象的所有层级。浅拷贝仅复制复合对象本身,不复制它内部的嵌套对象。通过copy()方法或者copy模块的copy()函数实现。

深拷贝会复制对象以及对象引用的所有层级,确保新对象完全独立于原对象。深拷贝会递归地复制对象的所有子对象。通过copy模块的deepcopy()函数来实现。

4.python内存管理

(1)内存分配:

Python使用内存池(memory pools)来管理内存,用于减少内存碎片和分配/释放开销。

(2)引用计数:

Python使用引用计数机制来跟踪每个对象的引用次数。当对象被创建时,引用计数初始化为1,如果有新的引用指向该对象,则计数增加;当引用被删除时,计数减少。

当对象的引用计数降为0时,意味着没有任何引用指向该对象,对象将立即被释放。

(3)垃圾回收(Garbage Collection, GC):

引用计数是一种有效的内存管理方式,但无法处理循环引用的情况。为了解决这个问题,Python实现了一个垃圾回收器,使用引用计数和分代回收策略来跟踪和回收垃圾对象。

(4)循环垃圾收集:

为了处理循环引用,Python的垃圾回收器会定期执行循环检测。这个过程不是实时的,而是周期性地执行,以寻找并回收循环引用中涉及的对象。

(5)手动内存管理:

虽然Python的内存管理是自动的,但有时开发者可能需要手动管理内存。Python提供了gc模块,允许开发者启用或禁用垃圾回收,强制执行垃圾回收,以及获取关于对象的引用信息。

5.c++构造函数和析构函数

构造函数是一个在创建类的新对象时被自动调用的特殊成员函数,主要目的是初始化对象,构造函数的名称与类名相同,构造函数没有返回类型,可以有参数,也可以没有参数。有参数的构造函数称为带参数构造函数,允许在创建对象时提供初始值。一个类可以有多个构造函数,这些构造函数通过参数的数量或类型来区分,称为构造函数重载。如果没有为类显式定义构造函数,编译器会提供一个默认构造函数,不接受任何参数。

析构函数是一个在对象生命周期结束时被自动调用的特殊成员函数,主要目的是执行对象的清理工作。析构函数的名称与类名相同,但在类名前加上波浪号(~)。

析构函数没有参数,也没有返回类型。一个类只能有一个析构函数。析构函数不能被重载,也不能被声明为virtual。如果没有为类显式定义析构函数,则编译器会为该类生成一个默认的析构函数。

6.C++的虚函数和纯虚函数

虚函数是一种在基类中声明并在派生类中可以被重写(Override)的成员函数。它允许派生类根据需要提供特定的实现。虚函数的声明通常包括关键字virtual,而其定义则不是必须的。如果基类中的虚函数没有提供定义,它将成为一个虚函数声明,派生类中必须提供相应的定义。

虚函数的主要特点包括:

  • (1)虚函数允许派生类重写基类的行为。

  • (2)通过使用指针或引用,可以动态地调用派生类中的虚函数实现,这是多态的一种体现。

  • (3)即使基类中的虚函数没有被派生类重写,基类中的实现仍然可以被调用。

纯虚函数是一种在基类中声明的虚函数,它没有实现(即没有函数体),并且用= 0指定。纯虚函数使得基类成为一个抽象类(Abstract Class),这意味着你不能实例化一个抽象类,但你可以创建指向抽象类对象的指针或引用。

纯虚函数的主要特点包括:

  • (1)强制派生类提供纯虚函数的具体实现。

  • (2)包含纯虚函数的类称为抽象类,不能直接实例化。

  • (3)抽象类通常用作接口,定义了一组操作和行为的规范,而具体的实现由派生类完成。

  • (4)纯虚函数允许在基类中声明函数,但不提供实现,这使得基类更加灵活,可以作为不同派生类的共同基类。

7.C++的多态

C++ 的多态(Polymorphism)是指在面向对象编程中,使用同一个接口来处理不同类型的对象,从而实现不同类型的对象对同一方法的响应。

C++实现多态主要有两种方式:静态多态和动态多态

静态多态性是通过函数重载和运算符重载实现的。 在这种情况下,编译器在编译时就确定了调用哪个函数,基于函数名和参数列表。

函数重载是指在同一个作用域内可以有多个同名函数,但它们的参数列表必须不同(参数的数量或类型不同)。

运算符重载允许为自定义类型定义运算符的行为。这样,我们可以像使用内置类型一样使用自定义类型的运算符。

动态多态性是通过虚函数实现的。 虚函数是在基类中声明的函数,可以在派生类中被重写。使用基类的指针或引用可以调用派生类中的函数实现。

8.c++哪些运算符不能重载

总结:带点的,sizeof和#不可重载,其余可以重载。

9.maskrcnn.和fasterrcnn的区别

Mask R-CNN 主要用于实例分割,Faster R-CNN 主要用于目标检测。

Mask R-CNN 使用 ROI Align 代替 Faster R-CNN 中的 ROI Pooling。ROI Align 通过双线性插值来解决 ROI 与特征图之间的不对齐问题,从而提高分割精度和速度。而 Faster R-CNN 中的 ROI Pooling 可能会导致特征图与 ROI 不对齐,从而影响分割效果。

10.transformer以及它的一些改进

vit、swin-transformer

ViT是一种基于Transformer的视觉模型,旨在解决传统CNN(卷积神经网络)在处理大尺寸图像时出现的分辨率限制和计算瓶颈问题。ViT采用了一个全新的架构,将图像划分成一组图像块,并将其转换为序列,序列的每个元素都是一个图像块,然后将其输入具有自注意力机制的Transformer模型。

Swin Transformer是一种基于滑动窗口的自注意力机制的Transformer模型,它可以在保持CNN局部感知的同时,利用全局上下文信息。Swin Transformer采用了一种称为“Swin”的层次结构,通过将图像划分为不同的窗口,并在这些窗口上执行局部自注意力,逐渐将局部信息整合到全局上下文中。

11.transformer的批标准化和bn有什么区别

BN通过对每个小批量数据进行归一化处理,使得网络中的每个层的输入都拥有接近均值为0、方差为1的分布。

transformer的批标准化是LN层标准化,是在NLP中广泛使用的归一化技术,特别是在处理序列数据时。与批标准化不同,层标准化是对单个样本的所有特征进行归一化,而不是对整个批次的数据进行归一化。

区别:

  • (1)归一化的范围:批标准化是在批次的维度上进行归一化,而层标准化是在单个样本的维度上进行归一化。

  • (2)适用场景:批标准化适用于CNN,特别是在处理图像等具有固定大小和形状的数据时;层标准化适用于处理序列数据,如文本,因为序列长度可能不同,且每个序列的特征数量固定。

  • (3)训练动态:批标准化可能会受到批次大小的影响,而层标准化不受批次大小的影响,因为它只关注单个样本。

  • (4)参数数量:批标准化为每个特征维度学习两个参数,而层标准化为每个样本学习两个参数。

12.dert

基于Transformer的端到端目标检测网络,anchor free。https://zhuanlan.zhihu.com/p/650051196

13.yolov3的head的输出维度

anchor_num * (类别数+1+4)

anchor_num是anchor数量,1是置信度,4是中心点和位置

14.bn在训练和测试的区别

训练阶段:

  • (1)动态统计:在训练阶段,BN层会对每个批次的数据计算均值和方差,并使用这些动态统计量来归一化当前批次的数据。

  • (2)可学习参数:BN层包含两个可学习的参数,即缩放因子和偏移量,在训练过程中,这些参数会根据当前批次数据的统计特性进行调整。

  • (3)梯度更新:BN层的参数会随着网络的反向传播过程进行更新,以最小化损失函数。

测试阶段:

  • (1)固定统计:在测试阶段,BN层使用的是训练过程中累积的均值和方差,而不是动态计算的。这意味着测试时的BN层行为是固定的,不会根据输入数据的变化而变化。

  • (2)批量大小的影响:在测试时,如果批量大小与训练时不同,BN层的统计特性可能会受到影响。为了解决这个问题,通常会使用训练过程中的移动平均均值和方差,或者在测试时使用较小的批量大小来接近训练时的统计特性。

  • (3)不需要梯度更新:在测试阶段,BN层的参数不再更新,因为测试是评估模型性能的过程,而不是训练过程。

15.resnet用来解决什么问题?

因模型深度过深而导致的梯度消失问题

16.bn是用来解决什么问题?

主要解决模型训练过程中难以收敛,存在异常值,过拟合等问题,还可以加快训练速度、提高模型精度、防止梯度消失、梯度爆炸、简化学习过程。

17.L1,L2正则

L1正则能够使得模型选择一部分特征作为关键特征,而其他特征的权重接近于0,从而实现特征选择和稀疏化。

L2正则化对模型的影响更加平滑,可以避免特征选择和稀疏化。

18.逻辑回归,线性回归,岭回归

L1正则+线性回归是Lasso回归,L2正则+线性回归是岭(Ridge)回归。

19.pca的过程

(1)数据标准化:

(2)协方差矩阵计算:

计算数据的协方差矩阵。协方差矩阵描述了数据特征之间的线性关系,其元素是不同特征之间的协方差。

(3)特征值和特征向量计算:

对协方差矩阵进行特征分解。这一步骤将产生一系列的特征值和对应的特征向量。特征值表示了每个特征向量方向上的数据方差,而特征向量则定义了主成分的方向。

(4)选择主成分:

根据特征值的大小对特征向量进行排序。通常,较大的特征值对应的特征向量方向上的数据变化更大,因此更具有信息量。选择前k个最大的特征值对应的特征向量作为主成分,这些特征向量将构成一个新的特征空间。

(5)数据转换:

将原始数据投影到选定的主成分上。具体来说,就是将每个数据点与选定的特征向量进行点积,得到新的坐标值。这些新的坐标值构成了降维后的数据表示。

20.协方差和方差有什么区别

方差是衡量一组数据离散程度的统计量,它表示各个数据与其算术平均数之差的平方和的平均数。

协方差是衡量两个随机变量之间相关程度的统计量,它描述了两个变量的变化趋势是否一致。如果两个变量的变化趋势一致(即一个变量增大时另一个也增大,或者一个减小时另一个也减小),那么它们的协方差为正值;如果变化趋势相反(即一个变量增大时另一个减小时,或者一个减小时另一个增大),那么协方差为负值;如果两个变量之间没有线性关系,则协方差接近于零。

21.对cv的大模型的理解和其发展趋势

主要是结合多模态的发展,以文生图越来越完善和强大,未来的趋势是文生视频,可能每个人都有机会成为导演+编剧。

二面

拷打对自己简历上的三个实习经历。

总结

建议对实习、项目等要加深,理解透彻,不然面试很难过,我项目面经常过不了。

  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言面试八股文是指在春季招聘中常见的C语言相关的面试题目和知识点。下面是一份常见的C语言面试八股文,供您参考: 1. C语言的基本数据类型有哪些? C语言的基本数据类型包括整型、浮点型、字符型和指针型。 2. 请介绍一下C语言中的变量和常量。 变量是用来存储数据的内存位置,可以通过变量名来访问和修改其值。常量是指在程序执行过程中不会改变的值。 3. 什么是数组?请介绍一下C语言中的数组。 数组是一种存储相同类型数据的集合,通过索引来访问数组中的元素。在C语言中,数组的大小在定义时就需要确定,并且数组的下标从0开始。 4. 请介绍一下C语言中的指针。 指针是一个变量,其值为另一个变量的地址。通过指针可以直接访问和修改内存中的数据。使用指针可以提高程序的效率和灵活性。 5. 请介绍一下C语言中的函数。 函数是一段完成特定任务的代码块,可以通过函数名来调用执行。函数可以接收参数并返回一个值,也可以不接收参数或不返回值。 6. 请介绍一下C语言中的流程控制语句。 C语言中的流程控制语句包括条件语句(if-else语句、switch语句)、循环语句(for循环、while循环、do-while循环)和跳转语句(break语句、continue语句、goto语句)。 7. 请介绍一下C语言中的结构体。 结构体是一种自定义的数据类型,可以包含多个不同类型的成员变量。通过结构体可以将多个相关的数据组织在一起。 8. 请介绍一下C语言中的文件操作。 C语言中的文件操作主要包括打开文件、读写文件和关闭文件。可以使用标准库函数来进行文件操作,如fopen、fread、fwrite、fclose等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值