WeThinkIn

V1

2022/09/12阅读:12主题:橙心

【三年面试五年模拟】算法工程师的独孤九剑秘籍(第九式)

Rocky Ding

公众号:WeThinkIn

WeThinkIn公众号
WeThinkIn公众号

写在前面

【三年面试五年模拟】栏目专注于分享CV算法与机器学习相关的经典&&必备&&高价值的面试知识点,并向着更实战,更真实,更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优化ideas,一起交流学习💪

大家好,我是Rocky。

本文是“三年面试五年模拟”之独孤九剑秘籍的第九式,之前我们将独孤九剑秘籍前六式进行汇总梳理成汇总篇,并制作成pdf版本,大家可在公众号后台 【精华干货】菜单或者回复关键词“三年面试五年模拟” 进行取用。由于本系列都是Rocky在工作之余进行整理总结,难免有疏漏与错误之处,欢迎大家对可优化的部分进行指正,我将在后续的优化迭代版本中及时更正。

【人人都是算法工程师】算法工程师的“三年面试五年模拟”之独孤九剑秘籍(先行版)中我们阐述了这个program的愿景与规划。本系列接下来的每一篇文章都将以独孤九剑秘籍框架的逻辑展开,考虑到易读性与文章篇幅,一篇文章中只选取每个分支技能树中的2-3个经典&&高价值知识点和面试问题,并配以相应的参考答案(精简版),供大家参考

希望独孤九剑秘籍的每一式都能让江湖中的英雄豪杰获益。

So,enjoy(与本文的BGM一起食用更佳哦):

干货篇

----【目录先行】----

深度学习基础:

  1. 深度学习炼丹可以调节的一些超参数?

  2. 滑动平均的相关概念

经典模型&&热门模型:

  1. GAN的核心思想?

  2. 面试常问的经典GAN模型?

机器学习基础:

  1. 数据EDA逻辑(Exploratory Data Analysis)?

  2. K折交叉验证逻辑?

Python/C/C++知识:

  1. Python中Numpy的broadcasting机制?

  2. Python中的实例方法、静态方法和类方法三者区别?

  3. C/C++中常用容器功能汇总

模型部署:

  1. 算法工程师该如何看待硬件侧知识?

  2. 现有的一些移动端开源框架?

图像处理基础:

  1. 有哪些常用的图像去噪算法?

  2. 有哪些常用的图像频域信息分离方法?

计算机基础:

  1. Linux系统的相关概念

  2. Linux系统和Windows系统的区别?

开放性问题:

  1. 你觉得有哪些方法能增强公司的AI影响力?

  2. 你觉得面对一个业务场景,如何针对性设计算法解决方案?

----【深度学习基础】----

【一】深度学习炼丹可以调节的一些超参数?

  1. 预处理(数据尺寸,数据Normalization)
  2. Batch-Size
  3. 学习率
  4. 优化器
  5. 损失函数
  6. 激活函数
  7. Epoch
  8. 权重初始化
  9. NAS网络架构搜索

【二】滑动平均的相关概念

滑动平均(exponential moving average),或者叫做指数加权平均(exponentially weighted moving avergae),可以用来估计变量的局部均值,使得变量的更新与一段时间内的历史取值有关

变量 时刻记为 为变量 时刻训练后的取值,当不使用滑动平均模型时 ,在使用滑动平均模型后, 的更新公式如下:

上式中, 相当于没有使用滑动平均。

时刻变量 的滑动平均值大致等于过去 个时刻 值的平均。并使用bias correction将 除以 修正对均值的估计。

加入Bias correction后, 的更新公式如下:

越大, 越接近1,则公式(1)和(2)得到的结果( )将越来越接近。

越大时,滑动平均得到的值越和 的历史值相关。如果 ,则大致等于过去10个 值的平均;如果 ,则大致等于过去100个 值的平均。

下图代表不同方式计算权重的结果:

如上图所示,滑动平均可以看作是变量的过去一段时间取值的均值,相比对变量直接赋值而言,滑动平均得到的值在图像上更加平缓光滑,抖动性更小,不会因为某种次的异常取值而使得滑动平均值波动很大

滑动平均的优势: 占用内存少,不需要保存过去10个或者100个历史 值,就能够估计其均值。滑动平均虽然不如将历史值全保存下来计算均值准确,但后者占用更多内存,并且计算成本更高。

为什么滑动平均在测试过程中被使用?

滑动平均可以使模型在测试数据上更鲁棒(robust)

采用随机梯度下降算法训练神经网络时,使用滑动平均在很多应用中都可以在一定程度上提高最终模型在测试数据上的表现。

训练中对神经网络的权重 使用滑动平均,之后在测试过程中使用滑动平均后的 作为测试时的权重,这样在测试数据上效果更好。因为滑动平均后的 的更新更加平滑,对于随机梯度下降而言,更平滑的更新说明不会偏离最优点很远。比如假设decay=0.999,一个更直观的理解,在最后的1000次训练过程中,模型早已经训练完成,正处于抖动阶段,而滑动平均相当于将最后的1000次抖动进行了平均,这样得到的权重会更加鲁棒。

----【经典模型&&热门模型】----

【一】GAN的核心思想?

2014年,Ian Goodfellow第一次提出了GAN的概念。Yann LeCun曾经说过:“生成对抗网络及其变种已经成为最近10年以来机器学习领域最为重要的思想之一”。GAN的提出让生成式模型重新站在了深度学习这个浪潮的璀璨舞台上,与判别式模型开始谈笑风生。

GAN由生成器 和判别器 组成。其中,生成器主要负责生成相应的样本数据,输入一般是由高斯分布随机采样得到的噪声 。而判别器的主要职责是区分生成器生成的样本与 样本,输入一般是 样本与相应的生成样本,我们想要的是对 样本输出的置信度越接近 越好,而对生成样本输出的置信度越接近 越好。与一般神经网络不同的是,GAN在训练时要同时训练生成器与判别器,所以其训练难度是比较大的。

在提出GAN的第一篇论文中,生成器被比喻为印假钞票的犯罪分子,判别器则被当作警察。犯罪分子努力让印出的假钞看起来逼真,警察则不断提升对于假钞的辨识能力。二者互相博弈,随着时间的进行,都会越来越强。在图像生成任务中也是如此,生成器不断生成尽可能逼真的假图像。判别器则判断图像是 图像,还是生成的图像。二者不断博弈优化,最终生成器生成的图像使得判别器完全无法判别真假

GAN的对抗思想主要由其目标函数实现。具体公式如下所示:

上面这个公式看似复杂,其实不然。跳出细节来看,整个公式的核心逻辑其实就是一个min-max问题,深度学习数学应用的边界扩展到这里,GAN便开始发光了

接着我们再切入细节。我们可以分两部分开看这个公式,即判别器最小化角度与生成器最大化角度。在判别器角度,我们希望最大化这个目标函数,因为在公示第一部分,其表示 样本 输入判别器后输出的置信度,当然是越接近 越好。而公式的第二部分表示生成器输出的生成样本 再输入判别器中进行进行二分类判别,其输出的置信度当然是越接近 越好,所以 越接近 越好。

在生成器角度,我们想要最小化判别器目标函数的最大值。判别器目标函数的最大值代表的是真实数据分布与生成数据分布的JS散度,JS散度可以度量分布的相似性,两个分布越接近,JS散度越小(JS散度是在初始GAN论文中被提出,实际应用中会发现有不足的地方,后来的论文陆续提出了很多的新损失函数来进行优化)

写到这里,大家应该就明白GAN的对抗思想了,下面是初始GAN论文中判别器与生成器损失函数的具体设置以及训练的具体流程:

在图中可以看出,将判别器损失函数离散化,其与交叉熵的形式一致,我们也可以说判别器的目标是最小化交叉熵损失。

【二】面试常问的经典GAN模型?

  1. 原始GAN及其训练逻辑
  2. DCGAN
  3. CGAN
  4. WGAN
  5. LSGAN
  6. PixPix系列
  7. CysleGAN
  8. SRGAN系列

----【机器学习基础】----

【一】数据EDA逻辑(Exploratory Data Analysis)?

  1. 导入相应的Modules(numpy,pandas,matplotlib,PIL等)
  2. 阅读了解所有的数据文件(图片数据,类别文件,辅助文件等)
  3. 数据类别特征分析(数据类别总数,数据类别的平衡度,数据尺寸,噪声数据等)
  4. 数据可视化二次分析(直观了解不同类别的区别)

【二】K折交叉验证逻辑?

K折交叉验证的作用

当有多个不同的模型(结构不同、超参数不同等)可以选择时,我们通过K折交叉验证来选取对于特定数据集最好的模型。

K折交叉验证的流程

  1. 将含有 个样本的数据集,分成 份,每份含有 个样本。选择其中一份作为验证集,另外 份作为训练集,验证集集就有 种情况。
  2. 在每种情况中,用训练集训练模型,用验证集测试模型,计算模型的泛化误差。
  3. 交叉验证重复 次,平均 次的结果作为模型最终的泛化误差。
  4. 的取值一般在 之间。 折交叉验证的优势在于,同时重复运用随机产生的子样本进行训练和验证, 折交叉验证是最常用的。
  5. 训练集中样本数量要足够多,一般至少大于总样本数的50%。
  6. 训练集和验证集必须从完整的数据集中均匀采样。均匀采样的目的是希望减少训练集、验证集与原数据集之间的偏差。当样本数量足够多时,通过随机采样,便可以实现均匀采样的效果。

5折交叉验证举例

5折交叉验证(5-fold cross-validation)用来验证从不同的模型中选取最优的模型(最合适的模型)。将数据集分成5份,轮流将其中4份作为训练数据,1份作为验证数据,进行试验。每次试验都会得出相应的正确率。5次的结果的正确率的平均值作为对算法精度的估计。同时对不同的模型(如CNN、SVM、LR等)做上述相同的操作,得出每个模型在特定数据集上的平均能力,从中选优。

例子:

假设我们有一个特定数据集,我们想从YOLOv4、Mask R-CNN、SSD、Faster R-CNN、RetinaNet这五个模型中选取在这个特定数据集中有最好效果的一个模型作为baseline,我们可以进行交叉验证来进行判断:

步骤:

  1. 将数据集分成5份。
  2. 对于每一个模型,for i = 1, 2, 3, 4,5,每个for循环里将除了第i份的所有数据作为训练集用于训练,得到参数;再将参数在第i份数据上进行验证,得到评价结果。
  3. 最后我们可以得到5个模型的结果,每个模型有5个验证结果。将每个模型的结果取平均值,得到该模型的平均结果。
  4. 5个模型中平均结果最好的模型就是我们想要的最优模型。

----【Python/C/C++知识】----

【一】Python中Numpy的broadcasting机制?

Python的Numpy库是一个非常实用的数学计算库,其broadcasting机制给我们的矩阵运算带来了极大地方便。

我们先看下面的一个例子:

>>> import numpy as np
>>> a = np.array([1,2,3])
>>> a
array([123])
>>> b = np.array([6,6,6])
>>> b
array([666])
>>> c = a + b
>>> c
array([789])

上面的代码其实就是把数组 和数组 中同样位置的每对元素相加。这里 是相同长度的数组。

如果两个数组的长度不一致,这时候broadcasting就可以发挥作用了。

比如下面的代码:

>>> d = a + 5
>>> d
array([678])

broadcasting会把 扩展成 ,然后上面的代码就变成了对两个同样长度的数组相加。示意图如下(broadcasting不会分配额外的内存来存取被复制的数据,这里只是方面描述):

我们接下来看看多维数组的情况:

>>> e
array([[1.1.1.],
       [1.1.1.],
       [1.1.1.]])
>>> e + a
array([[2.3.4.],
       [2.3.4.],
       [2.3.4.]])

在这里一维数组被扩展成了二维数组,和 的尺寸相同。示意图如下所示:

我们再来看一个需要对两个数组都做broadcasting的例子:

>>> b = np.arange(3).reshape((3,1))
>>> b
array([[0],
       [1],
       [2]])
>>> b + a
array([[123],
       [234],
       [345]])

在这里 都被扩展成相同的尺寸的二维数组。示意图如下所示:

总结broadcasting的一些规则:

  1. 如果两个数组维数不相等,维数较低的数组的shape进行填充,直到和高维数组的维数匹配。
  2. 如果两个数组维数相同,但某些维度的长度不同,那么长度为1的维度会被扩展,和另一数组的同维度的长度匹配。
  3. 如果两个数组维数相同,但有任一维度的长度不同且不为1,则报错。
>>> a = np.arange(3)
>>> a
array([012])
>>> b = np.ones((2,3))
>>> b
array([[1.1.1.],
       [1.1.1.]])
>>> a.shape
(3,)
>>> a + b
array([[1.2.3.],
       [1.2.3.]])

接下来我们看看报错的例子:

>>> a = np.arange(3)
>>> a
array([012])
>>> b = np.ones((3,2))
>>> b
array([[1.1.],
       [1.1.],
       [1.1.]])
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
ValueError: operands could not be broadcast together with shapes (3,) (3,2)

【二】Python中的实例方法、静态方法和类方法三者区别?

不用@classmethod和@staticmethod修饰的方法为实例方法。在类中定义的方法默认都是实例方法。实例方法最大的特点是它至少要包含一个self参数,用于绑定调用此方法的实例对象,实例方法通常可以用类对象直接调用。

采用@classmethod修饰的方法为类方法。类方法和实例方法相似,它至少也要包含一个参数,只不过类方法中通常将其命名为cls,Python会自动将类本身绑定给cls参数。我们在调用类方法时,无需显式为cls参数传参。

采用@staticmethod修饰的方法为静态方法。静态方法没有类似self、cls这样的特殊参数,因此Python的解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

【三】C/C++中常用容器功能汇总

vector(数组)

vector是封装动态数组的顺序容器。

成员函数:

  1. at():所需元素值的引用。
  2. front():访问第一个元素(返回引用)。
  3. back():访问最后一个元素(返回引用)。
  4. beign():返回指向容器第一个元素的迭代器。
  5. end():返回指向容器末尾段的迭代器。
  6. empty():检查容器是否为空。
  7. size():返回容器中的元素数。
  8. capacity():返回当前存储空间能够容纳的元素数。
  9. clear():清除内容。
  10. insert():插入元素。
  11. erase():擦除元素。
  12. push_back():将元素添加到容器末尾。
  13. pop_back():移除末尾元素。
  14. *max_element(v.begin(), v.end()):返回数组最大值。
  15. *min_element(v.begin(), v.end()):返回数组最小值。

queue(队列)

queue是容器适配器,他是FIFO(先进先出)的数据结构。

成员函数:

  1. front():访问第一个元素(返回引用)。
  2. back():访问最后一个元素(返回引用)。
  3. empty():检查容器是否为空。
  4. size():返回容器中的元素数。
  5. push():向队列尾部插入元素。
  6. pop():删除首个元素。

deque(双端队列)

deque是有下标顺序容器,它允许在其首尾两段快速插入和删除。

成员函数:

  1. front():访问第一个元素(返回引用)。
  2. back():访问最后一个元素(返回引用)。
  3. beign():返回指向容器第一个元素的迭代器。
  4. end():返回指向容器末尾段的迭代器。
  5. empty():检查容器是否为空。
  6. size():返回容器中的元素数。
  7. clear(): 清除内容。
  8. insert():插入元素。
  9. erase():擦除元素。
  10. push_back():将元素添加到容器末尾。
  11. pop_back():移除末尾元素。
  12. push_front():插入元素到容器起始位置。
  13. pop_front():移除首元素。
  14. at():所需元素值的引用。

set(集合)

集合基于红黑树实现,有自动排序的功能,并且不能存放重复的元素。

成员函数:

  1. begin()--返回指向第一个元素的迭代器。

  2. clear()--清除所有元素。

  3. count()--返回某个值元素的个数。

  4. empty()--如果集合为空,返回true。

  5. end()--返回指向最后一个元素的迭代器。

  6. erase()--删除集合中的元素。

  7. find()--返回一个指向被查找到元素的迭代器。

  8. insert()--在集合中插入元素。

  9. size()--集合中元素的数目。

unordered_set(无序集合)

无序集合基于哈希表实现,不能存放重复的元素。元素类型必须可以比较是否相等,因为这可以确定元素什么时候相等。

成员函数:

  1. empty():检查容器是否为空。
  2. size():返回容器中的元素数。
  3. insert():插入元素。
  4. clear():清除内容。
  5. count():返回匹配特定键的元素数量。
  6. find():寻找带有特定键的元素。
  7. erase()--删除集合中的元素。

unordered_map

unordered_map是关联容器,含有带唯一键的键-值对。

搜索、插入和元素移除拥有平均常数时间复杂度。

元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。

成员函数:

  1. empty():检查容器是否为空。
  2. size():返回可容纳的元素数。
  3. insert():插入元素。
  4. clear():清除内容。
  5. count():返回匹配特定键的元素数量。
  6. find():寻找带有特定键的元素。
  7. erase()--删除集合中的元素。

----【模型部署】----

【一】算法工程师该如何看待硬件侧知识?

GPU乃至硬件侧的整体逻辑,是CV算法工作中必不可少的组成部分,也是算法模型所依赖的重要物理载体。

GPU的相关知识

现在AI行业有个共识,认为是数据的爆发和算力的突破开启了深度学习在计算机视觉领域的“乘风破浪”,而其中的算力,主要就是指以GPU为首的计算平台。

GPU(Graphical Processing Unit)从最初用来进行图形处理和渲染(玩游戏),到通过CUDA/OpenCL库以及相应的工程开发之后,成为深度学习模型在学术界和工业界的底层计算工具,其有以下的一些特征:

  1. 异构计算:GPU能作为CPU的协处理器与CPU协同运算。
  2. 单指令流多数据流(SIMD)架构:使得同一个指令(比如对图像数据的一些操作),可以同时在多个像素点上并行计算,从而得到比较大的吞吐量,深度学习中大量的矩阵操作,让GPU成为一个非常适合的计算平台。
  3. 多计算核心。比如Nvidia的GTX980GPU中,在和i7-5960CPU差不多的芯片面积上,有其128倍的运算速度。GTX980中有16个流处理单元,每个流处理单元中包含着128个CUDA计算核心,共有2048个GPU运算单元,与此同时i7-5960CPU只有16个类似的计算单元。
  4. CUDA模块。作为GPU架构中的最小单元,它的设计和CPU有着非常类似的结构,其中包括了一个浮点运算单元,整型运算单元以及控制单元。一个流处理单元中的CUDA模块将执行同一个指令,但是会作用在不同的数据上。多CUDA模块意味着GPU有更加高的计算性能,但更重要的是在算法侧有没有高效地调度和使用
  5. 计算核心频率。即时钟频率,代表每一秒内能进行同步脉冲次数。就核心频率而言,CPU要高于GPU。由于GPU采用了多核逻辑,即使提高一些频率,其实对于总体性能影响不会特别大。
  6. 内存架构。GPU的多层内存架构包括全局内存,2级缓存,和芯片上的存储(包括寄存器,和1级缓存共用的共享内存,只读/纹理缓存和常量缓存)。

在使用GPU时,在命令行输入nvidia-smi命令时会打印出一张表格,其中包含了GPU当时状态的所有参数信息。

CUDA/cuDNN/OpenCL科普小知识:

  1. CUDA是NVIDIA推出的用于GPU的并行计算框架。
  2. cuDNN是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。
  3. OpenCL是由苹果(Apple)公司发起,业界众多著名厂商共同制作的面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境。

深度学习的端侧设备

深度学习的端侧设备,又可以叫做边缘计算设备,深度学习特别是CV领域中,模型+端侧设备的组合能够加快业务的即时计算,决策和反馈能力,极大释放AI可能性

深度学习的端侧设备主要由ARM架构的CPU+ GPU/TPU/NPU等协处理器 + 整体功耗 + 外围接口 + 工具链等部分组成,也是算法侧对端侧设备进行选型要考虑的维度。

在实际业务中,根据公司的不同,算法工程师涉及到的硬件侧范围也会不一样。如果公司里硬件和算法由两个部门分别负责,那么算法工程师最多接触到的硬件侧知识就是硬件性能评估,模型转换与模型硬件侧验证,一些硬件高层API接口的开发与使用;如果公司里没有这么细分的部门,那么算法工程师可能就会接触到端侧的视频编解码,模型推理加速,Opencv,FFmpeg,Tensor RT,工具链开发等角度的知识。

算法工程师该如何看待硬件侧

首先,整体上还是要将硬件侧工具化,把端侧设备当做算法模型的一个下游载体,会熟练的选型与性能评估更加重要

端侧设备是算法产品整体解决方案中一个非常重要的模块,算法+硬件的范式将在未来的边缘计算与万物智能场景中持续发力。

在日常业务中,算法模型与端侧设备的适配性与兼容性是必须要考虑的问题,端侧设备是否兼容一些特殊的网络结构?算法模型转化并部署后,精度是否下降?功耗与耗时能否达标?等等都让算法工程师的模型设计逻辑有更多的抓手。

【二】现有的一些移动端开源框架?

  1. NCNN,其GitHub地址:https://github.com/Tencent/ncnn
  2. Paddle Lite,其GitHub地址:https://github.com/PaddlePaddle/paddle-mobile
  3. MACE( Mobile AI Compute Engine),其GitHub地址:https://github.com/XiaoMi/mace
  4. TensorFlow Lite,其官网地址:https://www.tensorflow.org/lite?hl=zh-cn
  5. PocketFlow,其GitHub地址:https://github.com/Tencent/PocketFlow
  6. 等等。。。

----【图像处理基础】----

【一】有哪些常用的图像去噪算法?

  • 空间域去燥:均值滤波器,中值滤波器,低通滤波器,高斯滤波,双边滤波,引导滤波,NLM(Non-Local means)算法等。
  • 频域去燥:小波变换,傅里叶变换,离散余弦变换,形态学滤波等。

【二】有哪些常用的图像频域信息分离方法?

可以使用频域滤波器如小波变换,傅里叶变换,余弦变换,形态学滤波等方法将图像高低频信息分离。

----【计算机基础】----

【一】Linux系统的相关概念

Linux系统是一种操作系统(Operating System简称OS),它是软件的一部分,是硬件基础上的第一层软件,即硬件和应用软件沟通的桥梁。

Linux系统系统会控制其他程序运行,管理系统资源,提供最基本的计算功能,如管理及配置内存、决定系统资源供需的优先次序等,同时还提供一些基本的服务程序。Linux系统内核指的是提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。Linux发行套件系统是由 Linux系统内核与各种常用应用软件的集合产品。

在Linux系统中一切都是文件。在linux系统中,目录、字符设备、块设备、套接字、打印机等都被抽象成了文件,Linux系统中的一切文件都是从“根(/)”目录开始的,并按照树形结构来存放文件,且定义了常见目录的用途,文件和目录名称严格区分大小写。

Linux系统的文件目录结构

  • /usr:这是一个非常重要的目录,包含绝大多数的(多)用户工具和应用程序,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。
  • /lib:存放着系统开机时会用到的函数库,以及在/bin和/sbin下命令会调用的函数库,几乎所有的应用程序都需要用到这些共享库。
  • /var:存放不断扩充的内容,如经常被修改的目录、文件(包括各种日志文件)等。
  • /boot:存放启动Linux时所需的一些核心文件(linux内核文件),包括一些引导程序文件、链接文件、镜像文件等。
  • /home:用户的主目录,在Linux中,每个用户都有一个自己的目录,该目录名一般以用户账号命名,包含保存的文件、个人设置等。
  • /sbin:s就是Super User的意思,这里存放的是系统管理员使用的系统管理命令。
  • /bin:这个存放的是当前用户的系统管理命令(cat、cp、ps等)。
  • /etc:存放所有的系统管理所需的配置文件和子目录(例如人员的帐号密码文件,各种服务的起始文件等)。
  • /tmp:存放一些临时文件,在系统重启时临时文件将被删除。
  • /snap:Ubuntu 16.04及之后版本引入了snap包管理器,与之相关的目录、文件(包括安装文件)位于/snap中。
  • /lost+found:该目录一般情况下是空的,当系统非法关机后会在该目录生成一些遗失的片段。
  • /media:linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到该目录下。
  • /srv:该目录存放一些服务启动之后需要提取的数据。
  • /root:该目录为系统管理员用户主目录。
  • /opt:该目录存放安装的第三方软件,如Oracle数据库就可以安装到该目录下。
  • /mnt:挂载其他的文件系统(含硬盘分区)的目录。
  • /lib64:类似lib目录,存放64位库文件。
  • /srv:可以视作service的缩写,是一些网络服务启动后,这些服务需要取用的数据目录,常见的服务例如www,ftp等。
  • /proc:这个目录本身是一个虚拟文件系统,它放置的数据都是在内存当中,不占用硬盘的容量。
  • /sys:这个目录其实跟/proc非常的相似,也是一个虚拟的文件系统主要也是记录与内核相关的信息,不占用硬盘容量。
  • /dev:在linux中任何的设备和接口设备都是以文件的形式存在于这个目录当中。你只要到通过访问这个目录下的某个文件就相当于访问某个设备。

Linux系统种类

  • 红帽企业版Linux:RedHat是全世界内使用最广泛的Linux系统。它具有极强的性能与稳定性,是众多生成环境中使用的(收费的)系统。
  • Fedora:由红帽公司发布的桌面版系统套件,用户可以免费体验到最新的技术或工具,这些技术或工具在成熟后会被加入到RedHat系统中,因此Fedora也成为RedHat系统的试验版本。
  • CentOS:通过把RedHat系统重新编译并发布给用户免费使用的Linux系统,具有广泛的使用人群。
  • Deepin:在中国发行,对优秀的开源成品进行集成和配置。
  • Debian:稳定性、安全性强,提供了免费的基础支持,在国外拥有很高的认可度和使用率。
  • Ubuntu:是一款派生自Debian的操作系统,对新款硬件具有极强的兼容能力。Ubuntu与Fedora都是极其出色的Linux桌面系统,而且Ubuntu也可用于服务器领域

【二】Linux系统和Windows系统的区别?

  • Linux系统更稳定且有效率。
  • Linux系统是免费(或少许费用),而Windows系统是商业化主导。
  • Linux系统漏洞少且快速修补。
  • Linux系统支持多用户同时使用计算机。
  • Linux系统有更加安全的用户与文件权限策略。
  • Linux系统可以访问源代码并根据用户的需要修改代码,而Windows系统不能访问源代码。
  • Linux系统更能支持多种深度学习配套软件,但是windows系统能支持大量的视频游戏软件。

----【开放性问题】----

这些问题基于我的思考提出,希望除了能给大家带来面试的思考,也能给大家带来面试以外的思考。这些问题没有标准答案,我相信每个人心中都有自己灵光一现的创造,你的呢?

【一】你觉得有哪些方法能增强公司的AI影响力?

AI除了落地,还有持续的愿景。这个问题启发我们,除了日常的技术深耕,也需要思考未来AI的发展趋势。如何扩大公司的AI影响力,是AI从业人员有必要去思考的一个维度。

【二】你觉得面对一个业务场景,如何针对性设计算法解决方案?

这是一个非常有价值的问题,随着的AI更加务实的落地,业务场景和算法解决方案的适配是非常关键的。如何获得针对性设计的能力,需要对现有现金流业务的深耕,以及提升产品侧视野的广度

精致的结尾

最后,感谢大家读完这篇文章,希望能给大家带来帮助~后续Rocky会持续撰写“三年面试五年模拟”之独孤九剑的系列文章,大家敬请期待!

Rocky一直在运营技术交流群(WeThinkIn-技术交流群),这个群的初心主要聚焦于技术话题的讨论与学习,包括但不限于CV算法,算法,开发,IT技术以及工作经验等。群里有很多人工智能行业的大牛,欢迎大家入群一起学习交流~(请添加小助手微信Jarvis8866,拉你进群~)

分类:

人工智能

标签:

人工智能

作者介绍

WeThinkIn
V1