用Python给老照片智能归档:按拍摄日期自动重命名+分类存储(Pillow+exifread)

批量照片分类工具 按属性 EXIF自动分类 照片智能分类软件 例如,如果选择按"拍摄日期"分类,它可能会自动创建"2023"文件夹,然后在其中创建"202308"的子文件夹,最后是"20230815"这样的具体日期文件夹,所有在该日拍摄的照片都会被归入此处。现在,有一款强大的照片整理工具,它能将你从繁琐的照片管理工作中解放出来,让你的数字回忆变得井井有条,焕发新生。按图片基本属性:可以根据照片的"图片类型"(如JPG,PNG,BMP等)、"分辨率"大小、"宽度"、"高度",甚至是"位深度"来进行分类,这对于需要筛选特定规格图片的用户非常有用。 阅读详情

告别数字记忆的混沌:用Python为你的照片建立一座时光档案馆

你是否也曾面对手机相册里数以千计、命名混乱的照片感到束手无策?那些珍贵的家庭合影、孩子的成长瞬间、旅途中的风景,全都淹没在“IMG_20250101_123456.jpg”和“DSC_09876.JPG”的海洋里。想要找到去年夏天在海边拍的那张照片,却不得不滑动屏幕几分钟,甚至最终放弃。这不仅仅是文件管理的问题,更是数字时代记忆的失序。

我们生活在影像爆炸的时代。智能手机让每个人都能轻松记录生活,但随之而来的却是数字资产的混乱。照片不再仅仅是文件,它们是我们生活的切片,是情感的载体,是时间的见证。然而,当这些记忆碎片散落在无序的文件夹和随机的文件名中时,它们的价值大打折扣。真正的痛点在于:我们拥有记录的能力,却缺乏整理的工具。

今天,我想分享一个我为自己家庭相册构建的解决方案——一个完全由Python驱动的智能照片归档系统。它不只是一个脚本,而是一座私人的“数字时光档案馆”。这个系统能够自动读取照片中隐藏的拍摄时间(EXIF元数据),按照“年月日”的逻辑创建文件夹结构,并将所有照片重命名为统一、可读的“YYYYMMDD_序号”格式。更重要的是,它足够智能,能够处理那些没有EXIF数据的截图或网图,采用文件修改时间作为备用方案。

我花了几个月时间迭代这个工具,处理了超过三万张家庭照片。在这个过程中,我踩过不少坑,也总结出了一套高效、稳定且易于扩展的方案。如果你也受困于杂乱的相册,希望为家人的记忆建立一个清晰、有序的归宿,那么请跟随我的脚步,一起搭建这座属于你自己的数字档案馆。

1. 理解照片的“数字基因”:EXIF元数据深度解析

在我们动手编写代码之前,必须深入理解照片文件的“内在灵魂”——EXIF元数据。你可以把EXIF想象成每张数码照片自带的“出生证明”,它由拍摄设备在按下快门的那一刻自动写入,记录了时间、地点、设备参数等关键信息。

1.1 EXIF的数据结构与存储位置

EXIF数据并非随意存放,它遵循严格的标准格式,通常嵌入在JPEG、TIFF等图像文件的特定“段”(Segment)中。对于最常见的JPEG文件,其结构可以简化为:

JPEG文件结构:
├── SOI(文件开始标记)
├── APP1段(EXIF数据存放处) ← 我们关注的核心
│   ├── EXIF标识符
│   ├── TIFF文件头
│   ├── IFD0(主图像目录)
│   ├── Exif子IFD(拍摄参数)
│   ├── GPS子IFD(地理位置)
│   └── IFD1(缩略图目录)
├── 其他图像数据段
└── EOI(文件结束标记)

这个结构的重要性在于,它解释了为什么不同的Python库在读取EXIF时会有性能差异——有些库解析整个文件结构,而有些则直接定位到APP1段。

1.2 关键时间字段的优先级策略

拍摄时间信息可能存储在多个字段中,不同设备厂商的选择各不相同。经过对数千张照片的分析,我总结出了以下优先级策略:

# 时间字段的读取优先级(从高到低)
TIME_FIELD_PRIORITY = [
    'DateTimeOriginal',    # 原始拍摄时间(最可靠)
    'DateTimeDigitized',   # 数字化时间
    'DateTime',           # 文件修改时间
    'CreateDate',         # 创建日期(某些设备)
    'ModifyDate'          # 修改日期
]

注意:DateTimeOriginal字段是国际标准定义的“原始拍摄时间”,理论上所有合规的数码设备都应该写入这个字段。但在实际中,一些早期的设备或经过第三方软件处理的图片可能缺失此字段。

1.3 Python库的性能对比与选择

市面上有多种Python库可以读取EXIF数据,我通过实际测试对比了它们的表现。以下是在处理1000张照片时的性能数据:

库名称 安装命令 平均耗时(1000张) 数据完整性 易用性 推荐场景
Pillow pip install Pillow 0.95秒 ★★★☆☆ ★★★★★ 快速基础读取
ExifRead pip install exifread 0.85秒 ★★★★☆ ★★★★☆ 专业级解析
Piexif pip install piexif 0.17秒 ★★★★☆ ★★★☆☆ 高性能批量处理
PyExifTool 需额外安装exiftool 2.5秒+ ★★★★★ ★★☆☆☆ 全格式支持

从我的经验来看,Piexif在性能和功能上取得了最佳平衡。它不依赖外部二进制文件,纯Python实现,且解析速度最快。但对于初学者,Pillow的API更加友好,且与图像处理功能天然集成。

# 使用Piexif读取EXIF的示例
import piexif
from datetime import datetime

def get_shooting_time_piexif(image_path):
    """使用Piexif获取拍摄时间(高性能方案)"""
    try:
        exif_dict = piexif.load(image_path)
        
        # 优先从Exif子IFD中获取原始拍摄时间
        if piexif.ExifIFD.DateTimeOriginal in exif_dict['Exif']:
            time_bytes = exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]
            time_str = time_bytes.decode('utf-8')
            return datetime.strptime(time_str, '%Y:%m:%d %H:%M:%S')
        
        # 备用方案:从0th IFD获取常规时间
        if piexif.ImageIFD.DateTime in exif_dict['0th']:
            time_bytes = exif_dict['0th'][piexif.ImageIFD.DateTime]
            time_str = time_bytes.decode('utf-8')
            return datetime.strptime(time_str, '%Y:%m:%d %H:%M:%S')
            
    except (KeyError, ValueError, AttributeError) as e:
        print(f"Piexif解析失败 {image_path}: {e}")
    
    return None

这个函数展示了Piexif的基本用法,注意我们使用了decode('utf-8')将字节数据转换为字符串,这是Piexif的一个特点——它保持数据的原始字节格式。

2. 构建智能归档系统的核心架构

有了对EXIF的理解,我们现在可以设计整个归档系统的架构。这个系统需要处理多种边缘情况,比如没有EXIF的照片、重复的时间戳、不同的文件格式等。

2.1 系统工作流程设计

我设计的系统遵循以下工作流程,这个流程经过多次迭代,已经相当稳定:

输入:源照片文件夹
    ↓
遍历所有图像文件(.jpg, .jpeg, .png, .heic等)
    ↓
对每个文件尝试读取EXIF拍摄时间
    ├── 成功 → 使用EXIF时间
    └── 失败 → 使用文件修改时间(备用方案)
        ↓
生成新文件名:YYYYMMDD_四位序号.扩展名
        ↓
创建目标文件夹结构:年/月/日/
        ↓
移动并重命名文件到目标位置
        ↓
记录处理日志(成功/失败/跳过)

2.2 核心类的设计与实现

为了代码的模块化和可维护性,我采用了面向对象的设计。以下是核心类的结构:

import os
import shutil
from datetime import datetime
from pathlib import Path
from typing import Optional, Dict, List
import piexif
from PIL import Image
import hashlib

class PhotoOrganizer:
    """智能照片归档器"""
    
    # 支持的图像格式(可扩展)
    SUPPORTED_EXTENSIONS = {'.jpg', '.jpeg', '.png', '.heic', '.tiff', '.bmp', '.gif'}
    
    # 时间字段映射(Piexif专用)
    TIME_TAGS = {
        'original': piexif.ExifIFD.DateTimeOriginal,
        'digitized': piexif.ExifIFD.DateTimeDigitized,
        'regular': piexif.ImageIFD.DateTime
    }
    
    def __init__(self, source_dir: str, backup: bool = True):
        """
        初始化归档器
        
        Args:
            source_dir: 源照片目录
            backup: 是否在操作前自动备份
        """
        self.source_dir = Path(source_dir)
        self.backup = backup
        self.processed_count = 0
        self.skipped_count = 0
        self.error_count = 0
        self.duplicate_check = {}  # 用于检测重复文件
        
        # 验证源目录
        if not self.source_dir.exists():
            raise ValueError(f"源目录不存在: {source_dir}")
        if not self.source_dir.is_dir():
            raise ValueError(f"源路径不是目录: {source_dir}")
    
    def organize_photos(self, dry_run: bool = False) -> Dict[str, int]:
        """
        主组织方法
        
        Args:
            dry_run: 试运行模式,不实际移动文件
            
        Returns:
            处理统计信息
        """
        stats = {
  
vector_search_node.py 立即下载

相关推荐

action_timeline_python_v0.32_r3_dev_project_fixed_20261029.zip

action_timeline_python_v0.32_r3_dev_project_fixed_20261029.zip

使用MATLAB、WOE、逻辑回归、PD估计和预期损失分析进行信用风险评分与投资组合优化.zip

使用MATLAB、WOE、逻辑回归、PD估计和预期损失分析进行信用风险评分与投资组合优化.zip

产业园区如何精准识别和匹配优质科技成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何利用平台实现技术成果的精准对接与协同创新?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_11.docx

科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_11

spring web mvc图书管理小案例前端代码

spring web mvc图书管理小案例前端代码

【制造业ERP】物料建模25项自检清单:编码规则、单位精度、BOM结构与库存成本控制规范

内容概要:本文档《物料建模自检清单25项》系统梳理了企业在ERP系统中进行物料建模时常见的25个关键检查点,涵盖编码与主数据、单位与精度、主料/辅料判定、BOM结构与版本、库存与成本五大模块。重点强调物料编码唯一性、属性字段化管理、单位标准化、BOM版本控制、成本核算一致性等核心原则,避免因数据不规范导致的库存割裂、MRP计算错误、成本偏差等问题。; 适合人群:从事制造业信息化建设的ERP实施人员、生产计划员、BOM管理员、供应链工程师以及.NET平台下企业应用开发者;尤其适合有1-3年经验、参与过生产系统落地的技术与业务人员。; 使用场景及目标:①指导企业建立规范的物料主数据管理体系;②防止因物料建模不当引发的生产混乱与财务对账难题;③支持精准MRP运算、成本分摊与追溯管理;④作为日常自查与系统上线前评审的实用 checklist。; 阅读建议:此清单源自实际生产环境踩坑经验,建议打印张贴于工作区,结合具体ERP系统配置逐项核对,重点关注“编码去业务化”、“辅料独立管理”、“批次可追溯”等易错点,确保数据建模既符合业务逻辑又支撑系统高效运行。

政府科技管理者如何实现科技成果资源的精准配置?.docx

政府科技管理者如何实现科技成果资源的精准配置?

【基于dq控制算法的并联有源滤波器】分流有源滤波器的仿真电路可以减轻谐波和无功功率(simulink仿真实现)

内容概要:本文详细介绍了基于dq控制算法的并联有源滤波器(APF)在Simulink环境下的仿真电路设计与实现过程,重点阐述了通过分流式拓扑结构有效抑制电力系统中的谐波污染并补偿无功功率的技术方案。文中深入剖析了dq变换的核心原理,将其应用于控制系统中,实现三相交流量到直流量的转换,从而简化控制器设计并提升动态响应精度。仿真模型完整构建了主电路、负载模块及控制策略三大组成部分,能够直观呈现滤波前后电流波形的改善效果,验证了该方法在提高电能质量方面的有效性与可行性。; 适合人群:电力电子、电气工程及其自动化等相关专业的高校师生,以及从事电能质量治理、有源滤波器研发及相关领域工程应用的技术人员。; 使用场景及目标:①用于课堂教学与课程设计,帮助学生理解dq变换机制及有源滤波器的工作原理;②为科研项目提供可复现的仿真平台,支持新型控制算法的开发与验证;③辅助企业在实际工程中优化APF产品设计,增强谐波抑制与无功补偿性能。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建与调试模型,深入掌握各控制模块参数整定方法及其对系统性能的影响,可通过改变负载类型或引入非理想工况进行对比分析,以全面提升对系统稳态与动态特性的理解与掌控能力。

中小功率逆变电源关键单元电路设计与保护策略研究【原理+PCB+程序】

内容概要:本文围绕中小功率逆变电源的关键单元电路设计与保护策略展开系统性研究,涵盖逆变电源的工作原理、硬件电路设计(包括DC-DC升压与DC-AC逆变)、SPWM正弦波调制技术、闭环控制策略(电压/电流双闭环)、系统保护机制(过压、过流、短路、过温等)以及基于STM32的嵌入式控制系统开发。研究内容整合了Simulink仿真模型、PCB设计文件与嵌入式程序代码,实现了从理论分析、仿真验证到硬件实现的完整技术链条,重点突出系统稳定性设计与多层级保护策略的协同优化,适用于逆变器产品的研发与工程实践。; 适合人群:具备电力电子、自动控制或电气工程等相关专业背景,从事电源系统设计的研发工程师、高校研究生及工程技术人员,尤其适合具有一定嵌入式系统开发经验(熟悉STM32系列单片机)且工作年限在1-5年的从业人员。; 使用场景及目标:①用于中小功率离网/并网逆变器的原型开发与产品设计;②作为高校电力电子、自动化等专业的课程设计、毕业设计或科研项目的综合性参考方案;③深入掌握SPWM调制、LC滤波器设计、PID闭环控制、系统保护逻辑等关键技术的实现方法;④结合仿真与实物平台进行波形测试与参数调试,提升电力电子系统的综合设计能力与故障排查水平。; 阅读建议:建议读者结合提供的原理图、PCB布局图与源代码同步学习,优先在Simulink中完成控制逻辑仿真,理解系统动态响应特性后再搭建实际硬件平台。重点关注保护电路的动作阈值设置与软硬件协同保护机制的实现方式,实验过程中应配合示波器、万用表等仪器观测关键节点波形,逐步优化控制参数以提升系统效率与稳定性。

LCL单相并网逆变器PI双闭环有源阻尼仿真【附参考文献及说明文档】

内容概要:本文围绕LCL单相并网逆变器的PI双闭环有源阻尼控制策略展开,基于Simulink搭建完整的系统仿真模型,深入研究由电流内环与电压外环构成的双闭环控制结构,并结合有源阻尼技术有效抑制LCL滤波器引发的谐振不稳定问题。文中系统阐述了PI控制器参数的设计方法、系统稳定性分析过程以及有源阻尼的作用机理,确保逆变器在并网运行时具备优良的动态响应能力、抗干扰性能与电能质量。同时提供详细的参考文献与说明文档,支持仿真结果的复现与理论延伸,适用于科研验证与工程前期设计。; 适合人群:具备电力电子技术、自动控制理论基础,从事新能源发电系统、电力变换器控制、并网逆变器研发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握LCL型滤波器在单相并网逆变器中的建模方法及其谐振特性与抑制手段;②学习PI双闭环控制结构的设计流程与参数整定技巧;③理解有源阻尼技术的实现原理及其在提升系统稳定性方面的优势;④通过仿真模型动手实践,为后续硬件原型开发、控制器优化及并网标准符合性测试提供理论依据和技术储备。; 阅读建议:建议读者结合所提供的Simulink仿真模型与说明文档,逐步运行并调试系统,重点关注PI参数变化对系统动态响应与稳定性的影响,同时利用频域分析工具(如波特图)辅助理解谐振峰抑制效果,建议对照参考文献深化对控制理论的理解,宜在仿真实践中同步开展时域与频域联合分析,以全面提升系统设计与问题诊断能力。

三相四桥臂电压不对称跌落补偿动态电压恢复器DVR(Simulink仿真实现)

内容概要:本文围绕三相四桥臂动态电压恢复器(DVR)在电压不对称跌落条件下的补偿能力展开研究,基于Simulink搭建完整的系统仿真模型,重点解决不平衡工况下的电能质量问题。系统采用三相四桥臂逆变器拓扑结构,具备独立调控零序分量的能力,结合正负序分离控制策略实现精确补偿。文档详细阐述了RIME(Rider-Inspired Metaheuristic Evolution)新型智能优化算法对PID控制器参数的整定过程,并系统对比了传统PID、神经网络PID(如BP-PID、RBF-PID)、模糊PID及多种智能优化算法(如PSO、SSA)在动态响应速度、稳态精度和抗干扰能力方面的性能差异。研究还涵盖了控制算法设计、系统建模、仿真验证全流程,配套提供参考文献、说明文档与可运行仿真文件,具有较强的复现性和工程指导价值。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事电能质量治理的技术工程师;具备一定MATLAB/Simulink仿真基础和控制理论背景的研发人员。; 使用场景及目标:①用于研究动态电压恢复器在不对称电压跌落下的补偿能力;②比较不同智能优化算法(如RIME、PSO、SSA)在PID参数整定中的效果;③开展新型控制策略(如模糊PID、RBF神经网络控制)在电力系统中的应用仿真与验证; 阅读建议:建议结合提供的参考文献与仿真文件逐步复现模型,重点关注四桥臂逆变器的拓扑特性、正负序分离控制、PID参数优化过程及系统动态响应性能,宜在实践中调试与对比不同控制算法的补偿效果。

nomachine6.1.9-旧版手机专用

nomachine6.1.9-旧版手机专用

Spring Boot集成Jasypt踩坑实录:自定义SM4加密器Bean加载失败的终极解决方案

本文深入剖析了Spring Boot集成Jasypt时自定义SM4加密器Bean加载失败的根源,即Spring Boot启动流程中Bean加载顺序与Jasypt自动配置的时序冲突。文章提供了三种从源码层面解决问题的有效方案,包括使用ApplicationContextInitializer提前注册、调整Bean依赖顺序以及自定义PropertySource处理机制,并给出了完整的国密SM4加密器实现与测试示例。

weixin_29294975的博客 198

nnUnet代码解读--优化策略

优化策略 nnUNetTrainer def initialize_optimizer_and_scheduler(self): assert self.network is not None, "self.initialize_network must be called first" self.optimizer = torch.optim.Adam(self.network.parameters(), self.initial_lr, weight_decay=self.weight_

weixin_44858814的博客 3820

Spring Cloud Gateway 结合OAuth2提供UAA服务

微服务做用户认证和授权一直都是一个难点,随着OAuth2.0的密码模式被作废,更是难上加难了。今天胖哥群里的一个群友搭建用户认证授权体系的时候遇到了一些棘手的问题,这让胖哥觉得是时候分享一些思路出来了。 两种思路 通常微服务的认证和授权思路有两种: 所有的认证授权都由一个独立的用户认证授权服务器负责,它只负责发放Token,然后网关只负责转发请求到各个微服务模块,由微服务各个模块自行对Token进行校验处理。 另一种是网关不但承担了流量转发作用,还承担认证授权流程,当前请求的认证信息由网关中继给下游

duan18888的博客 645

深交所 vs 上交所:Level-2实时数据推送规则详解与策略适配指南

本文深度解析沪深Level-2实时数据推送规则的关键差异,包括逐笔成交、逐笔委托和10档行情接口的处理逻辑。针对高频交易策略,详细对比上交所与深交所在数据推送机制、时间戳处理及委托队列解析等方面的差异,并提供具体的策略适配方案和性能优化建议,帮助量化投资者提升跨市场交易稳定性。

weixin_27310417的博客 1135

从工创赛实战到开源:一个高鲁棒性智能物流视觉系统的构建与优化

本文分享了从工创赛实战中构建高鲁棒性智能物流视觉系统的完整经验。针对赛场复杂光线环境,详细阐述了摄像头选型、基于CLAHE和形态学梯度的抗干扰色环识别算法、卡尔曼滤波状态估计以及多线程串口通讯与任务调度等核心优化策略,旨在打造一个稳定可靠的视觉系统,并已将相关代码开源。

weixin_29046035的博客 297

小白学习微信小程序的图像识别和文字识别技术

其中,type参数指定了识别的类型,imageUrl参数指定了图片的地址,success回调函数用于处理识别成功的结果,fail回调函数用于处理识别失败的情况。其中,type参数指定了识别的类型,imageUrl参数指定了图片的地址,success回调函数用于处理识别成功的结果,fail回调函数用于处理识别失败的情况。下面,我们来实现一个文字识别的应用案例,可以识别一张图片中的文字,并将识别结果显示到小程序的页面上。在小程序中,也可以使用微信提供的文字识别接口,实现文字识别的功能开发。

qq_67153941的博客 1641

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 476

2 中望CAD二次开发-绘制图形(ZRX C++)

本文讲解中望CAD二次开发,关于块的概念及基本图形的绘制

cilvsuanna的博客 405

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: Isaac Lab 机器人强化学习进阶指南:从配置优化到实战调参全流程解析
下一篇: Google Gen AI Python SDK 实战:从零构建智能应用
Tim Shen
博客等级 码龄10年 51粉丝 9210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值