0

0

【论文复现】基于 PaddlePaddle 实现 GreedyHash

P粉084495128

P粉084495128

发布时间:2025-07-16 17:23:40

|

783人浏览过

|

来源于php中文网

原创

本文基于PaddlePaddle复现GreedyHash算法,解决图像检索中NP优化难题。在CIFAR-10 (I)数据集上,12/24/32/48bits模型精度达0.798、0.809、0.817、0.819(最高0.824),优于原论文及PyTorch重跑结果,含完整代码与权重。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【论文复现】基于 paddlepaddle 实现 greedyhash - php中文网

【论文复现-图像分类检索】基于 PaddlePaddle 实现 GreedyHash(NeurIPS2018)

  • 原论文:Greedy Hash: Towards Fast Optimization for Accurate Hash Coding in CNN.

  • 官方原版代码(基于PyTorch)GreedyHash.

  • 第三方参考代码(基于PyTorch)DeepHash-pytorch.

  • 本项目GitHub repo paddle_greedyhash

1. 简介

GreedyHash 意在解决图像检索 Deep Hashing 领域中NP优化难的问题,为此,作者在每次迭代中向可能的最优离散解迭代式更新网络参数。具体来说,GreedyHash 在网络模型中加入了一个哈希编码层,在前向传播过程中为了保持离散的限制条件,严格利用sign函数。在反向传播过程中,梯度完整地传向前一层,进而可以避免梯度弥散现象。算法伪代码如下。

【论文复现】基于 PaddlePaddle 实现 GreedyHash - php中文网

GreedyHash 算法伪代码

2. 数据集和复现精度

数据集:cifar-1(即CIFAR-10 (I))

  • CIFAR-10 数据集共10类,由 60,000 个 32×32 的彩色图像组成。

  • CIFAR-10 (I)中,选择 1000 张图像(每类 100 张图像)作为查询集,其余 59,000 张图像作为数据库, 而从数据库中随机采样 5,000 张图像(每类 500 张图像)作为训练集。数据集处理代码详见 utils/datasets.py。

复现精度


Framework 12bits 24bits 32bits 48bits
论文结果 PyTorch 0.774 0.795 0.810 0.822
重跑结果 PyTorch 0.789 0.799 0.813 0.824
复现结果 PaddlePaddle 0.798 0.809 0.817 0.819(0.824)
  • 需要注意的是,此处在重跑PyTorch版本代码时发现原论文代码 GreedyHash/cifar1.py 由于PyTorch版本较老,CIFAR-10 数据集处理部分代码无法运行,遂将第三方参考代码 DeepHash-pytorch 中的 CIFAR-10 数据集处理部分代码照搬运行,得以重跑PyTorch版本代码,结果罗列如上。严谨起见,已将修改后的PyTorch版本代码及训练日志放在 pytorch_greedyhash/main.py 和 pytorch_greedyhash/logs 中。因为跑的时候忘记设置随机数种子了,复现的时候可能结果有所偏差,不过应该都在可允许范围内,问题不大。

  • 本项目(基于 PaddlePaddle )依次跑 12/24/32/48 bits 的结果罗列在上表中,且已将训练得到的模型参数与训练日志 log 存放于output文件夹下。由于训练时设置了随机数种子,理论上是可复现的。但在反复重跑几次发现结果还是会有波动,比如有1次 48bits 的模型跑到了 0.824,我把对应的 log 和权重放在 output/bit48_alone 路径下了,说明算法的随机性仍然存在。

3. 准备环境

本人环境配置:

  • Python: 3.7.11

  • PaddlePaddle: 2.2.2

  • 硬件:NVIDIA 2080Ti * 1

    Cursor
    Cursor

    一个新的IDE,使用AI来帮助您重构、理解、调试和编写代码。

    下载

    p.s. 因为数据集很小,所以放单卡机器上跑了,多卡的代码可能后续补上

4. 快速开始

step1: 下载本项目及训练权重

本项目在AI Studio上,您可以选择fork下来直接运行。首先,cd到paddle_greedyhash项目文件夹下:

In [ ]
cd paddle_greedyhash
/home/aistudio/paddle_greedyhash

或者,您也可以从GitHub上git本repo在本地运行:

git clone https://github.com/hatimwen/paddle_greedyhash.gitcd paddle_greedyhash

权重部分:

  • 由于权重比较多,加起来有 1 个 GB ,因此我放到百度网盘里了,烦请下载后按照 5. 项目结构 排列各个权重文件。或者您也可以按照下载某个bit位数的权重以测试相应性能。

  • 下载链接:BaiduNetdisk, 提取码: tl1i 。

  • 注意:在AI Studio上,已上传了 bit_48.pdparams 权重文件在 output 路径下,方便体验。

step2: 修改参数

  • 请根据实际情况,修改main.py中的 arguments 配置内容(如:batch_size等)。

step3: 验证模型

  • 需要提前下载并排列好 BaiduNetdisk 中的各个预训练模型。

  • 注意:在AI Studio上,由于已预先上传bit_48.pdparams 权重文件,因此可以直接运行:

In [ ]
# 验证模型! python eval.py --batch-size 32 --bit 48
W0427 21:33:47.931723   449 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1
W0427 21:33:47.935976   449 device_context.cc:465] device: 0, cuDNN Version: 7.6.
Loading AlexNet state from path: /home/aistudio/paddle_greedyhash/models/AlexNet_pretrained.pdparams
0427 09:33:53 PM Namespace(batch_size=32, bit=48, crop_size=224, dataset='cifar10-1', log_path='logs/', model='GreedyHash', n_class=10, pretrained=None, seed=2000, topK=-1)
0427 09:33:53 PM ----- Pretrained: Load model state from output/bit_48.pdparams
--- Calculating Acc : 100%|█████████████████████| 32/32 [00:02<00:00, 13.36it/s]
--- Compressing(train) : 100%|██████████████| 1844/1844 [01:42<00:00, 17.97it/s]
--- Compressing(test) : 100%|███████████████████| 32/32 [00:02<00:00, 13.89it/s]
--- Calculating mAP : 100%|█████████████████| 1000/1000 [01:23<00:00, 11.94it/s]
0427 09:37:06 PM EVAL-GreedyHash, bit:48, dataset:cifar10-1, MAP:0.819

step4: 训练模型

  • 例如要训练 12bits 的模型,可以运行:
In [4]
# 训练模型! python train.py --batch-size 32 --learning_rate 1e-3 --seed 2000 --bit 12# 这里记录是看运行没问题就中断了。
W0427 21:38:07.032394   780 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1
W0427 21:38:07.036984   780 device_context.cc:465] device: 0, cuDNN Version: 7.6.
Loading AlexNet state from path: /home/aistudio/paddle_greedyhash/models/AlexNet_pretrained.pdparams
0427 09:38:12 PM Namespace(alpha=0.1, batch_size=32, bit=12, crop_size=224, dataset='cifar10-1', epoch=50, epoch_lr_decrease=30, eval_epoch=2, learning_rate=0.001, log_path='logs/', model='GreedyHash', momentum=0.9, n_class=10, num_train=5000, optimizer='SGD', output_dir='checkpoints/', seed=2000, topK=-1, weight_decay=0.0005)
0427 09:38:22 PM GreedyHash[ 1/50][21:38:22] bit:12, lr:0.001000000, dataset:cifar10-1, train loss:1.904
0427 09:38:31 PM GreedyHash[ 2/50][21:38:31] bit:12, lr:0.001000000, dataset:cifar10-1, train loss:1.574
--- Calculating Acc : 100%|█████████████████████| 32/32 [00:02<00:00, 13.48it/s]
--- Compressing(train) : 100%|██████████████| 1844/1844 [01:46<00:00, 17.28it/s]
--- Compressing(test) : 100%|███████████████████| 32/32 [00:02<00:00, 13.81it/s]
--- Calculating mAP : 100%|█████████████████| 1000/1000 [01:14<00:00, 13.39it/s]
0427 09:41:39 PM save in checkpoints/model_best_12
0427 09:41:40 PM GreedyHash epoch:2, bit:12, dataset:cifar10-1, MAP:0.614, Best MAP: 0.614, Acc: 77.000
0427 09:41:51 PM GreedyHash[ 3/50][21:41:51] bit:12, lr:0.001000000, dataset:cifar10-1, train loss:1.316
0427 09:42:00 PM GreedyHash[ 4/50][21:42:00] bit:12, lr:0.001000000, dataset:cifar10-1, train loss:1.120
--- Calculating Acc : 100%|█████████████████████| 32/32 [00:02<00:00, 13.93it/s]
--- Compressing(train) :  46%|██████▊        | 841/1844 [00:49<00:58, 17.28it/s]^C
Traceback (most recent call last):
  File "train.py", line 183, in <module>
    main()
  File "train.py", line 180, in main
    database_loader)
  File "train.py", line 136, in train_val
    mAP, acc = val(model, test_loader, database_loader)
  File "train.py", line 81, in val
    retrievalB, retrievalL, queryB, queryL = compress(database_loader, test_loader, model)
  File "/home/aistudio/paddle_greedyhash/utils/tools.py", line 31, in compress
    _,_, code = model(data)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 917, in __call__
    return self._dygraph_call_func(*inputs, **kwargs)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 907, in _dygraph_call_func
    outputs = self.forward(*inputs, **kwargs)
  File "/home/aistudio/paddle_greedyhash/models/greedyhash.py", line 67, in forward
    x = self.features(x)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 917, in __call__
    return self._dygraph_call_func(*inputs, **kwargs)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 907, in _dygraph_call_func
    outputs = self.forward(*inputs, **kwargs)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/container.py", line 98, in forward
    input = layer(input)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 917, in __call__
    return self._dygraph_call_func(*inputs, **kwargs)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/dygraph/layers.py", line 907, in _dygraph_call_func
    outputs = self.forward(*inputs, **kwargs)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/nn/layer/conv.py", line 677, in forward
    use_cudnn=self._use_cudnn)
  File "/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/nn/functional/conv.py", line 123, in _conv_nd
    pre_bias = getattr(_C_ops, op_type)(x, weight, *attrs)
KeyboardInterrupt
--- Compressing(train) :  46%|██████▊        | 841/1844 [00:49<00:58, 17.00it/s]

step5: 验证预测

【论文复现】基于 PaddlePaddle 实现 GreedyHash - php中文网

验证图片(类别:飞机 airplane, id: 0)

  • 对于上面的图片,直接运行 predict.py 即可,这里拿 bit_48.pdparams 预测一下看看:
In [5]
! python predict.py --bit 48 --pic_id 1949
W0427 21:43:31.814743  1416 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.0, Runtime API Version: 10.1
W0427 21:43:31.819936  1416 device_context.cc:465] device: 0, cuDNN Version: 7.6.
Loading AlexNet state from path: /home/aistudio/paddle_greedyhash/models/AlexNet_pretrained.pdparams
----- Pretrained: Load model state from output/bit_48.pdparams
----- Predicted Class_ID: 0, Prob: 0.9965014457702637, Real Label_ID: 0
----- Predicted Class_NAME: 飞机 airplane, Real Class_NAME: 飞机 airplane

显然,预测结果正确。

七、代码结构与详细说明

|-- paddle_greedyhash
    |-- output              # 日志及模型文件
        |-- bit48_alone         # 偶然把bit48跑到了0.824,日志和权重存于此
            |-- bit_48.pdparams     # bit48_alone的模型权重
            |-- log_48.txt          # bit48_alone的训练日志
        |-- bit_12.pdparams     # 12bits的模型权重
        |-- bit_24.pdparams     # 24bits的模型权重
        |-- bit_32.pdparams     # 32bits的模型权重
        |-- bit_48.pdparams     # 48bits的模型权重
        |-- log_eval.txt        # 用训练好的模型测试日志(包含bit48_alone)
        |-- log_train.txt       # 依次训练 12/24/32/48 bits(不包含bit48_alone)
    |-- models
        |-- __init__.py
        |-- alexnet.py      # AlexNet 定义,注意这里有略微有别于 paddle 集成的 AlexNet
        |-- greedyhash.py   # GreedyHash 算法定义
    |-- utils
        |-- datasets.py         # dataset, dataloader, transforms
        |-- lr_scheduler.py     # 学习率策略定义
        |-- tools.py            # mAP, acc计算;随机数种子固定函数
    |-- eval.py             # 单卡测试代码
    |-- predict.py          # 预测演示代码
    |-- train.py            # 单卡训练代码
    |-- README.md
    |-- pytorch_greedyhash
        |-- datasets.py         # PyTorch 定义dataset, dataloader, transforms
        |-- cal_map.py          # PyTorch mAP计算;
        |-- main.py             # PyTorch 单卡训练代码
        |-- output              # PyTorch 重跑日志

八、模型信息

关于模型的其他信息,可以参考下表:

信息 说明
发布者 文洪涛
Email hatimwen@163.com
时间 2022.04
框架版本 Paddle 2.2.2
应用场景 图像检索
支持硬件 GPU、CPU
下载链接 预训练模型 提取码: tl1i
在线运行 AI Studio
License Apache 2.0 license

九、参考及引用

@article{su2018greedy,
  title={Greedy hash: Towards fast optimization for accurate hash coding in cnn},
  author={Su, Shupeng and Zhang, Chao and Han, Kai and Tian, Yonghong},
  year={2018},
  journal={Advances in Neural Information Processing Systems},
  volume={31},
  year={2018}}

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号