Python源码解读之一 万物皆对象(上)

深度学习中小知识点系列(二十三) 解读python中的装饰器(极为详尽) 最近有人问我装饰器是什么,我就跟他说,其实就是装饰器就是类似于女孩子的发卡。你喜欢的一个女孩子,她可以有很多个发卡,而当她戴上不同的发卡,她的头顶上就是装饰了不同的发卡。但是你喜欢的女孩子还是你喜欢的女孩子。如果还觉得不理解的话,装饰器就是咱们的手机壳,你尽管套上了手机壳,但并不影响你的手机功能,可你的手机还是该可以给你玩,该打电话打电话,该玩游戏玩游戏,。而你的手机就变成了带手机壳的手机。装饰器就是python的一个拦路虎,你干或者不干它,它都在那里。 阅读详情

万物皆对象

初探对象

Python中一切皆对象,在Python的世界里面,所有东西都是对象。整型、字符串、字典、int、str、list、class自定义类都是对象。

像int、str、list等基本类型,以及我们自定义的类,由于它们可以表示类型,因此我们称之为类型对象;类型对象实例化得到的对象,我们称之为实例对象。不管是哪种对象,它们都属于对象。

所以在Python当中,不管是“类”还是“对象”都是由对象实现的。

对象是由类实例化得到的,所以对象一定有类型,对象被谁实例化决定了它的类型。那么int,tuple,str这些内置的类是什么类型的呢?

print(type(int))
print(type(dict))
print(type(str))
print(type(type))

<class ‘type’>
<class ‘type’>
<class ‘type’>
<class ‘type’>

我们可以发现不管是int,dict还是type,它们的类型都是type。而type我们称为元类,表示类型对的类型。

Python中还有一个特殊的对象object,他是所有类型对象的基类。在Python3中,自定义的类即使不显式的继承object,也会默认继承自object。

谈到继承,这里稍微提一下查看继承的三个方法

class A:
    pass

class B:
    pass

class C(A):
    pass

class D(B, C):
    pass

# 首先D继承自B和C, C又继承A, 我们现在要来查看D继承的父类
# 方法一: 使用__base__
print(D.__base__)  # <class '__main__.B'>

# 方法二: 使用__bases__
print(D.__bases__)  # (<class '__main__.B'>, <class '__main__.C'>)

# 方法三: 使用__mro__
print(D.__mro__)
# (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

好了,讲到这里相信有小伙伴心里会提出些许疑问,type是所有类的元类,而object是所有的基类,这就说明type是要继承自object的,而object的类型是type,那么type和object到底先有哪个。

这个问题是这样的,type和object其实是相互依赖的,在之后的文章中我会提到。目前只需要记住两点就是:

  • 任何对象溯源之后类型都是type
  • object是所有类的基类

这里有个点需要注意:

type的类型还是type,但是object的基类是None。 原因是当Python查找属性或者方法时,会回溯继承链,所以类的继承必须有个终点,不然就会出现死循环。

可变对象与不可变对象

Python中的变量

Python中变量名实际存储的是对象的地址,也就是指针。当我们修改Python中变量的值得时候,修改的是变量代表的指针,并没有修改指向内存里面存储的内容

下面和C语言比较一下就一目了然了

C:

#include <stdio.h>

void main()
{
    int a = 123;
    printf("address of a = %p\n", &a);

    a = 456;
    printf("address of a = %p\n", &a);
}

address of a = 0117FAC8
address of a = 0117FAC8

Python:

a = 123
print("address of a =", id(a))
a = 456
print("address of a =", id(a))

address of a = 2189885986992
address of a = 2189888882928

这样就能很明显看出两者的区别:

C语言是创建一个变量的时候必须规定好类型,比如int a = 123,那么变量a就是int类型,以后在所处的作用域中就不可以变了。如果这时候,再设置a = 456,那么等于是把内存中存储的123换成456,a的地址和类型是不会变化的。

Pythona = 123等于是先开辟一块内存,存储的值为123,然后让变量a指向这片内存,或者说让变量a存储这块内存的指针。然后a = 456的时候,再开辟一块内存,然后让a指向存储456的内存,由于是两块不同的内存,所以它们的地址是不一样的。

所以Python中的变量只是一个和对象关联的名字罢了,它代表的是对象的指针。换句话说Python中的变量就是个便利贴,可以贴在任何对象上,一旦贴上去了,就代表这个对象被引用了

Python变量的传递

a = 123
print("address of a =", id(a))
b = a
print("address of b =", id(b))

address of a = 1589969115312
address of b = 1589969115312

a = 123的时候,先开辟一份内存,再让a存储对应内存的指针;然后b = a的时候,会把a的地址拷贝一份给b,所以b存储了和a相同的地址,它们都指向了同一个对象。

所以说Python是值传递、或者引用传递都是不准确的,准确的说Python是变量之间的赋值传递,对象之间的引用传递。因为Python中的变量本质上就是一个指针,所以在b = a的时候,等于把a指向的对象的地址(a本身)拷贝一份给b,所以对于变量来说是赋值传递;然后a和b又都是指向对象的指针,因此对于对象来说是引用传递。

另外Python当传递一个变量的时候,传递的是指针;但是在操作一个变量的时候,会操作变量指向的内存。

我们说的Python变量类型是变量指向(引用)的对象的类型,这里有个问题是,我们在创建一个变量的时候,并没有显示的指定类型啊,但Python显然是有类型的,那么Python是如何判断一个变量指向的是什么类型的数据呢?

这个问题先留个坑,因为我也不是很确定。

PyObject

先看一下PyObject的源码

/* Nothing is actually declared to be a PyObject, but every pointer to
 * a Python object can be cast to a PyObject*.  This is inheritance built
 * by hand.  Similarly every pointer to a variable-size Python object can,
 * in addition, be cast to PyVarObject*.
 */
typedef struct _object {
    _PyObject_HEAD_EXTRA        // 双向链表 垃圾回收 需要用到
    Py_ssize_t ob_refcnt;       // 引用计数
    PyTypeObject *ob_type;      // 指向类型对象的指针,决定了对象的类型
} PyObject;

PyObject的结构体里一个三个成员:

_PyObject_HEAD_EXTRA:这个宏是一个双向链表,Python会将程序中创建的所有对象都放入到这个双向链表中,用于跟踪所有活跃的堆对像。不过这个宏只有在debug模式下生效。

PS:带EXTRA 字样的宏 只有在debug模式下才存在

#ifdef Py_TRACE_REFS
/* Define pointers to support a doubly-linked list of all live heap objects. */
#define _PyObject_HEAD_EXTRA            \
    struct _object *_ob_next;           \
    struct _object *_ob_prev;

#define _PyObject_EXTRA_INIT 0, 0,

#else
#  define _PyObject_HEAD_EXTRA
#  define _PyObject_EXTRA_INIT
#endif

可变对象 不可变对象

对象其实就是一片被分配的内存空间,内存空间可以使连续的,也可以是不连续的,最典型的就是数组和链表。

不可变对象:创建后内存中的值不可以被修改。

可变对象:内存存储的值是可以动态修改的。

a = 123
print("address of a =", id(a))
a = a + 1
print("address of a =", id(a))

address of a = 2189885986992
address of a = 2189888882928

这个就是一个很好的例子,修改a的值实际上是创建了一个新的对象,a指向的内存地址已经发生了变化。操作一个变量其实就是操作这个变量指向的内存,a = a + 1就是开辟一个新的内存空间存储124,至于原来的666所占的空间怎么办,Python解释器会看它的引用计数,如果不为0代表还有变量引用(指向)它,如果为0证明没有变量引用了,所以会被回收。

而列表、元组、集合都是可变对象,它们是可以修改的。

原因是:

​ 这些容器它们的内部存储的也不是具体的对象,而是对象的指针。比如:lst = [1, 2, 3],你以为lst存储的是三个整型对象吗?其实不是的,lst存储的是三个整型对象的指针,当我们使用lst[0]的时候,拿到的是第一个元素的指针,但是操作(比如print)的时候会自动操作(print)指针指向的内存。

​ 换一个角度思考,Python底层是C来实现的,所以Python中的列表的实现必然要借助C中的数组。可我们知道C中的数组里面的所有元素的类型必须一致,但列表却可以存放任意的元素,因此从这个角度来讲,列表里面的元素它就就不可能是对象,因为不同的对象在底层对应的结构体是不同的,所以这个元素只能是指针。

lst = [1, 2, 3]
print(id(lst))
lst.append(4)
print(id(lst))

2041707447872
2041707447872

我们看到列表在添加元素的时候,前后地址并没有改变。列表在C中是通过PyListObject实现的,我们在介绍列表的时候会细说。这个PyListObject内部除了一些基本信息之外,还有一个成员叫ob_item,它是一个PyObject的二级指针,指向了我们刚才说的PyObject *类型的数组的首个元素的地址。

Imgur

这个地方有两点需要注意:

1.PyObject *数组内部的元素是连续且有顺序的,但是指向的整型对象则是存储在堆区的,它们的位置是任意性的。但是不管这些整型对象存储在堆区的什么位置,它们和数组中的指针都是一一对应的,我们通过索引是可以正确获取到指向的对象的。

2.Python中的列表在底层是分开存储的,因为PyListObject结构体实例并没有存储相应的指针数组,而是存储了指向这个指针数组的二级指针。显然我们添加、删除、修改元素等操作,都是通过这个二级指针来间接操作这个指针数组。

因为在Python中一个对象一旦被创建,那么它在内存中的大小就不可以变了。所以这就意味着那些可以容纳可变长度数据的可变对象,要在内部维护一个指向可变大小的内存区域的指针。而我们看到PyListObject正是这么做的,指针数组的长度、内存大小是可变的,所以PyListObject内部并没有直接存储它,而是存储了指向它的二级指针。但是Python在计算内存大小的时候是会将这个指针数组也算进去的,所以Python中列表的大小是可变的,但是底层对应的PyListObject实例的大小是不变的,因为可变长度的指针数组没有存在PyListObject里面

这么做的好处是:针维护对象的工作变得非常简单。

如果允许对象的大小可在运行期改变,那么我们就可以考虑如下场景。在内存中有对象A,并且其后面紧跟着对象B。如果运行的某个时候,A的大小增大了,这就意味着必须将A整个移动到内存中的其他位置,否则A增大的部分会覆盖掉原本属于B的数据。只要将A移动到内存的其他位置,那么所有指向A的指针就必须立即得到更新。这样一来维护工作就变得非常复杂。

定长对象 变长对象

首先上一组代码

import sys

print("sys.getsize(0) = ", sys.getsizeof(0))
print("sys.getsize(1) = ", sys.getsizeof(1))
print("sys.getsize(2 << 33) = ", sys.getsizeof(2 << 33))

print("sys.getsize(0.) = ", sys.getsizeof(0.))
print("sys.getsize(3.14) = ", sys.getsizeof(3.14))
print("sys.getsize((2 << 33) + 3.14)) = ", sys.getsizeof((2 << 33) + 3.14))

sys.getsize(0) = 24
sys.getsize(1) = 28
sys.getsize(2 << 33) = 32
sys.getsize(0.) = 24
sys.getsize(3.14) = 24
sys.getsize((2 << 33) + 3.14)) = 24

从上面的代码运行结果可以明显看出,整形对象的大小不同,所占的内存大小也不同,所以我们称整形对象是变长对象。

而相反浮点数不管大小,所占的内存大小不变都是24,所以我们称浮点数是定常对象。

而且我们知道Python中的整数是不会溢出的,而C中的整型显然是有最大范围的,那么Python是如何做到的呢?答案是Python在底层是通过C的32位整型数组来存储自身的整型对象的,通过多个32位整型组合起来,以支持存储更大的数值,所以整型越大,就需要越多的32位整数。而32位整数是4字节,所以我们上面代码中的那些整型,都是4字节、4字节的增长。

浮点数的大小是不变的,因为Python的浮点数的值在C中是通过一个double来维护的。而C中的值的类型一旦确定,大小就不变了,所以Python的float也是不变的。

小结

这一节我们粗略介绍了Python中的对象体系,我们聊了“一切皆对象”,类型对象和实例对象都属于对象。

根据是否支持本地修改划分出了可变对象和不可变对象。

根据占用的内存大小是否可变划分出了定长对象和变长对象。

第22课:深入解读过滤器模式——制作一杯鲜纯细腻的豆浆 用程序来模拟生活 从剧情中思考过滤器模式 过滤器模式 与职责模式的联系 过滤器模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 设计要点 优缺点 实战应用 应用场景 【故事剧情】 腊八已过,粥已喝,马上就要过年了!别人家的公司现在都是开年会、发现金红包、发 iPone、发平衡车什么的,而 Tony 什么也没有,只能默默地躲在朋友圈的角落里,好在最后一... 阅读详情

相关推荐

Python与PyTorch系列(三) 本文(4.2万字) | 解读Python中的装饰器 | 复现各种装饰器 | 给出众多实用装饰器 |

最近有人问我装饰器是什么,我就跟他说,其实就是装饰器就是类似于女孩子的发卡。你喜欢的一个女孩子,她可以有很多个发卡,而当她戴上不同的发卡,她的头顶上就是装饰了不同的发卡。但是你喜欢的女孩子还是你喜欢的女孩子。如果还觉得不理解的话,装饰器就是咱们的手机壳,你尽管套上了手机壳,但并不影响你的手机功能,可你的手机还是该可以给你玩,该打电话打电话,该玩游戏玩游戏,。而你的手机就变成了带手机壳的手机。装饰器就是python的一个拦路虎,你干或者不干它,它都在那里。

专注于人工智能学习,总结 1017

python中一切皆为对象

在python中一切皆为对象,变量是对象,函数是对象,类也是对象。对象(object)是指在内存中具有)的实例。换句话说,对象是一个具有属性和方法的实体,这些属性和方法可以被访问和操作。(1)唯一标识符:其实就是对象在计算机内存中的地址。可使用内置函数id(obj)返回对象的内存地址。(2)类型:表示对象存储的数据类型,使用内置函数type(obj)返回对象所属类型。(3)值:表示对象存储的数据信息,也就是对象的值。使用内置函数print(obj)可以直接打印值。

m0_46610658的博客 1463

uniapp监听扫码枪键盘事件|无输入框式监听

一般的扫码枪通过USB或蓝牙连接手机或电脑,充当的是一个外接设备。当扫码后,扫码枪会自动识别内容,然后向连接的电脑或手机发送键盘事件keydown或keyup。

tcy9099的专栏 9748

No.4 Python 万物皆对象

Python 是一种面向对象的编程语言。在Python,所有东西都可以称为对象。大到一个模块,小到一个字符串,都可以称之为对象。清楚的了解什么是对象,将对我们之后的开发大有裨益。

wupengfei_的博客 977

Halcon形状模板匹配实战:inspect_shape_model参数优化指南

本文深入解析Halcon形状模板匹配中inspect_shape_model参数的优化技巧,涵盖NumLevels和Contrast参数的实战应用。通过具体案例展示如何平衡匹配速度与精度,帮助开发者高效调试形状模型,提升工业视觉检测的准确性和效率。

weixin_30342209的博客 618

汽车电缆选型实战:基于ISO 19642-3~12的7类电缆电压/材料/场景对照表

本文详细解析了基于ISO 19642-3~12标准的7类汽车电缆选型实战,涵盖电压等级、导体材料和场景应用的对照表。通过全参数速查表和典型选型陷阱分析,帮助工程师快速掌握从低压信号线到高压动力电缆的选型逻辑,提升新能源汽车与智能驾驶技术的安全性和可靠性。

weixin_29043895的博客 365

Python源码学习笔记:Python万物皆对象

这篇博客的内容主要是针对Python中万物皆对象的理解,对Python的类型、对象体系做一个整体的梳理。(具体源码讲解会在后续发布)

xiaoli_Jenny的博客 1188

单片机通识之UART通信协议(如何用汇编实现)

使用汇编实现UART通信

smart_num_1的博客 996

Python一切皆对象的理解

我们都知道在python3. 类会默认继承Object类,即使你不写也会自动继承这个类,包括string,int,list,dict以及自定义类都会继承Object类。那type类不应该也是一个类的对象吗?type类实例化了python内部许多对象(也是类),从而实现python中万物皆是对象的理念。在python中一切皆对象,这意味着str,int,float,list,dict,函数甚至连类都是可以是一个对象。然后接着看,int是一个类的同时它也是一个对象,这才符合万物皆对象嘛!...

weixin_60446605的博客 1785

COMSOL仿真避坑指南:列管反应器模拟中多孔介质与化学反应设置的5个常见错误

本文详细解析了COMSOL仿真中列管反应器模拟的5个常见错误,包括多孔介质模型选择、化学反应接口配置、对流扩散方程处理、薄层热阻设置及网格独立性验证。特别针对多孔介质与化学反应设置的误区,提供了实用的判断标准和修正方法,帮助工程师避免计算偏差,提升仿真精度。

weixin_29597551的博客 321

VSCode关联VIVADO编辑Verilog

有时候接手别人的代码,或者从网上找的开源代码,每个人风格不一致,对齐缩进也不一样,阅读起来很累。有没有什么方法能快捷地格式化代码呢。下面我们利用VSCode插件来实现这个需求。Vivado是Xilinx公司提供的逻辑开发平台(之一),如果不喜欢Vivado自带的文本编辑器,可以选择第三方的文本编辑器VSCode。

小王在努力...的博客 7150

第一章:Python中的一切皆对象

这意味着所有数据类型,包括数字、字符串、列表、元组、字典,甚至函数和类,都是对象。通过理解这些基本概念,我们可以更好地掌握 Python 的数据结构和内存管理,编写出更加高效和优雅的代码。在接下来的章节中,我们将深入探讨更多高级特性和应用场景,继续提升我们的 Python 编程技能。这种设计使得 Python 中的元编程成为可能,即我们可以编写操作类和对象本身的代码,从而实现高度的动态性和自适应性。这一特性使得 Python 的函数和类可以像数据一样传递、存储和操作,增强了语言的表达能力和灵活性。

深度学习客 1477

RabbitMq安装

本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案

sinat_25821779的博客 323

Python源码解读之二 万物皆对象(下)

初探PyObject 首先我们再次来回顾一下,在上一篇提到过,“类”和“对象”这两个概念在Python中都是用对象实现的。“类"是一种对象,称为"类型对象”,“类"实例化得到的也是"对象”,称为"实例对象"。 实现对象机制的基石–PyObject Python中的任何对象在C中都对应一个结构体实例,在Python中创建一个对象,等价于在C中创建一个结构体实例。所以Python中的对象本质上就是C中malloc函数为结构体实例在堆区申请的一块内存。 /* Nothing is actually declare

java_0429的博客 440

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

第十五章数据管理成熟度评估【6’】(DAMA-CDGA 2022年以后历年模拟题真题汇总,基本包含所有考点。)

JasonH2021的博客 403

深度学习工具包 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整体结构源码目录Python对象Python内对象类型对象对象的创建类型的类型Python中的整数对象小整形对象大整数对象 准备工作 Python整体结构 python架构主要分为三部分 python文件 python解释器 scanner词法分析,将代码且分为一个个token parser词法分析建立AST compiler根据AST生成python字节码 code Evaluator(虚拟机)执行这些字节码 运行时环境 内建对象:list dict 内存分配器:和

qq_36581961的博客 3625

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python源码学习笔记:Python对象的底层实现

在“Python源码学习笔记:Python万物皆对象”中,我们对Python的对象类型体系有了一定的认识,这篇博客将从源码层面来介绍Python中万物皆对象的底层实现。

xiaoli_Jenny的博客 991

老版QQ原生表情gif动态

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

backtrader源码解读 - 01 - 读懂源代码的钥匙——认识元类

将example 3.2中动态创建类和类创建对象的两行代码放在一起进行比较,我们可以发现“上一级”创建“下一级”的方式非常类似:type创建类就好比类创建对象。type创建类Dog2:type后面加括号,括号里传入参数类Dog2创建对象d2:Dog2后面加括号,括号里传入参数请记住,在Python中,万物皆对象。只要是对象,那么它一定是由某个类所创建。我们可以通过对象的__class__属性来查看它是由什么类所创建,见example 4.1。a = 1pass我们再次重申:在Python中,

weixin_33430916的博客 1380

深度解读Python深拷贝与浅拷贝问题_结合程序分析python列表浅拷贝与深拷贝(1)

① 2000多本Python电子书(主流和经典的书籍应该都有了)② Python标准库资料(最全中文版)③ 项目源码(四五十个有趣且经典的练手项目及源码)④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)⑤ Python学习路线图(告别不入流的学习)数据拷贝会涉及到Python中这3个概念,先来看看这几个概念,只有明白了他们才能更好的理解深拷贝与浅拷贝到底是怎么一回事。在Python中,对对象有一种很通俗的说法,万物皆对象。

m0_61408947的博客 854

小白必看:中文万物识别模型一键启动保姆级教程

本文介绍了如何在星图GPU平台上自动化部署‘万物识别-中文-通用领域’镜像,快速实现中文场景下的图片物体识别功能。用户无需配置环境,上传办公桌、绿植等日常照片即可3秒内获得带位置框和置信度的纯中文识别结果,典型应用于宿舍物品监控、智能盘点等轻量级视觉任务。

weixin_34725745的博客 393

python2中unicode对象与字节流对象的编码问题

在网上看了三天的python2的编码问题,从最初的晕晕乎乎到后来的彻底晕倒又到后来的明了,如果这篇文章有幸被你读到了,希望没能误导你

长颈鹿的专栏 1170

Python学习总结(1)——Python知识清单(基础知识&数据科学)

一、基础知识 深度解读Python深拷贝与浅拷贝问题 用Python帮助你抢红包 用 Python 描述 Cookie 和 Session 用Python开发贪吃蛇小游戏 用Python生成抖音字符视频! 用Python开发计时器程序 新一代云原生监控系统 Prometheus实践 为你的Python程序加密 asyncio:Python异步编程模块 基于 redis 的分布式...

科技D人生 9224

2020 年 Python 知识清单(基础知识)

整理了一份Python开发技术学习清单,主要来自2020年1月1日前Python中文社区往期文章,本期收录的是基础知识相关的知识点。深度解读Python深拷贝与浅拷贝问题用Python帮...

Python中文社区 710

python涉及到数学吗_当Python遇上中国古典数学!这就很尴尬!

“科学艺术本相通,科技人文可相融”。人工智能的实现却离不开各种算法,而说到算法,虽然人们各种各样的需求在增加,算法的发展迅速,但万物万变不离其宗。算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。很早以前我们的祖宗就开始研究算法了。这里不得不就提到我国古代第一部数学专著《九章算术》,是《算经十书》中最重要的一部,内容十分丰富,据初步考证,...

weixin_39978863的博客 422

万物识别-中文镜像实操手册:/root/UniRec代码结构与general_recognition.py解析

本文介绍了如何在星图GPU平台上自动化部署万物识别-中文-通用领域镜像,实现开箱即用的图像识别功能。用户无需配置环境或下载模型,即可快速启动Gradio界面,对日常物品、植物、工业零件等常见物体进行中文标签识别,适用于电商商品打标、教育辅助识别及工业初筛等典型场景。

weixin_28999139的博客 394

依赖包版本冲突解决方案:pip freeze输出解读

在AI模型快速迭代的今天,一个看似简单的图像识别任务也可能因为环境配置问题卡住数小时。最近,团队在部署阿里开源的万物识别-中文-通用领域模型时,就遇到了典型的“依赖包版本冲突”问题——明明代码逻辑无误、模型权重加载正常,却在调用时报错。这个报错背后,正是Python生态中常见的“依赖地狱”(Dependency Hell):不同库对同一底层依赖(如Pillow、torchvision)要求的版本不一致,导致运行时行为异常。而解决这类问题的第一步,就是读懂的输出,并从中定位冲突源头。本文将结合该实际项目场景,

weixin_42437253的博客 1099
上一篇: Python源码解读之零 Python源码整体架构
下一篇: Python源码解读之二 万物皆对象(下)
jilingwei_123
博客等级 码龄11年 6粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值