AI算法工程师-非leetcode题目总结

AI算法工程师-非leetcode题目总结

  • 除了Leetcode你还需要这些
    • 实现nms
    • 旋转矩形IOU
    • 手动实现BN
    • 手动实现CONV
    • 实现CrossEntropyLoss

除了Leetcode你还需要这些

希望大家留言,我可以进行补充。持续更新~~~

实现nms


import numpy as np
def nms(dets, threshold):x1 = dets[:, 0]y1 = dets[:, 1]x2 = dets[:, 2]y2 = dets[:, 3]score = dets[:, 4]area = (x2 - x1 +1)* (y2-y1+1)keep = []order = score.argsort()[::-1]while len(order) >= 1:i = order[0]keep.append(i)xx1  = np.maximum(x1[i], x1[order[1:]])yy1 = np.maximum(y1[i], y1[order[1:]])xx2 = np.minimum(x2[i], x2[order[1:]])yy2 = np.minimum(y2[i], y2[order[1:]])w = np.maximum(xx2-xx1 +1, 0)h = np.maximum(yy2-yy1+1, 0)inter = w * hiou = inter / (area[i] + area[order[1:]] - inter)idx = np.where(iou <= threshold)[0]order = order[idx+1]return keepdets = np.array([[10, 10, 50, 50, 0.9] , [20, 20, 50, 50, 0.8] ,[50, 50, 100, 100, 0.7] ])
print(nms(dets, 0.5))

旋转矩形IOU


import numpy as np
import cv2# 中心点 矩形的w h, 旋转的theta(角度,不是弧度)
def iou_rotate_calculate(boxes1, boxes2):area1 = boxes1[:, 2] * boxes1[:, 3]area2 = boxes2[:, 2] * boxes2[:, 3]ious = []for i, box1 in enumerate(boxes1):temp_ious = []r1 = ((box1[0], box1[1]), (box1[2], box1[3]), box1[4])for j, box2 in enumerate(boxes2):r2 = ((box2[0], box2[1]), (box2[2], box2[3]), box2[4])int_pts = cv2.rotatedRectangleIntersection(r1, r2)[1]if int_pts is not None:order_pts = cv2.convexHull(int_pts, returnPoints=True)int_area = cv2.contourArea(order_pts)inter = int_area * 1.0 / (area1[i] + area2[j] - int_area)temp_ious.append(inter)else:temp_ious.append(0.0)ious.append(temp_ious)return np.array(ious, dtype=np.float32)

手动实现BN

y = x − m e a n / v a r + e − 6 , . y = x - mean /var+e^-6,. y=xmean/var+e6,.
BN在训练的过程中和测试的过程中应该如何设置:
训练时的数据量大,分布更加稳定;eval数据量有限不建议大规模更改mean和var;
eval: trainning=False, track_running_stats=True。这个是期望中的测试阶段的设置,此时BN会用之前训练好的模型中的(假设已经保存下了)running_mean和running_var并且不会对其进行更新。一般来说,只需要设置model.eval()其中model中含有BN层,即可实现这个功能。
train: trainning=True, track_running_stats=True。这个是期望中的训练阶段的设置,此时BN将会跟踪整个训练过程中batch的统计特性。


import numpy as np
class BN:def __init__(self, momentum, eps, num_features):"""初始化参数值:param momentum: 追踪样本整体均值和方差的动量:param eps: 防止数值计算错误:param num_features: 特征数量"""# 对每个batch的mean和var进行追踪统计self._running_mean = 0self._running_var = 1# 更新self._running_xxx时的动量self._momentum = momentum# 防止分母计算为0self._eps = eps# 对应论文中需要更新的beta和gamma,采用pytorch文档中的初始化值self._beta = np.zeros(shape=(num_features, ))self._gamma = np.ones(shape=(num_features, ))def batch_norm(self, x):"""BN向传播:param x: 数据:return: BN输出"""x_mean = x.mean(axis=0)x_var = x.var(axis=0)# 对应running_mean的更新公式self._running_mean = (1-self._momentum)*x_mean + self._momentum*self._running_meanself._running_var = (1-self._momentum)*x_var + self._momentum*self._running_var# 对应论文中计算BN的公式x_hat = (x-x_mean)/np.sqrt(x_var+self._eps)y = self._gamma*x_hat + self._betareturn y

手动实现CONV

使用了简化版本,类实现的太多了,背不上;

import numpy as npdef conv2d_numpy(input_data, kernel, stride=1, padding=0):# 获取输入数据的尺寸input_height, input_width = input_data.shape# 获取卷积核的尺寸kernel_height, kernel_width = kernel.shape# 计算输出图像的尺寸output_height = (input_height - kernel_height + 2 * padding) // stride + 1output_width = (input_width - kernel_width + 2 * padding) // stride + 1# 初始化输出图像output_data = np.zeros((output_height, output_width))# 填充输入数据(根据填充数量添加额外的行和列)if padding > 0:input_data = np.pad(input_data, ((padding, padding), (padding, padding)), mode='constant')# 执行卷积操作for i in range(0, input_height - kernel_height + 1, stride):for j in range(0, input_width - kernel_width + 1, stride):output_data[i // stride, j // stride] = np.sum(input_data[i:i + kernel_height, j:j + kernel_width] * kernel)return output_data# 创建一个示例的二维图片数据(4x4 像素)
image = np.array([[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],[13, 14, 15, 16]], dtype=np.float32)# 定义一个卷积核(滤波器)
kernel = np.array([[1, 1],[0, -1]], dtype=np.float32)# 执行自定义的卷积操作
result = conv2d_numpy(image, kernel, stride=1, padding=0)# 打印卷积结果
print(result)

实现CrossEntropyLoss

import torchdef my_cross_entropy(input, target, reduction="mean"):# input.shape: torch.size([-1, class])# target.shape: torch.size([-1])# reduction = "mean" or "sum"# input是模型输出的结果,与target求loss# target的长度和input第一维的长度一致# target的元素值为目标class# reduction默认为mean,即对loss求均值# 还有另一种为sum,对loss求和# 这里对input所有元素求expexp = torch.exp(input)# 根据target的索引,在exp第一维取出元素值,这是softmax的分子tmp1 = exp.gather(1, target.unsqueeze(-1)).squeeze()# 在exp第一维求和,这是softmax的分母tmp2 = exp.sum(1)# softmax公式:ei / sum(ej)softmax = tmp1 / tmp2# cross-entropy公式: -yi * log(pi)# 因为target的yi为1,其余为0,所以在tmp1直接把目标拿出来,# 公式中的pi就是softmax的结果log = -torch.log(softmax)# 官方实现中,reduction有mean/sum及none# 只是对交叉熵后处理的差别if reduction == "mean": return log.mean()else: return log.sum()my_cross_entropy([1, 0], [1,1])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679917.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五(一)java高级-集合-集合与迭代器(二)

5.1.2 Iterator迭代器 1、Iterator 所谓迭代器&#xff1a;就是用于挨个访问集合元素的工具/对象 方法&#xff1a; boolean hasNext():判断当前遍历集合后面是否还有元素可以迭代Object next():取出当前元素&#xff0c;并往后移→noSuchelementExceptionvoid remove():删…

通过容器化释放云的力量

NCSC (英国国家网络安全中心) 经常被问到的一个问题是是否在云中使用容器。这是一个简单的问题&#xff0c;但答案非常微妙&#xff0c;因为容器化的使用方式有很多种&#xff0c;其中一些方法比其他方法效果更好。 今天&#xff0c;我们发布了有关使用容器化的安全指南&#…

「深度学习」dropout 技术

一、工作原理 1. 正则化网络 dropout 将遍历网络的每一层&#xff0c;并设置消除神经网络中节点的概率。 1. 每个节点保留/消除的概率为0.5: 2. 消除节点&#xff1a; 3. 得到一个规模更小的神经网络&#xff1a; 2. dropout 技术 最常用&#xff1a;反向随机失活 "…

锐捷(二十一)全局地址绑定

vlan划分和vlanif接口配置略&#xff0c;注意vlanif接口里要no shutdown配置如下&#xff1a; Address-bind 192.168.1.1 AAAA.BBBB.CCCCAddress-bind uplink g0/0Address-bind binding-filter loggingAddress-bind install 此时&#xff0c;IP为192.168.1.1 mac地址为AAAA.B…

『运维备忘录』之 Netstat 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

Python中Pymysql库的常见用法和代码示例

关注B站可以观看更多实战教学视频&#xff1a;肆十二-的个人空间-肆十二-个人主页-哔哩哔哩视频 (bilibili.com) pymysql是一个用于连接MySQL数据库的Python库&#xff0c;它允许你执行SQL查询并处理返回的结果。以下是pymysql库的一些常见用法和代码示例&#xff1a; 1. 安装…

GaussDB HCS 轻量化部署软件下载指引

一、Support 账号准备 1. 账号说明 华为的软件服务在华为support网站发布&#xff0c;注册该账号后&#xff0c;可以申请软件、下载离线文档&#xff0c;查看技术案例等功能 2. 账号注册 步骤 1&#xff1a;点击如下官方链接 华为运营商技术支持 - 华为 步骤 2&#xff1…

精通Python中的正则表达式

源码分享 https://docs.qq.com/sheet/DUHNQdlRUVUp5Vll2?tabBB08J2 正则表达式是一种强大的文本处理工具&#xff0c;广泛应用于字符串搜索、替换、验证等多种场景。Python通过内置的​​re​​模块提供了对正则表达式的支持。在爬虫开发中&#xff0c;能够熟练地使用正则表达…

powershell 离线安装Posh-SSH

PowerShell 离线安装 Posh-SSH 模块&#xff0c;可以按照以下步骤进行&#xff1a; 从可靠的来源获取 Posh-SSH 模块的 NuGet 安装包&#xff08;.nupkg 文件&#xff09;。确保该安装包是最新版本&#xff0c;并且与你的 PowerShell 版本兼容。将 NuGet 安装包复制到你的计算…

kafka教程

Kafka 中&#xff0c;Producer采用push模型&#xff0c;而Consumer采用pull模型。 Topic Topic&#xff08;主题&#xff09;是消息的逻辑分类或通道。它是Kafka中用于组织和存储消息的基本单元。一个Topic可以被看作是一个消息发布的地方&#xff0c;生产者将消息发布到一个…

机器学习9-随机森林

随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;用于改善单一决策树的性能&#xff0c;通过在数据集上构建多个决策树并组合它们的预测结果。它属于一种被称为“集成学习”或“集成学习器”的机器学习范畴。 以下是随机森林的主要特点和原理&…

IT行业含金量高的证书-软考

软考全称计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff0c;软考既是职业资格考试&#xff0c;又是职称资格考试。2021年12月2号发布新版的国家职业资格目录&#xff0c;软考是在计算机技术领域中的唯一的国家职业资格。 一、好处 软考是一个神奇又特…

【数据结构】14 队列(带头结点的链式存储和顺序存储实现)

定义 队列是一个有序线性表&#xff0c;但是队列的插入、删除操作是分别在线性表的两个不同端点进行的。 设一个队列 Q ( a 1 , a 2 , . . . , a n ) Q (a_1, a_2,...,a_n) Q(a1​,a2​,...,an​)&#xff0c;那么 a 1 a_1 a1​被称为队头元素&#xff0c; a n a_n an​为队…

金融科技力

金融科技 区块链二级目录三级目录 区块链 区块链安全&#xff1a;保密性、完整性、可用性 最重要的点&#xff1a;保密性零知识证明&#xff1a; 1、完整性&#xff08;真的假不了&#xff09; 2、可靠性&#xff08;假的真不了&#xff09; 3、零知识性&#xff08;知道真的&…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息修改实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

从互联网的公开信息中,找到属于你的赚钱思路

一、教程描述 人们在互联网上的每一次搜索、每一次关注、每一次点击、每一次点赞、每一次评论、每一次付费&#xff0c;都生成了大量的数据和信息&#xff0c;暴露着人们的真实想法、欲望、恐惧和需求。这些数据和信息&#xff0c;就是我们身边的一座“金矿”&#xff0c;而大…

项目中的一些疑难杂记

疑难杂记 1. 关于正则表达式对象的匹配状态问题发现查找原因解决方法done 喜大普奔 1. 关于正则表达式对象的匹配状态 问题发现 因页面中多个函数使用到同一个正则表达式&#xff0c;想着定义个变量 export 出去然后在对应的函数中引用&#xff0c;一切正常中… 直到有一天&a…

1【算法】——最大子数组问题(maximum subarray)

一.问题描述 假如我们有一个数组&#xff0c;数组中的元素有正数和负数&#xff0c;如何在数组中找到一段连续的子数组&#xff0c;使得子数组各个元素之和最大。 二.问题分析 分治法求解&#xff1a; 初始状态&#xff1a; low0&#xff1b;highA.length-1&#xff1b;mid&am…

CGAL::2D Arrangements-2

2.3.2 遍历Arrangement Halfedge Arrangement的一条Halfedge是和一个 X_monotone_curve_2对象绑定&#xff0c;这个curve可以通过e->curve()获取。 e->source()得到源点&#xff0c;e->target()得到目标点&#xff0c;e->twin()得到半边的对边&#xff0c; 第个半…

最新的 Ivanti SSRF 零日漏洞正在被大规模利用

Bleeping Computer 网站消息&#xff0c;安全研究员发现 Ivanti Connect Secure 和 Ivanti Policy Secure 服务器端请求伪造 (SSRF) 漏洞&#xff08;CVE-2024-21893 &#xff09;正在被多个威胁攻击者大规模利用。 2024 年 1 月 31 日&#xff0c;Ivanti 首次就网关 SAML 组件…