推广 热搜: 公司  快速  上海  中国  未来    企业  政策  教师  系统 

CV面试题(持续更新!!!)

   日期:2024-11-17     作者:xinet    caijiyuan   评论:0    移动:http://dfvalve.xrbh.cn/mobile/news/10256.html
核心提示:反卷积又叫做转置卷积,在计算机中计算的时候,转置卷积先将卷积核转为稀疏矩阵C的形式,然后计算的时候正向

反卷积又叫做转置卷积,在计算机中计算的时候,转置卷积先将卷积核转为稀疏矩阵C的形式,然后计算的时候正向传播的时候左乘这个稀疏矩阵C的转置,反向传播的时候左乘这个稀疏矩阵C。 一般的卷积运算可以看成是一个其中非零元素为权重的稀疏矩阵C与输入的图像进行矩阵相乘,反向传播时的运算实质为C的转置与loss对输出y的导数矩阵的矩阵相乘 反卷积的运算过程与卷积正好相反,是正向传播时左乘C的转置,反向传播时左乘C

CV面试题(持续更新!!!)

实现上采样;近似重构输入图像,卷积层可视化

判别模型,直接输出类别标签,或者输出类后验概率p(y|x)

Batch Normalization就是在batch纬度上做正交归一化,GN就是在channel维度上对每个group做正交归一化。此博文很详细

(1)从模型结构上来说分为:模型剪枝,模型蒸馏,NAS自动学习模型结构等。 (2)模型参数量化上包括数值精度量化到FP16等。 注:模型剪枝的例子很多出现在轻量化网络上面,比如mobilenet v3里面出现的group conv,更改网络末端计算量大的层。深度分离卷积等。 模型蒸馏就是迁移学习。 参数量也在mobilenet v3里面有体现,减少网络头部的卷积核的数量。

交并比。

详见我的这篇博文 IOUloss的出现是因为 1、我们平时的loss函数是基于正则的误差函数,检测评价的方式是使用IoU,而实际回归坐标框的时候是使用4个坐标点,如下图所示,是不等价的; 2、L1或者L2 Loss相同的框,其IoU 不是唯一的,通过4个点回归坐标框的方式是假设4个坐标点是相互独立的,没有考虑其相关性,实际4个坐标点具有一定的相关性 3、基于L1和L2的距离的loss对于尺度不具有不变性 CV面试题(持续更新!!!) giou = iou - (|(C-AuB)|/|C|) 解决了iou部分重叠无法判断后续方向的问题。无法分辨对齐方式的问题。 DIOU = 1 - IOU + (P2/C2) 收敛速度快,量化了水平和垂直方向的的收敛问题 CIOU = DIOU + AV 解决了长宽比收敛的问题

提示:内存/显存占用;模型收敛速度等

Hessian矩阵是n*n, 在高维情况下这个矩阵非常大,计算和存储都是问题。

mini-batch太小会导致收敛变慢,太大内存利用率提高了,但是内存容量可能撑不住了,精度降低。泛化性不好。

dropout的原理就是在网络前向传播的时候,让神经元的激活值以一定的概率变为零,这样可以使模型的泛化性能更强。

前向:训练时,利用伯努利分布,随机选出一个只包含0,1的mask矩阵,然后用这个mask矩阵去对应乘上每个输入得到的就是Dropout后的结果,再除以(1-p;测试的时候不用Dropout 反向:训练时根据mask来求对应的梯度,测试时无Dropout

dropout为什么可以防止过拟合呢? 1、dropout其实相当于我们日常用到的基于平均的ensemble,ensemble有两种方式,基于平均的ensemble和投票的ensemble。对于网络中的部分神经元进行概率暂时舍弃,这样相当于训练了多个网络。 2、dropout还取消了神经元之间的共适应关系,使得网络的输出不依赖于网络中的某些隐含节点的固定作用,使模型的鲁棒性更好。 3、类似于生物进化的角色,环境的变化不会对物种造成毁灭性的影响。

代码

 
 

1、小目标对应的anchor(4-6)比较少,其对应的feature map上的pixel难以得到训练,这也是为什么SSD在augmentation之后精确度上涨(因为crop之后小目标就变为大目标) 2、要检测小目标需要足够大的feature map来提供精确特征,同时也需要足够的语义信息来与背景作区分

1、pooling操作虽然能增大感受野,但是会丢失一些信息。空洞卷积在卷积核中插入权重为0的值,因此每次卷积中会skip掉一些像素点

2、空洞卷积增大了卷积输出每个点的感受野,并且不像pooling会丢失信息,在图像需要全局信息或者需要较长sequence依赖的语音序列问题上有着较广泛的应用。

CV面试题(持续更新!!!) 作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。

主要分为离线增强和在线增强的方法。 离线增强是指数据集在本地进行处理。 在线增强:翻转(水平,垂直,旋转,缩放,裁剪,平移,添加噪声等。

1、网格搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。 2、贝叶斯优化:贝叶斯优化其实就是在函数方程不知的情况下根据已有的采样点预估函数最大值的一个算法。该算法假设函数符合高斯过程(GP)。

卷积的作用:相当于滤波器,提取图片不同的特征,生成feature_map 激活函数的作用:引入非线性因素 池化的作用:1、减少特征维度大小,使特征更加可控,减少参数个数,从而控制过拟合程度,增加网络对略微变换后的图像的鲁棒性;2、达到一种不变性,包括translation,rotation,scale等。3、会造成梯度稀疏,丢失信息,GAN网络中通常使用带步长的卷积,进行下采样来替代pooling。 全连接的作用:对提取到的特征进行分类和回归。

通过控制卷积核个数实现升维或者降维,从而减少模型参数 对不同特征进行归一化操作(BN),增加非线性(relu) 用于不同channel上特征的融合

激活函数分为两类,饱和激活函数和不饱和激活函数。 饱和激活函数的代表是sigmoid,tanh。特点是:收敛慢,容易梯度消失。 非饱和激活函数的特点是:收敛快,抑制梯度消失,抑制过拟合。 sigmoid:计算量大。梯度消失,会改变原始数据分布。 tanh:计算量大,梯度消失比sigmoid好点 relu:计算简单,有效防止了梯度消失和梯度爆炸,会出现神经元死亡。 leakrelu:解决了神经元死亡的问题,但是多了一个参数a ELU:避免dying神经元,并且处处连续,从而加速SGD,但是计算比较复杂

并不能说明这个模型无效,导致模型不收敛的原因可能有数据分类的标注不准确;样本的信息量太大导致模型不足以fit整个样本空间

学习率设置的太大容易产生震荡,太小会导致不收敛;可能复杂的分类任务用了简单的模型;数据没有进行归一化的操作。

Python可以用opencv,pillow和SKimage库来读取图片并处理。 pytorch可以用unsequeeze(0),tensorflow可以用expand dim来增加维度。

信号前向传播,误差反向传播,通过不断调节网络的权重,使得网络的最终输出与期望输出尽可能接近。前项过程中通过与正确的标签计算损失,反向传递损失,更新参数,优化至最后的参数。

1、牛顿法的目标函数是二阶导数,在高维的情况下这个矩阵非常大,计算和储存都是问题。 2、在小批量的情况下,牛顿法对噪声的估计太大。 3、在目标函数非凸的情况下,牛顿法易受到鞍点和极大值点的吸引。

KL散度又叫做相对熵 CV面试题(持续更新!!!) 也可以写为CV面试题(持续更新!!!)CV面试题(持续更新!!!) 交叉熵CV面试题(持续更新!!!) 所以:相对熵 = 交叉熵-熵

finetune就是通过修改预训练网络模型结构(如修改模型类别输出个数等)选择性的载入预训练网络模型的权重(载入除最后的全连接层之前的所有层)再用自己的数据集重新训练模型。

finetune的实践建议: 预训练模型的限制,不能随意修改模型的网络架构,但是可以输入任意的图片。 学习率:与重新训练相比,finetune需要使用更小的学习率。

第一个feature_map的感受野默认为1,感受野的计算公式:r=r*stride+(k-1) 这里r是上一层的感受野,stride是步长,k是kernel_size。

全局stride等于所有stride的累乘。

全局padding:

对输入图像用多个不同尺寸的卷积核,池化操作进行同时处理,然后将输出结果进行通道拼接。

核函数将数据映射到更高维的空间后处理,但是不用这种显式的映射,而是现将两个向量做内积,然后再用核函数做映射。这样做等价于先做映射,再做内积,而且避免了高维空间复杂的内积运算。

1)降低网络下采样率与空洞卷积,主要是针对小物体的检测(2)根据任务,设计更好的anchor来匹配(3)多尺度MST的训练,虽然耗时会严重一些(4)特征融合,类似于FPN、DetNet、RefineDet等都采取了特征融合的方式(5)SNIP:很好的多尺度问题的思考(6)TridentNet:利用空洞卷积实现了多个尺度分离的检测 SNIP(Scale Normalization for Image Pyramids)主要思路

在训练和反向传播更新参数时,只考虑那些在指定的尺度范围内的目标,由此提出了一种特别的多尺度训练方法。

mobileNet虽然在计算量上减少了很多,但是由于深度可分离卷积的操作,使得网络的层数增加了很多,而我们的GPU计算是并行数据处理,假设GPU内存足够大的话所以GPU计算的速度核心是网络的层数。

最naive的方法,先都设置为1然后训一段时间之后看loss的收敛情况,然后调整权重使得这些loss传回去的梯度都在一个数量级上…

首先由于病态曲率的存在会导致训练减慢以及局部极小值的问题。所以有了接下来的优化函数。 详解看我的博文 1、SGD算法在训练过程中很有可能选择被标记错误的标记数据,或者与正常数据差异很大的数据进行训练,那么使用此数据求得梯度就会有很大的偏差,因此SGD在训练过程中会出现很强的随机现象。SGD一次只进行一次更新,没有冗余,可以新增样本。但是SGD更新会造成严重的震荡。 所以出现了mini-batch梯度下降。 2、在随机梯度的学习算法中,每一步的步幅都是固定的,而在动量学习算法中,每一步走多远不仅依赖于本次的梯度的大小还取决于过去的速度。速度v是累积各轮训练参的梯度。动量法可以加速SGD,并且抑制震荡,使得梯度方向不变的维度更新更快,梯度方向改变的维度更新变慢,可以加快收敛,减少震荡,但是需要一定的先验知识。 3、前面的随机梯度和动量随机梯度算法都是使用全局的学习率,所有的参数都是统一步伐的进行更新的。AdaGrad其实很简单,就是将每一维各自的历史梯度的平方叠加起来,然后更新的时候除以该历史梯度值即可。所以Adagrad对低频的参数有较大的更新,对高频的参数有较小的更新,因此,对于稀疏的数据他的表现很好。缺点是Adagrad的学习率会不断收缩,最终变得非常小。 4、虽然AdaGrad在理论上有些较好的性质,但是在实践中表现的并不是很好,其根本原因就是随着训练周期的增长,学习率降低的很快。而RMSProp算法就在AdaGrad基础上引入了衰减因子 5、虽然动量加速了我们对最小值方向的搜索,但RMSProp阻碍了我们在振荡方向上的搜索.Adam通过名字我们就可以看出他是基于动量和RMSProp的微调版本,该方法是目前深度学习中最流行的优化方法。

如果数据是稀疏的就用自适应的方法,比如说:Adagrad,Adam,RMSprop等,大多数情况下Adam都可以取得比较好的效果,但是SGD在有比较好的初始化条件下,可以更快的收敛,也可以找到最小点。

CV面试题(持续更新!!!)

loss的问题: 1、训练过程中loss为负数: 【原因】输入的训练数据没有归一化造成 【解决方法】把输入数值通过下面的函数过滤一遍,进行归一化 inputdata = (inputdata-inputdata.min())/(inputdata.max()-inputdata.min()) 2、怎么看loss和acc的变化 train loss 不断下降,test loss不断下降,说明网络仍在学习; train loss 不断下降,test loss趋于不变,说明网络过拟合; train loss 趋于不变,test loss不断下降,说明数据集100%有问题; train loss 趋于不变,test loss趋于不变,说明学习遇到瓶颈,需要减小学习率或批量数目; train loss 不断上升,test loss不断上升,说明网络结构设计不当,训练超参数设置不当,数据集经过清洗等问题。 3、初始学习率设置的问题: 可以从0.0001到0.1每次扩大10倍试验,直到验证集上的loss增大。 一般0.01-0.1左右 mmdetection上面有自己的学习率设置方式,一般为0.125batch_sizegpus。 4、样本不平衡问题。(具体的我会另外再开一篇博文) 样本不平衡呈现长尾分布,解决方案: a、上采样增强 b、下采样增强 c、训练动态加权采样 d、稀少数据专家模型

满足非线性,几乎处处可导,单调的函数可以用作激活函数

见这篇博文

其实这两个是一样的,公式推导一下就知道了。https://zhuanlan.zhihu.com/p/35138077

过拟合就是训练集上表现好但是验证集上表现不好。 欠拟合就是训练集上loss不降低,学习能力弱。

产生原因: 过拟合产生的原因:模型太复杂,样本噪声多,决策树容易过拟合,iou阈值过高,训练集迭代次数太多。 欠拟合:模型复杂度低。数据不纯净。

解决方案: 过拟合: 1、正则化,l1,l2 2、dropout 3、早停,earlystoping 4、数据增广

欠拟合: 1、增加模型复杂度 2、数据预处理

详见链接

同步训练存在木桶效应,需要各个设备的计算能力要均衡,而且要求集群的通信也要均衡。

异步模式理论上存在缺陷,容易发生梯度失效问题,但因为mini-batch随机梯度下降本身就是梯度下降的一个近似解法,且即使是梯度下降也无法保证全局最优。

在实际应用中,在相同时间内使用异步模式训练的模型不一定比同步模式差。所以这两种训练模式在实践中都有非常广泛的应用。

TensorFlow 是一款强大而成熟的深度学习库,有强大的可视化性能,以及用于高水平模型开发的多个选项。 PyTorch 仍然是个比较年轻的框架,但发展迅速。

链接

首先loss出现nan,由于loss函数的使用不正确。 loss震荡,检查数据是否归一化,调整学习率,查看是否有梯度回传,使用大的模型。

链接

囚徒困境

链接

排序算法的稳定性是指,排序后会不会变换两个相等元素在原数组中的顺序。可查看 CV面试题(持续更新!!!)

就是通过一个二叉树来进行排序的算法。大顶堆就是父节点大于等于子节点,小顶堆相反。

列表生成式: [x * x for x in range(1, 11)]

#1.使用列表推导式 [x2 for x in range(1,21)] #使用lambda [(lambda x:x2)(x) for x in range(1,21)]

#2.使用map函数 def cube(x): return x**2 list(map(cube,range(1,21))) #使用map+lambda list(map(lambda x:x*x,range(1,21)))

元组不可以随意增加或者删除元素,数组可以。

它是省略所有的冒号来用省略号代替,大家看这个a[:, :, None]和a[…, None]的输出是一样的,就是因为…代替了前面两个冒号。这下应该清楚了。

继承的作用是代码重用,多态是为了接口重用。 继承:用类派生从一个类继承另一个类,派生类继承基类的成员。 多态:编译或运行时决定使用基类中定义的函数还是使用派生类中定义的函数。‘一个接口,多种方法’。 多态又分为静态多态和动态多态。静态多态是指在编译期间就可以确定函数调用的地址,并生成代码。静态多态往往通过函数重载来实现,调用速度快,效率高但缺乏灵活性。 动态多态则需要在运行的时候才可以确定函数调用的地址。动态多态通过虚函数来实现,虚函数允许通过派生类重新定义成员函数而派生类重新定义基类的做法称为覆盖或者重写。

成员函数分为静态成员函数和非静态成员函数,非静态成员函数分为普通函数和虚函数。

KNN:计算你要预测的点的周围最近的K个点,然后取这k个点中最多的类定义为你要预测的这个点所属的类型。

朴素贝叶斯:如下图,又因为特征之间发生的概率是独立的,所以叫做朴素贝叶斯。CV面试题(持续更新!!!) 感知机:感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化。

SVM:支持向量机有三个部分的内容,线性可分支持向量机,软间隔支持向量机,核函数。SVM的目标就是找到最大间隔超平面。

逻辑回归

CV面试题(持续更新!!!)

可以采用多个二分类组合的方式。例如:1对1,1对多,多对多等。

随机选择K个样本作为类中心,将样本随机划分成K个子集然后计算类中心。

偏差描述的是网络的真实输出和期望输出之间的差距,方差描述的是训练模型中各个预测结果之间的差异。所以:高方差,说明拟合程度好,但是过拟合风险较高;高偏差,说明拟合程度差,欠拟合,有很大的误差。 当模型较为复杂的时候。偏差变小,方差变大。(模型复杂容易导致过拟合

CV面试题(持续更新!!!) vaild : new_height = new_width = (W – F + 1) / S (结果向上取整) SAME: new_height = new_width = W / S (结果向上取整

F1 score的含义就是认为召回率和准确率一样重要,F2就是认为召回率比准确率重要2倍。。。

对于一个一般问题,KKT条件是取得极值的必要条件而不是充分条件,对于凸优化问题,KKT条件则是充分条件,SVM是凸优化问题。

当特征数量较少时,增加特征可以提高算法的精度,但是当向量的维数增加到一定的数量之后,再增加特征,算法的精度反而会下降。

这是合页损失的损失函数,可以看得出来以SVM为模型的话,距离支持向量越远,其损失越大。

原问题不易求解,含有大量不易处理的不等式约束。原问题满足slater条件,强对偶成立,因此原问题与对偶问题成立。

1、增大batch_size同时增大学习率,若初始学习率为0.1,则学习率变化为 0.1*batch_szie/256 2、lr warm up 3、residual的BN中γ初始化为0 4、no bias decay 5、降低精度 float16 6、cos退火 学习率 7、label smoothing 8、知识蒸馏 9、mix_up cutout 随机裁剪,数据增强等

前向传播: 后向传播:当k=i时: 上式可简化为: 当k !=i时: 两者合并起来为

对于 Attention,主要分为 hard attention以及 soft attention

针对 hard attention,主要将位置信息看做多元伯努利分布,利用最大 似然估计,求得变分下界。再利用杰森不等式,对参数矩阵求梯度进行优化,使用N次蒙特卡洛采样来近似,在蒙特卡洛方法估计梯度时采用滑动平均来减少梯度的方差。为了进一步减小方差,引入多远伯努利分布的熵 对于一张给定图片,50%的概率将s位置设置为它的期望。其最后的训练 规则类似于强化学习

针对 soft attention,主要分为三步 1.将 query跟每个key进行相似度计算得到权重,常用的相似度函数有 点积、拼接、感知机等。 2.使用一个 softmax函数对这些权重进行归一化。 将权重与相应的键值 value进行加权求和得到最后的 attention。而目前很多研究中,key跟vlue常常是同一个。 attention计算流程如图所示 CV面试题(持续更新!!!)

链接

有2n个0,1,求每一时刻1都比0多的序列的个数。 CV面试题(持续更新!!!)

需要满足AA^T =E或者A^TA=E(T是转置

CV面试题(持续更新!!!)

有向图模型(贝叶斯网络:依赖关系仅存在于父子节点之间。如:NB、HMM、朴素贝叶斯、深度信念网络 无向图模型(马尔科夫网络:依赖关系通常基于全连通子图来分割。如:LR、MEM(LR 的通用形式)、CRF、 参考:https://blog.csdn.net/lipengcn/article/details/83277314

CV面试题(持续更新!!!)

1、数字类型 2、bool类型 3、字符串类型 4、列表 5、元组:不可修改的列表 6、集合:无序,去重,不含可变类型的元素 7、字典

1、DataLoader()加载数据 2、初始化权重和bais 3、optim 优化方式,学习率学习方式 4、损失函数 torch.nn. 5、Conv,pool,relu,dropout,FC等 6、反向传播 loss.backword 7、保存模型 torch.save 加载模型 torch.load

与交叉熵的区别: 交叉熵就是简单地分类one_hot,ctcloss的话会包含序列的信息,提升分类准确率。 CTCLOSS解决的问题就是:输入与输出的label不需要完全对齐,CTC允许我们的神经网络在任意一个时间段预测label,只有一个要求—输出序列的顺序是正确的就好。 CTCLoss中两个重复字符中间的blank不会消除这两个重复字符ab_bc ------abbc

真实概率*log(1/预测概率)。

首先sigmoid是一个非线性的激活函数,神经网络的非线性是通过非线性的激活函数和多层网络的融合叠加实现的。

1、手肘法:计算每个聚类的均方误差和,画出曲线图,拐点处即为。 2、计算每个聚类的 gap = 类内距离/类间距离 3、随机采样进行聚类。

在线性回归的基础上做sigmoid。 CV面试题(持续更新!!!)

广度优先搜索算法的搜索步骤一般是

 

深度优先搜索的步骤是递归栈

hashmap:就是通过hash函数映射到数组的某一位置。 hash冲突(解决方案: HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

详见逻辑回归

增加数据集,数据增广,降低iou阈值,模型融合。

修饰变量或者方法作为全局变量或者全局方法使用

CV面试题(持续更新!!!)

CV面试题(持续更新!!!)

Adam是一阶动量和二阶动量的组合共同决定。SGD的话就是简单地梯度更新。 Adam会出现不收敛和错过全局最优解的现象。 所以比较好的方案是采用Adam+SGD的方案。

引入计数,垃圾回收,内存池机制

变量名通过引用对象获取对象的类型和值。

只要调用这个引用,引用计数就会增加,引用计数为0的时候就会启动垃圾回收机制。

容器对象说明了两个对象通过赋值语句进行调用的时候是指向同一块内存空间的。所以其中一个变量增加另一个变量也会增加。

内存池机制。 以256k为界限,大内存使用malloc进行内存分配,小内存使用内存池进行分配。

一般程序的由new产生的动态数据存放在堆区,函数内部的自动变量存放在栈区。自动变量一般会随着函数的退出而释放空间,静态数据(即使是函数内部的静态局部变量)也存放在全局数据区。全局数据区的数据并不会因为函数的退出而释放空间。

静态库的扩展名是.a 动态库的扩展名是.so

静态库:这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。

动态库:这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。然而,对动态库而言,就不是这样。动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库。由于动态库节省空间,linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

三点总结 参数的硬共享;loss函数的统一修正;学习率的分组和全局优化。

将离散特征的取值映射到了欧式空间

本质上是一致的 交叉熵其实就是最大似然估计对二项分布的估计,然后再对其取-log所得。

本文地址:http://dfvalve.xrbh.cn/news/10256.html    迅博思语资讯 http://dfvalve.xrbh.cn/ , 查看更多
 
标签: 面试题
 
更多>同类行业资讯
0相关评论

新闻列表
企业新闻
推荐企业新闻
推荐图文
推荐行业资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  粤ICP备2023022329号