python额外知识
前言
此篇文章主要记录一些环境问题, pip,conda的使用这些
pip
包安装规则
如果包不存在,则安装符合要求的最新版本, 可以通过下面命令查看此次安装的包的具体包版本, 也能查看当前源有哪些版本
1pip index versions 包名[范围]
如果包存在且符合要求,则不需要重新安装, 如果不符合要求则会删除此版本, 重新安装, 这就回到包不存在的规则
如果安装的包存在其他依赖, 安装依赖的时候也会执行此规则
包安装方式
源码安装: 从源码开始编译构建, 这个比较耗时间而且容易出错, 如果看到pip下载的是压缩包那些文件, 就是源码构建
预构建二进制包安装: 直接安装别人已经编译构建好的二进制文件(.whl格式)
对比项
源码安装
预构建 Wheel
安装速度
慢(需编译)
快(直接安装二进制)
兼容性
高(可适配不同环境)
依赖官方提供的 Wheel
定制性
高(可修改编译选项)
无(固定二进制)
依赖要求
需编译器(如 gcc)
仅需 pip
常见问题
版本冲突问题
第一种: 两个包依赖的共同包版本不一致 通常需要升降级一个包的版本( ...
内网穿透
内网穿透的作用就是将一个局域网机器暴露在公网上, 他的原理就是通过一个公网上的中间服务器接受以及传达信息给局域网机器, 所以需要一台中间服务器, 服务器上需要装好内网穿透的服务端, 局域网机器需要装好内网穿透客户端.
因此内网穿透我们有两种选择:
使用内网穿透服务商, 这样我们不需要自己装备服务器
使用自己的公网服务器
服务商
cpolar
官网
优点: 免费稳定, 能通过在线平台就看到连接到内网机器的ip+端口
缺点: 免费版无法使用固定端口
ChmlFrp
官网
优点: 免费且能固定端口, 也能通过在线平台就能看到内网机器的ip+端口
自建服务端
nps
官网
transformer及其变体学习
显存占用
对于transformer中, 最占用显存的部分就是注意力计算了, 他会产生一个很大的注意力得分矩阵, 这个矩阵形状通常是 ( batch , head, N, N) N代表序列维度
如果我们使用32批次, 一张640 640 的图片, 然后patch选 16 那 N就是1600, head选8, 显存占用就有
132 * 8 * 1600 * 1600 * 4 / 1024 / 1024 / 1024 = 2.44GB
一个注意力分数矩阵就已经2.44G了, 通常encoder和decoder有6层, 这个显存占用就已经很大了
主要减少显存占用的方法:
减小batch
增大patch, 也就可以减少N, 这个是O(N^2)级别的, 降低起来很有效
问题汇总
这个是我学习transformer中的一些疑惑
词嵌入的目的
问: 能否直接将词在词库中的编码直接交给transformer而不使用词嵌入
答:
直接使用单词在词库中的索引数字(即数字ID)作为输入是不可行的,原因有以下几点:
缺乏语义信息:数字ID只是单纯的标识符,不包含任何语义信息。例如,"猫 ...
python场景方案解决
拿到控制台所有输出
我这里是自己解析了命令, 暂时没有找到很好的库, 我这里解析的也不全
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061import osimport sysfrom tqdm import tqdmimport loggingimport atexitclass ParseConsoleStr: def __init__(self): self.buffer = [] self.current_line = "" def parse(self, text): for char in text: if char == "\r": self.current_line = "" # 回车后重置当前行 ...
python常用包学习
Numpy
提取数据
1. 索引
这种方式就跟数组的使用是一模一样的
1234arr = np.array([[1,2,3], [4,5,6], [7,8,9]])arr[0] # [1,2,3]arr[0,0] # [1] 等价于arr[(0,0)]arr[[0,1]] # [[1,2,3],[4,5,6]]
2.切片
其实索引就是一种特殊切片, 我个人觉得可以这么理解
123arr = np.array([[1,2,3], [4,5,6], [7,8,9]])arr[0] # [1,2,3] 等价于 arr[0,:]arr[[0,1]] # [[1,2,3],[4,5,6]] 等价于arr[[0,1], :]
总结
np里面的数组有多少维度, 默认取数据的时候, 就能指定多少维度, 不指定就是全选, 默认维度指定是从左到右
通过这种理解方式, 我们就很容易得知取了数据之后还有多少维度
需要注意的点就是 () 和 [] 的区别, () 就相当于正常取数据里面有个数据就是设置几个维度, 而[]只是设置一个维度
12a[(1,2,3)] => a[1,2,3]a[[1,2,3]] ...
目标检测领域的经典模型
前言
此文是我对目标检测领域各个经典模型的一个总结
Faster RCNN
Fast RCNN 的ROI是通过 SS(选择性搜索)得到的, 他的速度比较慢, 而且是在CPU里面执行的, 基于此, 在Fast RCNN 基础上提出了 RPN(区域建议网络), 直接通过主干网络提取出来的特征生成ROI
RPN
首先对于主干网络使用3x3的卷积进一步的提取特征(特征图大小不变), 然后将特征图分别送入 分类分支(背景还是前景), 回归分支(预测目标框位置)
RPN 里面引入了锚框的概念, 锚框就是以某一个点为中心点, 生成不同大小或者不同比例的框, 为什么引入锚框, 以及有什么用?
引入锚框是为了生成预选框, 这样生成是比SS快的, 我们的特征图中的每个点其实就是一个中心点, 然后将锚框对应特征图区域的特征值送入分类器和回归器得到预选框
锚框其实是使用了我们人的经验, 因为我们知道生活中物体大概都是多大的, 所以我们就可以基于此设计锚框
对于特征图每个点都会根据k个锚框生成k个预测框, 包含4个参数(位置信息), 2个参数(分类信息)
分类器
根据RPN产生的预测框, 生成对应位置的特 ...
yolo框架学习
本文是结合yolov8及其以后的框架做的总结
参数传递
yolo中参数传递我感觉还是比较绕的, 所以单独讲一讲, 方便我们魔改
参数来源有如下几个方面:
模型yaml文件 和 .pt 文件, 这个通常是用来构建模型
default.yaml 和 我们传进去的参数
数据集构建规则
必须使用中心点加宽高模式, 而且必须都归一化, 所有值必须大于等于0
1234assert lb.shape[1] == 5, f"labels require 5 columns, {lb.shape[1]} columns detected"points = lb[:, 1:]assert points.max() <= 1, f"non-normalized or out of bounds coordinates {points[points > 1]}"assert lb.min() >= 0, f"negative label values {lb[lb < 0 ...
论文阅读方法论
前言
方法
三遍法:
第一遍(海选): 看标题, 摘要, 然后直接跳到结论, 看完这些大概知道文章在讲什么, 然后看看实验和方法部分的图和表, 经过这些步骤就可以判断文章怎么样, 有没有必要继续下去
第二遍: 从头读到尾, 但是没必要在意太多的细节,比如公式证明, 但是 要搞清楚图和表 以及 作者提出了什么方法, 以及他的方法和别人的区别, 对于不懂的地方先做标记,比如他参考的文献你不懂的地方
第三遍: 精读文章, 每一句话在干什么, 即使不看文章, 你也知道这篇文章到底是在干啥了
pytorch学习
nn模块
权重初始化
123456789import torchimport torch.nn as nn# 定义线性层linear_layer = nn.Linear(in_features=10, out_features=5)# 直接赋值给权重和偏置linear_layer.weight.data.fill_(0.01) # 将权重全设置为 0.01linear_layer.bias.data.fill_(0) # 将偏置设置为 0
广播机制
广播机制的核心流程可以概括为:
从右往左逐个对比两个张量的维度。
相等时继续:如果对应维度大小相等,直接匹配。
不相等时判断是否有1:如果不相等,检查其中一个维度是否为1。如果是,则可以广播扩展成相等的维度。
无法匹配时停止:如果对应维度大小不相等,且都不为1,则广播机制无法继续,运算会报错。
缺少的维度补1:如果一个张量维度数量少,从右侧开始自动补充1,以便进行对比。
例如,如果有两个张量:
a 的形状是 (3, 1, 5)
b 的形状是 (4, 5)
按照广播机制,从右往左依次匹配:
最右边的维度 5 匹配。
中 ...
深度学习
学习链接
前言
神经网络就是用来学习一种我们无法通过公式和算法显式的写出来的规则, 比如 目标检测, 我们人脑能很快的从一副图像中检测某个物体, 并且分类, 但是我们是无法直接写出这个检测和分类的代码的, 所以我们需要神经网络这个黑盒子去帮我们隐式的表达出来
前馈神经网络(FNN)
即多层感知机(MLP), 输入层 与 隐藏层 之间, 以及隐藏层和输出层之间 采用全连接的方式
激活函数
有了激活函数, 我们可以将多层感知机的表达能力变得更强,而不局限于线性表达, 如果没有激活函数, 多层感知机和线性模型那些没有啥区别, 这里可以以一个只有一个隐藏层的模型推导
O=(XW(1)+b(1))W(2)+b(2)=XW(1)W(2)+b(1)W(2)+b(2)=XW+b. \mathbf{O} = (\mathbf{X} \mathbf{W}^{(1)} + \mathbf{b}^{(1)})\mathbf{W}^{(2)} + \mathbf{b}^{(2)} = \mathbf{X} \mathbf{W}^{(1)}\mathbf{W}^{(2)} + \mathbf{b}^{(1 ...