CV&感知算法面试常见手撕代码题目汇总(一)【附参考实现代码】

在如今互联网大厂面试环节中,现场手撕代码已经成为了每位面试者必须要经历的一关。目前85%以上的互联网公司都将面试者的现场编程能力作为能否拿到Offer的核心评价指标。如果可以在规定时间内流畅、顺利完成面试官给出题目的候选人,拿到高质量面评的概率要比其他人高出很多。

本文作为《一站式智驾感知算法求职宝典》专栏CV&感知算法面试常见手撕代码题目汇总系列第一篇文章,本篇内容包含:2D卷积实现BN归一化层实现NMS非极大值抑制实现Soft NMS实现两个水平矩形框IoU计算实现五道算法手撕代码题目,并给出了参考实现代码。

CV&感知算法面试常见手撕代码题目汇总系列将会持续为大家收录和整理互联网大厂面试中的高频手撕算法题目,并且给出参考实现代码,便于同学们实习和求职前复习,从而在面试手撕代码环节更加游刃有余!

《一站式智驾感知算法求职宝典》专栏包含诸多高质量求职内容系列,并且包含

  • 如何制作一份高质量个人简历保姆级教程
  • 如何包装论文成果&科研项目&实习工作话术
  • 十五家自动驾驶感知算法面经(附参考答案)
  • 互联网大厂在线笔试ACM模式常见输入输出类型题目汇总(附Python和C++两种语言参考答案)
  • CV&感知算法面试常见手撕代码题目汇总

无论你是即将开始秋招的应届毕业生,还是打算找实习的算法小白,《一站式智驾感知算法求职宝典》都将是你求职路上的得力助手!

一、2D卷积实现

题目要求:实现一个2D卷积的计算过程,要求考虑卷积步长、图像Padding、卷积核窗口大小以及卷积核输入输出通道数量。

import numpy as np

def Conv2d(x, in_channels, out_channels, kernel, stride, padding):
    # x.shape = bs, cin, hin, win
    # kernel.shape = cout, cin, kh, kw
    bs, cin, hin, win = x.shape
    cout, cin, kh, kw = kernel.shape
    out_h = (hin + 2 * padding - kh) // stride + 1
    out_w = (win + 2 * padding - kh) // stride + 1
    x = np.pad(x, [(0, 0), (0, 0), (padding, padding), (padding, padding)]) # padding

    out = np.zeros((bs, out_channels, out_h, out_w))
    # convolution process.
    for i in range(bs):
        for j in range(out_channels):
            for h in range(out_h):
                for w in range(out_w):
                    for c in range(in_channels):
                        for k_h in range(kh):
                            for k_w in range(kw):
                                out[i, j, h, w] += x[i, c, h * stride + k_h, w * stride + k_w] * kernel[j, c, k_h, k_w]
    return out
  
if __name__ == '__main__':
    input = np.random.standard_normal(size=(2, 2, 5, 5))
    kernel = np.random.standard_normal(size=(4, 2, 3, 3)) # kernel = [cout, cin, kh, kw]
    out = Conv2d(x=input, in_channels=2, out_channels=4, kernel=kernel, stride=1, padding=1)
    print(out.shape)  # 测试输出张量维度
    print(out)

二、BN归一化层实现

题目要求:实现Batch Normalization层

import torch
import torch.nn as nn

class BnLayer(nn.Module):
    def __init__(self, feat_nums):
        super(BnLayer, self).__init__()
        self.feat_nums = feat_nums
        self.eps = 1e-5
        self.momentum = 0.9
        shape = (1, feat_nums, 1, 1)
        self.gamma = nn.Parameter(torch.ones(shape), requires_grad=True)
        self.beta = nn.Parameter(torch.zeros(shape), requires_grad=True)
        self.moving_mean = torch.zeros(shape)
        self.moving_var = torch.ones(shape)

    def forward(self, x):
        if self.moving_mean.device != x.device:
            self.moving_mean = self.moving_mean.to(x.device)
            self.moving_var = self.moving_var.to(x.device)
        y, self.moving_mean, self.moving_var = batch_norm(x, self.gamma, self.beta

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

作为24届上岸自动驾驶感知算法的学长,将自己在秋招中的面试经验和心得体会总结成《一站式智驾感知算法求职宝典》,宝典包含【求职简历如何准备】、【论文/实习/科研项目经历如何包装】、【Leetcode算法刷题思路】、【十五家智驾感知算法面经汇总(附参考答案)】、【CV&感知算法面试常见代码题目汇总(附参考代码)】、【互联网大厂笔试ACM模式输入输出类型题目汇总】等多个板块,祝你拿下心仪Offer!

全部评论

相关推荐

评论
5
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务