流畅的python笔记(三)字典和集合

python中collections.abc.Mapping 和collections.Mapping的区别 阅读详情

目录

一、泛映射类型

二、字典构建与字典推导式

三、常见泛映射类型的方法

常见方法

用setdefault处理找不到的键

四、映射的弹性键查询

defaultdict:处理找不到的键的一种选择

特殊方法__missing__

五、字典的变种

collections.OrderedDict

collections.ChainMap

collections.Counter

collections.UserDict

六、子类化UserDict 

继承UserDict重写StrKeyDict0

MutableMapping.update

Mapping.get

七、不可变映射类型

八、集合论

set & frozenset

集合字面量

集合推导式

集合的操作

九、dict与set的背后

散列表

散列表算法

dict实现导致的后果

set的实现以及导致的结果


一、泛映射类型

collections.abc模块中有Mapping和MutableMapping两个抽象基类,他们的作用是为dict和其它泛映射类型定义形式接口。

可以用isinstance函数来判定某个对象是不是泛映射类型

import collections

my_dict = {}
print(isinstance(my_dict, collections.Mapping))
# 输出True

所谓泛映射类型即键值对类型。泛映射类型中键必须是可散列的,可散列对象有三点要求:

第一:在此对象的生命周期中,其散列值不变

第二:需要实现特殊方法__hash__

第三:要有__qe__方法

        若两个可散列对象相等,则其散列值一定相等。

        原子不可变数据类型,如str、bytes和数值类型都是可散列类型,frozenset也可散列。当元组类型中的元素都是可散列类型时,元组也可散列,如果元组中有不可散列的元素,则元组不可散列。

        一般自定义类型可散列,散列值即id()返回值,即其在内存中的地址。

二、字典构建与字典推导式

字典构建方式有很多种,可以用{}也可以用dict()。

可以用字典推导式来构建字典,基本形式类似列表推导式和生成器表达式。字典推导式可以从任何以键值对为元素的可迭代对象中构建出字典。

如上例子中,用于列表推导式的可迭代对象是一个列表,其元素是含有两个元素的元组,当然这两个元素可以一个用来做键,一个做值。

三、常见泛映射类型的方法

常见方法

用setdefault处理找不到的键

当使用d[k]时如果字典d没有键k,python会抛出异常。可以用d.get(k, default)来代替d[k],这样当找不到键k的时候就返回默认值default。但是当我们的目的不是打印出键k对应的值,而是为了更新值得时候,用get()方法就会显得很不自然,d.get(k, default) = x,相当于给一个默认值default赋值了。因此get()并不是处理找不到的键的最好方法。

        下面看一个例子。

这个例子的作用是获取一个文件中各个单词出现的位置。字典index中的元素是各个单词及其出现位置的映射,由于单词重复出现位置可能有很多个,因此每个单词都映射到一个列表,这个列表中的元素是该单词出现的位置元组。如下所示,Although出现的位置有三个。

明确目的,我们这个例子是为了观察字典的setdefault方法相比get方法在处理不存在的键时优在哪。

        word即单词,location即当次遍历单词出现的位置。首先我们看上图中用get方法时,在标号1处会先进行一次对word的查找,如果word不存在,则标号1处会返回一个空列表关联到occurrences,然后标号2处把word此次出现的位置添加到列表occurrences中,然后在标号3处,实际上又对word进行了一次查找工作,然后把word和occurrences映射存入index。相当于进行了两次键的查询。产生两次查找的主要原因是在标号1处用get方法时只是返回了一个默认的空列表,但是没有把单词和列表之间的映射直接存到index中。

        再来看看用setdefault方法时的代码。只需要把上边标号1 2 3处的三行代码替换成如下一行代码:

index.setdefault在第一次查找word时直接就将 "word" : [ ] 的映射加到index字典中了,因此只要再把location放进空列表中即可,省去了第二次查找。即上边用setdefault的写法跟下边等价:

 如果键不存在,则把键值对加入字典,然后更新键对应的值。

四、映射的弹性键查询

上一节中sefdefault方法主要的用处是在于查找并插入新值,如果只查找的话,希望给不存在的键一个默认的返回值,本节说了两种方法,一是通过一种特殊的字典类型defaultdict,一种是自定义一个dict的子类,并子类中实现特殊方法__missing__。(我寻思直接用get方法也行啊)

defaultdict:处理找不到的键的一种选择

defaultdict类在collections模块中。

现在用defaultdict类来解决上一节中的问题。如下图所示,只需要在标号1中把原先的字典替换成defaultdict,注意在定义这个类时需要给其构造函数传入一个可调用对象,如图中传递的是list(defaultdict类型的对象有一个对象属性default_factory = list)。则如下所示,如果index[word]的时候特殊方法__getitem__找不到word,则index会默认调用default_factory,下图实例中即调用传递来的可调用对象list会word创造一个默认的值,list函数创造出来的默认值当然就是一个空列表,然后这个空列表被赋值给index[word](本来就是为键word创造出来的值),然后再用append方法就能成功加入location了。

可以看到创建defaultdict的时候一般必须指定default_factory,如果不指定的话,如果查询了一个不存在的键则会触发KeyError。 

        需要注意的是default_factory只在__getitem__中调用,即用index[word]时如果word查不到则会自动调用default_factory,但是如果用index.get(word)时会直接返回None,不会调用default_factory。

        本质上以上机制是由特殊方法__missing__实现的,defaultdict实现了__missing__方法,则方键找不到时会自动调用default_factory,这个特性一般所有映射类型都会去支持。

特殊方法__missing__

映射类型在通过__getitem__找不到键的时候(比如用方括号时d[k]找不到键k),就会自动调用__missing__,但是在其它找键的情况比如get或者__contains__(in运算符底层调用__contains__)找不到键的时候不会调用__missing__,还是会返回异常,即明确__missing__只被__getitem__调用。

        虽然键可以是很多类型,比如数字,字符串等,但是有些情况下我们希望在查询的时候,把键全部转化成str。

        下边这个例子中,虽然字典StrKeyDict0的对象d中的键都是字符串,但是当我们用数值2或者4来查找时还是能找到正确的值。

 下面是StrKeyDict0的定义。

class StrKeyDict0(dict): # StrKeyDict0继承自dict
    def __missing__(self, key):
        if isinstance(key, str):
            raise KeyError(key) # __missing__是用来处理找不到的键的,如果找不到的键本身就是字符串,那么会触发KeyError异常
        return self[str(key)] # 如果找不到的键本身不是字符串,那么就转成字符串再查找一次

    def get(self, key, default=None):
        try:
            return self[key] # get方法这里实际上把查找工作委托给__getitem__了,因为这里用了【】索引
        except KeyError: # 如果抛出了KeyError,那么说明__missing__也失败了,就直接返回default了
            return default

    def __contains__(self, key): # 先按照传入的键来查找,如果找不到就转换成字符串再找一次
        return key in self.keys() or str(key) in self.keys() 

上边定义中可以看到在__missing__中一定要先判断传入的键是不是字符串,如果是字符串还找不到,那就直接抛出异常。这样做是为了防止无限递归调用。试想如果__missing__中只有

return self[str(key)] 这一行,那么当StrKeyDict0对象传入一个键key,就会调用__getitem__方法,__getitem__找不到这个键,就会调用__missing__,__missing__中返回self[str(key)]又会调用__getitem__,这样就会导致无限递归调用了。

        还有__contains__中的实现,直接判定key或者str(key)是否在self.keys()中,而不是用 k in my_dict这种python风格的代码,因为 in 运算符会调用__contains__,因此如果那样用的话又会形成无限递归调用。

五、字典的变种

标准库模块collections中,除了defaultdict外还有很多不同的字典类型。

collections.OrderedDict

顾名思义,有序字典,但是这个有序不是说按照键的字典序排序之类的,而是说保持插入顺序,即在迭代的时候,先插入的就先访问到,后插入的就后访问到。OrderedDict的popitem方法默认删除并返回插入的最后一个元素,但是如果popitem(last=Falst)则删除并返回第一个插入的元素。

        普通字典是没办法保存插入顺序的。

collections.ChainMap

没用到过,用到再说。

collections.Counter

用到再说。

collections.UserDict

就是把标准dict用纯python又实现了一遍

六、子类化UserDict 

继承UserDict重写StrKeyDict0

collections.UserDict是专门用于自定义映射类型的基类。

 继承自UserDict主要是为了方便,本例中对于__missing__的实现跟上例一样没有改变,因为当__getitem__找不到键的时候一定会调用__missing__,所以if语句不能避免,否则还是会无线递归。

        __contains__的实现直接判断key字符串之后是否在self.data中,这里的self.data实质上是一个dict类型的字典对象,是UserDict的一个属性,也是UserDict真正存储数据的地方。 这里就可以直接用python风格判断str(key)是不是在self.data中,不用担心递归调用的问题,因为self.data找不到键会调用自己的__contains__,而不是我们自定义类的__contains__。

        __setitem__把所有键都转换成了字符串,这样在查询时候和储存时的键就都是字符串了。    

        UserDict不是从dict继承,而是继承自MutableMapping。MutableMapping又继承自Mapping,Mapping是一个抽象基类,但是提供了好几个使用方法。如下所示。

MutableMapping.update

此方法不但能直接用,还默认用在__init__中,当构造函数中传入各种参数(键值对序列就行)时会用这个方法新建实例。这个方法用self[key] = value来添加新值,本质上是在使用__setitem__方法。

Mapping.get

其源码实现跟StrKeyDict一样。目的是为了让get的行为跟__getitem__保持一致。

七、不可变映射类型

标准库中的所有映射类型都是可变的。types模块中有一个封装类型MappingProxyType,其初始化参数接受一个映射对象,返回一个只读的映射视图,这个映射视图是动态的,这个映射视图不能更改,但是原初始化参数的更改可以反应到该映射视图上。

        如下图例子,用MappingProxyType返回一个字典d的映射视图d_proxy,d_proxy不能更改,但是更改d的话可以反映到d_proxy上。 

八、集合论

set & frozenset

在python中集合类主要是set和frozenset。

集合的本质是许多唯一对象的集合,因此集合可以用于去重。且因为集合的背后是散列表,因此查询速度极快。

集合中的元素必须可散列,如果我们要定义嵌套集合对象,里边的集合不能是set对象,因此set对象是不可散列的,但是frozenset是可散列的,因此可以创建包含不同frozenset的set。

       集合实现了交(a & b)、并(a | b),差(a - b)等操作。

集合字面量

定义集合有两种方式。

        一种是直接用{ }来定义,如 s = {1, 2, 3}。

        一种是用set([1, 2, 3])。

        前者比后者要快一点,因为用set()定义的时候,python会先去查询set的构造函数,然后新建一个列表,最后把列表传入到构造函数里,但是直接用 { }的话python会利用一个专门的叫做BUILD_SET的字节码来创建集合。

        需要注意的一点是空集合的定义,应该用 s = set() 而不是 s = { },因为后者实际上是定义了一个空字典。

        frozenset只能用构造函数来定义。

集合推导式

学了前边的列表推导式和生成器表达式、字典推导式等,再看集合推导式就是水到渠成了。 

集合的操作

 

 

 

 

 

 

九、dict与set的背后

散列表

散列表是一个稀疏数组,其中的单元叫做表元(bucket),在dict中,每个键值对占用一个表元,每个表元分为两个部分,一个是对键的引用,一个是对值的引用。python会保证三分之一的表元是空的,因此快达到这个阈值的时候,原有散列表会被复制到一个更大的空间中去。散列表中每个表元的大小都是一样的,因此可以根据键的散列表来确定一个偏移量,通过偏移量来定位到某个表元。

        要把一个对象放入散列表,首先要计算这个元素键的散列值,python中用hash()方法实现。

        内置hash()方法可以用于所有的内置类型对象,如果对自定义类型对象调用hash(),则实际运行的是自定义的特殊方法__hash__,在这个特殊方法里边应该还是计算内置类型的hash吧。如果两个对象在比较的时候是相等的,那么他们的散列值必须相等。如果 1 == 1.0为真,那么hash(1) == hash(1.0)也必须为真。

        为了让散列值能够充当散列表索引,散列值在索引空间中应该尽量分散开来。最理想的情况下越是相似但不想等的对象,其散列值差别应该越大。

散列表算法

  1. 给定一个search_key,为了获取其对应的值my_dict[search_key]
  2. python首先调用hash(search_key)计算键search_key的散列值,以这个值的最低几位数字(位数跟当前散列表大小有关,散列表越大,需要的位数越多)作为偏移量,在散列表中查找表元。
  3. 若找到表元为空,则返回KeyError,即不存在该键search_key
  4. 若找到表元非空,则表元中存储了两个引用,found_key和found_value。检验search_key == found_key是否为真,如果为真则返回found_value。如果为假,则发生了散列冲突。
  5. 散列冲突是因为两个键的散列值的最后几位相等,因此造成在散列表中偏移量相同。解决散列冲突有很多种方法,一般可以在散列值上再取几位,然后处理一下得到新的偏移量再次寻找表元。

        如果是插入新值而非简单查找,则python会根据散列表的拥挤程度决定是否扩容,扩容以后散列表增大,则散列值位数与用作索引的位数都会增加,这样做可以减少发生散列冲突的概率。值得注意的是散列冲突并不经常发生,是很偶然的事件。

dict实现导致的后果

  1. 键必须是可散列的。可散列对象要满足三个条件:(1)支持hash()函数,并且通过__hash__方法得到的散列值是不变的。(2)支持通过 __eq__方法来检测相等性。(3)若a == b 为真,则hash(a) == hash(b)也为真。
  2. 字典在内存上开销巨大。字典使用散列表,而散列表必须是稀疏的,因此空间效率低下。要节省空间可以用元组取代字典,优化原因有两个:其一是避免了散列表所耗费的空间,其二是无需把记录中字段的名字在每个元素里存一遍。在用户自定义的类中,通过__slots__属性可以改变实例属性的存储方法,由dict变成tuple。
  3. 键查询很快。dict实现是典型空间换时间,无视数据量大小常数时间复杂度访问。
  4. 键的次序取决于添加顺序。当往字典里添加新键,而且发生散列冲突,则新键会被安排到另一个位置。于是当两个键被添加到字典中的顺序不同,虽然得到的是相同的字典,但是这两个键出现在字典中的顺序是不一样的。
  5. 往字典里添加新键会改变已有键的顺序。无论何时往字典里添加新键,python解释器都可能为字典扩容,导致新建一个更大的散列表,这个过程可能发生新的散列冲入,导致新散列表中键的次序变化。因此不要在循环字典的时候同时修改,因为修改以后字典中键的顺序可能已经变了,因此可能循环会跳过一些键。

set的实现以及导致的结果

set和frozenset也是基于散列表实现的,知识其表元中只存储有键的引用,没有值的引用。

 

 

掌握Python自定义字典类型:打造自己的映射容器 Python容器类型的常用操作对于一个Python使用者来说应该不陌生,其中字典是一种更复杂的容器结构。但有时候内容容器类型并不能满足我们的需求,我们有时候需要创造新的容器类型来满足需求,这篇文章我们一起看一下如何自定义字典类型?__init__: 初始化方法,用于创建字典实例并进行初始化操作。: 获取指定键对应的值。: 设置指定键对应的值。: 删除指定键及其对应的值。__len__: 返回字典中键值对的数量。__iter__: 返回一个迭代器,用于遍历字典中的所有键。keys() 阅读详情

相关推荐

【Python】map()函数

在Python的浩瀚工具箱中,函数以其独特的函数式编程风格,为数据处理提供了简洁而高效的途径。它不仅仅是一个简单的迭代器,更是一种思维模式的体现,是“批量转换”这一核心需求的抽象与封装。要真正掌握,我们必须超越其表象,深入其哲学起源与最底层的核心概念。函数是函数式编程(Functional Programming, FP)范式中的一个基石。在FP中,程序被视为数学函数的求值,强调不可变性(immutability)、无副作用(no side effects)和高阶函数(higher-order functi

宅男很神经 3472

【Python学习笔记】四、映射(Mapping)

• 通过名字来引用值得数据结构称为映射字典(Dict)•   字典是键值对(key-value pair)的无序可变集合。(1)字典的操作①字典的创建• 字典中的每个元素包含两部分:键和值。• 键和值用冒号分隔,元素间用逗号分隔,所有元素放在一对大括号中。d = {key1 : value1, key2 : value2 }• 字典中的键为任意不可变对象,比如整数、实数、复数、字符串、元组等。• ...

Dramaturgy的博客 2万+

流畅的python学习笔记(三):数据结构(2:字典和集合)

文章目录字典和集合泛映射类型 字典和集合 dict 类型不但在各种程序里广泛使用,它也是 Python 语言的基石。模块的命名空间、实例的属性和函数的关键字参数中都可以看到字典的身影。跟它有关的内置函数都在 __builtins__.__dict__模块中。 正是因为字典至关重要,Python 对它的实现做了高度优化,而散列表则是字典类型性能出众的根本原因。 集合(set)的实现其实也依赖于散列表,因此本节也会讲到它。反过来说,想要进一步理解集合和字典,就得先理解散列表的原理。 本节大纲: 常见的字典方

qq_36591680的博客 572

python中mapping_python-学习-ORM中遇到的 mapping 详解并再总结字典dict

python里的字典dict(mapping)如何使用Python字典的构造函数有三个,dict()、dict(**args)、dict(mapping),其中第一个、第二个构造函数比较好理解也比较容易使用,而dict(mapping)这个构造函数的使用比较难理解。1. dict()构造函数可以返回一个空的字典In [7]: d = dict()In [8]: print (d){}2. dic...

weixin_39935092的博客 5058

VXLAN技术详解

VXLAN(虚拟可扩展局域网)是一种Overlay二层虚拟化技术,通过MAC-in-UDP封装在IP网络上构建大规模虚拟二层网络。核心组件包括VTEP(隧道端点)、24位VNI(支持1600万个虚拟网络)和VXLAN网关。相比VLAN,VXLAN具有超大规模扩展、跨三层互联、支持虚拟机无缝迁移等优势,适用于云数据中心多租户隔离、跨数据中心互联等场景。其基于IP路由的封装方式无需改造物理网络,为现代云网络提供了弹性、安全的虚拟化解决方案。

kjkdd的博客 594

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

本文将介绍在Windows 10系统下搭建深度学习环境的完整过程,包括安装Anaconda、CUDA、NVIDIA显卡驱动以及Pytorch框架。后续本专栏的Python语言下的深度学习环境都以本篇搭建的为准。

fengzhuqiaoqiu的博客 3996

流畅的python读书笔记③:字典和集合

字典这个数据结构活跃在所有 Python 程序的背后,即便你的源码里并没有直接用到它。——A. M. Kuchling

fishfuck的博客 386

企业AI数据资产评估的自动化工具:AI应用架构师的使用指南

在AI驱动的企业数字化转型中,数据资产是支撑模型训练、业务决策的核心燃料。然而,80%的AI项目失败源于数据问题——低质量数据导致模型偏差、未评估的风险引发合规危机、价值不明确的数据浪费资源。手动数据资产评估效率低、易出错,无法满足规模化AI应用需求。本文将以AI应用架构师的视角,拆解企业数据资产评估的核心逻辑,用"餐厅选食材"的生活化比喻解释复杂概念,结合自动化工具的技术原理与实战案例,教你如何从0到1搭建数据资产评估体系。无论是数据质量检测、价值量化还是风险防控,你都能找到可落地的工具方案与实践步骤。

2502_91592937的博客 1629

流畅的Python(三)-字典和集合

1. 字典和集合数据都是以的形式存储2. 数据要放入散列表,首先需要计算元素(字典中的key/集合中的元素)的-通过hash(key)算法计算所得,并且将散列值的(低位)作为索引,所以无论是字还是必须满足的条件是3. 散列表算法-以字典数据查询为例说明比如有一个字典d1:{'name':'Bill','age':18,'gender':'male'},为了获取d1['name']的值,Python首先会调用。

weixin_37901366的博客 958

基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)

详细步骤1 数据集的制作1.1 数据标注1.2 生成数据集2 环境的搭建2.1 搭建流程2.2 注意事项(报错)3 开始训练4 可视化4.1 修改webcam.py文件4.2 进行可视化5 参考文章 1 数据集的制作 1.1 数据标注 使用 labelme=4.5.6 版本进行标注,标注文件指定到保存图片的路径下,也就是json文件和jpg文件放在同一个文件夹里 1.2 生成数据集 先手动划分训练集和测试集(包括图像和标注文件),然后分别整合它们的标注信息,参考代码:1_ships_to_coco.py

G果的博客 8001

Android 13.0 Launcher3中去掉Hotseat功能实现

在13.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 1327

【流畅的Python】第三章:字典和集合——《Fluent Python》学习笔记

介绍了dict、defaultdict和OrderedDict实现的常用方法,如clear、copy、get、items、keys、pop、popitem、setdefault、update、values等,以及它们的功能和用法。

HearMeRoar_的博客 1236

【AI大模型应用开发实战】大型语言模型评估指南白皮书(LLM Eval)

近年来,大型语言模型(LLM)在自然语言处理领域取得了重大进展,例如 GPT-3 和 Chat-GPT。这些模型经过大型数据集的训练,在文本相关任务中表现出卓越的能力,甚至超越了人类。本文将简要介绍如何验证 LLMs 性能的评估指标。自然语言处理(NLP)是人工智能的一个领域,涉及计算机和人类语言之间的交互。NLP 的基本任务之一是语言建模 (LM),它涉及构建统计模型来分析和生成自然语言。LM 已成为推进机器语言智能的关键方法,使机器能够执行机器翻译、情感分析和对话系统等任务。

AI天才研究院 1011

《流畅的Python第二版》读书笔记——字典和集合

字典类型不仅广泛地应用于我们的程序,而且是Pthon实现的基础。类和实例的属性、模型命名空间和函数的关键词参数都是通过字典表示的。 本文新增对Python压缩字典和保持插入顺序的详细解读。

日积月累,天道酬勤 1664

(王道计算机组成原理)第二章数据的表示和运算-第三节:运算方法和运算电路 1(基本运算部件)

本文主要介绍了计算机组成原理中的加法器和算术逻辑单元(ALU)的基本概念与实现原理。首先,文章详细讲解了一位全加器的工作原理,包括其输入输出、逻辑表达式及真值表。接着,介绍了并行加法器的两种类型:串行进位和并行进位的加法器,分析了它们的优缺点。随后,文章探讨了带标志位的加法器,说明了如何通过标志位生成逻辑来判断加法结果的状态。最后,文章阐述了ALU的功能及其实现原理,包括ALU的基本结构、控制信号的作用以及在实际考试中的图示表示。通过这些内容,读者可以全面了解加法器和ALU在计算机中的重要作用及其工作原理。

快乐江湖的博客 3837

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击

计算机视觉:AI生成内容(AIGC)对视觉领域的冲击​ 人工智能,计算机视觉,大模型,AI,在信息技术日新月异的当下,计算机视觉作为人工智能领域的关键分支,已经深度融入了我们生活与工作的各个层面。从安防监控系统里精准的人脸识别,助力维护公共安全;到工业生产线上高效的产品质量检测,保障产品品质;再到医疗影像分析中为疾病诊断提供有力支持,计算机视觉技术凭借其对视觉信息的强大处理与理解能力,不断推动着各行业的发展与变革。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 17万+

流畅的Python(三) 字典和集合

Python字典是编程中的核心数据结构,本章介绍了其现代用法和高效处理技巧。字典推导式可简洁构建字典,映射拆包(**)便于函数参数传递和字典合并。Python 3.9引入的|和|=运算符使字典合并更直观。模式匹配(match/case)能灵活处理字典数据,支持部分匹配和捕获额外键值对,避免KeyError异常。这些技术让字典操作更Pythonic,提升代码可读性和健壮性。

hi0_6的博客 903

深度学习工具包 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")

流畅的Python读书笔记(字典、集合)

流畅的Python读书笔记(字典、集合) 先上总体框架 一、范映射类型 这个地方不需要特别注意,因为在实际操作中过程中,我们可以再查看相关文档来补。 可散列对象可以简单地理解为:值不会发生改变的对象就是可散列的对象。散列值就是__hash__方法返回的值。注意区分hash和id的区别。具体参考 链接: hash和id的区别. 二、字典的推导 这里话不多说直接上代码。 (1)字典的简单构造 a = dict(one=1,two=2, three=3) b = {‘one’:1, ‘two’:2, ‘t

anwen12的博客 478

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

[读书笔记]流畅的python-字典和集合

流畅的python——字典和集合泛映射类型setdefault和defaultdict字典的变种不可变映射类型集合dict和set的背后dict和set的效率字典中的散列表dict的实现及其导致的结果set的实现及其导致的结果 泛映射类型 标准库中的所有映射类型都是利用dict实现的,只有可 散列的数据类型才能用作键。 可散列: 如果一个对象是可散列的,在生命周期中,散列值是不变的。 需要实现__hash__()方法和__qe__()方法 不可变数据类型(str,bytes和数值类型)都是可散列的 如果元

shuaziii的博客 267

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

流畅的python第三章, 字典和集合

目录 只有可散列的数据类型才能作为这些映射里的键 字典推导 常见的映射方法 给找不到的键返回一个默认值 missing 集合论 重点, 深度剖析python字典 1. 只有可散列的数据类型才能作为这些映射里的键 如果一个对象是可散列的,那么这个对象的生命周期中,它的散列值是不变的,而且这个对象需要实现__hash__(),qe()方法,这样才能比较,原子不可变的数据类型都是可散列的(str, bytes, 和 数值类型), 1.1 元组的话只有当一个元组包含的所有元素都是可散列的,他才是可散列的 t.

qq_40666620的博客 326

在python中、字典和集合都是用一对什么作为界定符_Python字典和集合拾遗 --流畅的python...

字典和集合本章对python中字典和集合的内容做一些拾遗,主要内容来自流畅的python第三章。建议通过Jupyter Notebook来试验本文代码,关于Jupyter Notebook使用可以阅读这里, 本文代码已经放在这里。本章内容适合对python有一定了解的读者。通过本章你可以了解到:字典和集合的基本使用如何处理字典中不存在的键字典和集合为何比列表高效一些简单字典变种的介绍映射我们知道,...

weixin_39843698的博客 1383

《流畅的Python》读书笔记04: 第一部分 数据结构 - 字典和集合

流畅的 Python》第 3 章深入讲解了 Python 中字典(dict)和集合(set)这两种重要的数据结构。字典是 Python 语言的基石——实例属性、模块命名空间、函数的关键字参数等,底层都用字典承载。即使程序中没有显式使用字典,任何运行的 Python 程序背后也活跃着多个字典实例。散列表(hash table,即哈希表)。字典和集合都基于散列表实现。理解散列表的工作原理,是真正掌握字典和集合性能特征、适用场景以及背后设计哲学的关键。常见的字典方法如何处理查找不到的键(

2632

[流畅的Python][3][字典和集合]

第3章 字典和集合 字典这个数据结构活跃在所有的python程序背后,即便你的源码中并没有直接用到它。—A.M.Kuching dict类型不但在各种程序里广泛使用,它也是Python语言的基石 模块的命名空间、实例的属性和函数的关键字参数里都可以看到字典的影子 正因为字典至关重要,Python对它的实现做了高度优化,而散列表...

T0UGH 197

在python中、字典和集合都是用一对什么作为界定符_流畅的python读书笔记-第三章Python 字典与集合...

字典和集合标准库里的所有映射类型都是利用 dict 来实现的只有可散列的数据类型才能用作这些映射里的键(值不用)可散列一个对象是可散列的它的散列值是不变的对象需要实现 __hash__() 方法可散列对象还要有 __qe__() 方法字典推导DIAL_CODES = [(86, 'China'), (91, 'India'), (1, 'United States'), (62, 'Indones...

weixin_39825872的博客 939

《流畅的python》学习笔记及书评

《流畅的python》学习笔记 文章目录《流畅的python》学习笔记写在前面1. Python数据模型1.1 特殊方法2. 序列构成的数组2.1 内置序列类型2.2 列表推导和生成器表达式2.3 元组不仅仅是不可变的列表2.4 切片2.5 增量赋值2.6 排序2.7 数组、内存视图、NumPy和队列3. 字典和集合3.1 泛映射类型和字典推导3.2 常见的映射方法3.3 映射的弹性键查询3.4 字典的变种3.5 集合3.6 dict和set的背后4. 文本和字节序列4.1 字符和字节4.2 编码和解码4.

李英俊小朋友 2463

流畅的python 字典和集合

介绍 dict 类型不但在各种程序里广泛使用,它也是 Python 语言的基石。模块的命名空间、实例的属性和函数的关键字参数中都可以看到字典的身影。跟它有关的内置函数都在 __builtins__.__dict__模块中。 正是因为字典至关重要,Python 对它的实现做了高度优化,而散列表则是字典类型性能出众的根本原因。 集合(set)的实现其实也依赖于散列表,因此本章也会讲到它...

dianshuochi1092的博客 227
上一篇: 流畅的python笔记(二)数据结构
下一篇: 流畅的python笔记(四)文本和字节序列
罗古洞的女婿
博客等级 码龄10年 1117粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值