为什么相同图片相同模型,pytorch与darknet结果大不相同?

更多参见darknet学习笔记

相关文档:darknet框架基于resnet34模型训练OCT图片pytorch框架基于resnet18训练OCT数据

darknet与pytorch框架训练resnet34模型分类对比

模型对比

darknet resnet34在ImageNet上预训练,top1:72.4,top5:91.1.

初始召回率:

pytorch:正常图片:0.0217;异常图片:1.0

darknet:正常图片:0.9811;异常图片:0.0846

pytorch与darknet召回率是相反的。

ResNet解析(pytorch源码)

pytorch源码解读之resnet.py的实现

调整学习率策略:

pytorch

 exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

torch.optim.lr_scheduler:调整学习率 

darknet:

调整策略为poly,

darknet源代码中的公式

int batch_num = (*net.seen)/(net.batch*net.subdivisions);
//每增加一个net.batch,batch_num加1.
float get_current_rate(network net)
{
    return net.learning_rate * pow(1 - (float)batch_num / net.max_batches, net.power);
}

matlab实现函数并绘制曲线 

maxbatches = 40000;
begin = 0
rate = 0.01;
x = begin:maxbatches;
tm = x-begin
y=1-(tm/maxbatches);
k=y.^4;
rate= rate*k;
plot(x,rate)

学习过程中,学习率出现先变大后变小,是因为resnet34.txt有一个参数burn_in=1000

如果有burn_in参数:

if (batch_num < net.burn_in) return net.learning_rate * pow((float)batch_num / net.burn_in, net.power);

 优化器:

机器学习:各种优化器Optimizer的总结与比较

pytorch:

torch.optim优化算法理解之optim.Adam()

 optimizer_ft = optim.Adam(model_ft.parameters(), lr=learning_rate, weight_decay=1e-5)

darknet:

darknet训练图像分类优化器研究

网络结构:

激活函数:

darknet训练图像分类激活函数研究

损失函数:

图像预处理:

darknet训练图像分类图像预处理研究

pytorch图像预处理:

pytorch处理,第一步resize()

class BagDataset(Dataset):

    def __init__(self, data_file, transform=None):
        self.transform = transform
        self.img_list = data_file

    def __len__(self):
        return len(self.img_list)

    def __getitem__(self, idx):
        img_name = self.img_list[idx]
        print("imgname is {}\n idx is{}".format(img_name, idx))
        img = cv2.imread(img_name)
        img = cv2.resize(img, (512, 512))
        cls = img_name.split('/')[0][10:15]
        #cls = img_name.split('/')[0][5:10]
        print("cls is {}".format(cls))
        #cls = img_name.split('/')[0][:5]
        #print("cls is {}".format(cls))
        label = cls_dict[cls]

        if self.transform:
            try:
                img = self.transform(transforms.ToPILImage()(img))
            except TypeError:
                print(img_name)
            # img = self.transform(img)

        return img, label

pytorch的resize使用opencv的resize方法,根据opencv改变图像大小cvResize和resize,可以初步判定darknet的resize()与pytorch的resize()方法效果基本一致,假设darknet代码实现没有bug的前提下。如果想要心安,需要验证两个方法是否效果一致。

pytorch处理,第二步翻转:

data_transforms = {
    'train': transforms.Compose([
        # transforms.RandomResizedCrop(224),
        # transforms.Resize(input_size),
        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
    'val': transforms.Compose([
        # transforms.Resize(input_size),
        # transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ]),
}

翻转的代码主要是:

        transforms.RandomHorizontalFlip(),
        transforms.RandomVerticalFlip(),

其中:

所以,pytorch对图像同时做了水平翻转和垂直翻转。

pytorch处理第三步:归一化和标准化

        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

参考PyTorch学习笔记——图像处理(transforms.Normalize 归一化) ,理解归一化代码。

为什么要进行归一化标准化?

归一化/标准化的本质是线性变换,线性变换不会是改变后的数据失效,例如线性变换不会改变数值的排序。除此之外,线性变换还可以提高数据的表现。

(1)某些模型求解需要

a.在使用梯度下降算法求解最优值问题时,归一化/标准化可以提高梯度下降算法的求解速度,从而加快模型收敛速度。

如下左图所示,没有归一化和标准化的等高线呈椭圆形,迭代时很可能沿着长轴走“之”字形,从而导致迭代很多次才收敛。

如下右图所示,进行了归一化和标准化的等高线呈圆形,在梯度下降进行求解时能够加快收敛。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
PyTorch Darknet 是一个基于深度学习框架PyTorch开发的用于目标检测和图像分类的工具包。它由Joseph Redmon开发,是Darknet框架在PyTorch上的实现版本。 PyTorch Darknet的主要特点包括简单易用、高效灵活和强大的性能。它提供了丰富的预训练模型和网络结构,可以快速在大规模数据上进行训练和推理。同时,它也支持自定义网络结构和算法,可以根据具体需求进行扩展和修改。 PyTorch Darknet使用Python作为开发语言,具有良好的可读性和可扩展性。它通过PyTorch的动态计算图机制,可以方便地进行模型的构建和调试。此外,PyTorch Darknet还提供了丰富的工具和函数库,可以用于数据加载、模型评估、模型融合等常用任务。 在目标检测方面,PyTorch Darknet支持多种流行的模型,如YOLO(You Only Look Once)、YOLOv3等。这些模型具有快速且准确的检测效果,在实时性和准确性上具有优势。同时,PyTorch Darknet还提供了训练和测试的脚本,可以方便地对模型进行训练和评估。 在图像分类方面,PyTorch Darknet同样提供了一系列经典的模型,如ResNet、MobileNet等。这些模型在ImageNet等大规模数据集上表现出色,并且可以通过迁移学习应用到自己的数据集上。 总之,PyTorch Darknet是一个实用而强大的深度学习工具包,可以在目标检测和图像分类等任务上提供高效而准确的解决方案。它的简单易用性和丰富的功能使得开发者能够更快速地实现自己的想法,并在实践中取得良好的效果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haimianjie2012

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值