- 1.PyTorch
- 1.1 Conv2d
- 1.2 dataset,dataloader
- 1.3 训练pipeline
- 1.4 梯度归零
- 1.5 torch保存模型种类及区别
- 2.目标检测
- 2.1 yolo3,4,5,7区别
- 2.2 yolo使用的loss(ciou,BCE等等)
- ciou
- BCEloss
- L1,L2,CE,BCE
- 2.3 图像增强
- 2.4 IOU计算公式
- 3.深度学习基础
- 3.1 卷积公式
- 4.TensorRT
- 5. python
- 6. c++
1.PyTorch
1.1 Conv2d
实现2d卷积操作
1.2 dataset,dataloader
分别负责可被Pytorhc使用的数据集的创建以及向训练传递数据的任务。如果想个性化自己的数据集或者数据传递方式,也可以自己重写子类。Dataset是DataLoader实例化的一个参数
torch.utils.data.Dataset 是一个表示数据集的抽象类。任何自定义的数据集都需要继承这个类并覆写相关方法。
可以通过继承后重写Init,getitem等方法自定义
DataLoader是Pytorch中用来处理模型输入数据的一个工具类。组合了数据集(dataset) + 采样器(sampler),并在数据集上提供单线程或多线程(num_workers )的可迭代对象。
参数:
dataset (Dataset) – 决定数据从哪读取或者从何读取;
batch_size (python:int, optional) – 批尺寸(每次训练样本个数,默认为1)
shuffle (bool, optional) –每一个 epoch是否为乱序 (default: False).
num_workers (python:int, optional) – 是否多进程读取数据(默认为0);
drop_last (bool, optional) – 当样本数不能被batchsize整除时,最后一批数据是否舍弃(default: False)
pin_memory(bool, optional) - 如果为True会将数据放置到GPU上去(默认为false)
1.3 训练pipeline
1.4 梯度归零
为什么每一轮batch需要设置optimizer.zero_grad:
根据pytorch中的backward()函数的计算,当网络参量进行反馈时,梯度是被积累的而不是被替换掉;但是在每一个batch时毫无疑问并不需要将两个batch的梯度混合起来累积,因此这里就需要每个batch设置一遍zero_grad 了。
1.5 torch保存模型种类及区别
2.目标检测
2.1 yolo3,4,5,7区别
yolov4/yolov5
2.2 yolo使用的loss(ciou,BCE等等)
ciou
考虑两个框中心点的距离及两个框最小外包对角线距离
相比于IOU的优点:
1.IOU没有考虑到两个框之间的位置信息,如果两个框没有重叠,它的IOU=0,没法进行反向传播。
2.还有一点,就是为什么之前的所有目标检测的网络中没有用iou直接作为损失函数。就是因为对于大小不同的框,iou值相同,但是其重叠程度却不同(说白了,就是对尺度不敏感)。在ciou中,由于有v这个概念,所以就使这种情况不可能再出现(个人理解,不对还请指正)。
BCEloss
BCE/CE
CE用于多分类
BCE用于二分
多分类也可以叠加多个BCE
BCE主要适用于二分类的任务,而且多标签分类任务可以简单地理解为多个二元分类任务叠加。所以BCE经过简单修改也可以适用于多标签分类任务。使用BCE之前,需要将输出变量量化在[0,1]之间(可以使用Sigmoid激活函数)。上边我们也深度刨析了Sigmoid和Softmax两种激活函数,探究其统计学本质,Sigmoid的输出为伯努利分布,也就是我们常说的二项分布;而Softmax的输出表示为多项式分布。所以Sigmoid通常用于二分类,Softmax用于多类别分类。
L1,L2,CE,BCE
L1,L2,CE,BCE loss
2.3 图像增强
yolov3:
1.Mosaic(马赛克)
2.随机旋转、平移、缩放、错切、hsv增强
yolov5:
1.Mosaic数据增强
2.Copy paste数据增强
3.Random affine仿射变换
4.MixUp数据增强
5.HSV随机增强图像
6随机水平翻转
2.4 IOU计算公式
# xmin ymin xmax ymax
def iou(box1, box2):
# 1.interarea
# 2.box1 area
# 3.box2 area
# 4.interarea / (box1area + box2area - interarea)
x1 = max(box1[0],box2[0])
y1 = max(box1[1],box2[1])
x2 = min(box1[2],box2[2])
y2 = min(box1[3],box2[3])
interarea = max(0, x2-x1) * max(0, y2-y1)
box1area = (box1[2] - box1[0]) * (box1[3] - box1[1])
box2area = (box2[2] - box2[0]) * (box2[3] - box2[1])
iou = interarea / (box1area + box2area - interarea)
print(iou)