本书特点:
本书就是教你如何创建深度学习模型的一本书。并且,本书不使用任何现有的深度学习框架(Pytorch、Tensorflow),尽可能仅使用最基本的数学知识和Python库(Numpy、Matplotlib),从零讲解深度学习核心问题的数学原理,从零创建一个经典的深度学习网络。
文末有领取方式
总之你可以通过这本书对深度学习有一个初步认识,并且也能通过基本的Python库实现一些神经网络等等。
1.Python基础知识 1.1 Python安装Python的安装已经在我们上期介绍完毕,可以查阅上期资料。
1.2 Python基本语法1.2.1 type()函数
Python中的type()函数可以用来查看数据类型。
type(10)type(2.718) type("hello")
Python3 的六个标准数据类型中:
不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。
其中数字类型又分为:int(整型)、long(长整型)和float(浮点型),但是在Python3中就不再有long类型了。
1.2.2 变量可以使用x或y等字母定义变量(variable)。此外,可以使用变量进行计算,也可以对变量赋值。
x = 10 # 初始化 print(x) # 输出x 10 x = 100 # 赋值 print(x) 100 y = 3.14 x * y 314.0 type(x * y)1.2.3 列表
列表是Python中内置有序、可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开。在Python中,一个列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、元组、字典、集合以及其他自定义类型的对象。
a = [1, 2, 3, 4, 5] # 生成列表 print(a) # 输出列表的内容 [1, 2, 3, 4, 5] len(a) # 获取列表的长度 5
索引:
序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。元素的访问是通过a[0]这样的方式进行的。[]中的数字称为索引(下标),索引从0开始(索引0对应第一个元素)。
a[0] # 访问第一个元素的值 1 a[4] 5 a[4] = 99 # 赋值 print(a) [1, 2, 3, 4, 99]
切片:
Python的列表提供了切片(slicing)这一便捷的标记法。使用切片不仅可以访问某个值,还可以访问列表的子列表(部分列表)
print(a) [1, 2, 3, 4, 99] a[0:2] # 获取索引为0到2(不包括2!)的元素 [1, 2] a[1:] # 获取从索引为1的元素到最后一个元素 [2, 3, 4, 99] a[:3] # 获取从第一个元素到索引为3(不包括3!)的元素 [1, 2, 3] a[:-1] # 获取从第一个元素到最后一个元素的前一个元素之间的元素 [1, 2, 3, 4] a[:-2] # 获取从第一个元素到最后一个元素的前二个元素之间的元素 [1, 2, 3]1.2.4 字典
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {} 中 ,格式如下所示:
dict = {key1 : value1, key2 : value2, key3 : value3 }
me = {'height':180} # 生成字典
me['height'] # 访问元素
180
me['weight'] = 70 # 添加新元素
print(me)
{'height': 180, 'weight': 70}
1.2.5 布尔型
Python中有bool型。bool型取True或False中的一个值。针对bool型的运算符包括and、or和not(针对数值的运算符有+、-、*、/等,根据不同的数据类型使用不同的运算符)。
hungry = True # 饿了 sleepy = False # 困了 type(hungry)1.2.6 if语句not hungry False hungry and sleepy # 饿并且困 False hungry or sleepy # 饿或者困 True
根据不同的条件选择不同的处理分支时可以使用if/else语句。
hungry = True
if hungry: #如果hungry为真,就执行下面的语句
print("I'm hungry")
I'm hungry
hungry = False
if hungry:
... print("I'm hungry") # 使用空白字符进行缩进
else: #如果hungry不为真,则执行下面语句
... print("I'm not hungry")
... print("I'm sleepy")
I'm not hungry
I'm sleepy
1.2.7 for语句注:Python使用空白字符表示缩进。一般而言,每缩进一次,使用4个空白字符。
进行循环处理时可以使用for语句。
>>> for i in [1, 2, 3]: ... print(i) ... 1 2 3
这是输出列表[1, 2, 3]中的元素的例子。使用for ...in ...:语句结构,可以按顺序访问列表等数据集合中的各个元素。
1.2.8 函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
如何浅显理解上面函数的相关定义呢?举个例子,苹果手机的生产是由一个个加工厂组装而来的,比如屏幕的生产,理解成屏幕函数;电池的生产,理解成电池函数等等。最后由苹果公司发起调用这些函数,函数们就会执行它们内部的函数语句(做自己该做的的事),这样就提高了生产效率,以及规范性。
下面就是一个简单的打招呼函数
def hello():
... print("Hello World!")
hello()
Hello World!
此外,函数也可以取参数。
def hello(object):
... print("Hello " + object + "!")
...
hello("cat")
Hello cat!
1.2.9 类
前面我们了解了int和str等数据类型(通过type()函数可以查看对象的类型)。这些数据类型是“内置”的数据类型,是Python中一开始就有的数据类型。现在,我们来定义新的类。如果用户自己定义类的话,就可以自己创建数据类型。此外,也可以定义原创的方法(类的函数)和属性。
当然为了更好理解,你可以从字面意思粗略认为类是把相似特征的事物抽象成一个类。比如说,圆是具有圆周率(pi)和半径(r)两个相似特征的属性。根据相似特征抽象出圆类,每个圆的半径可以不同,那么半径可以作为圆的实例属性;而每个圆的圆周率pi是相同的,那么圆周率pi就可以作为类属性,这样就定义出了一个圆类。
实例属性每个实例都各自拥有,相互独立;而类属性有且只有一份,是共有的属性。
Python中使用class关键字来定义类,类要遵循下述格式(模板)。
class 类名: def __init__(self, 参数, …): # 构造函数 ... def 方法名1(self, 参数, …): # 方法1 ... def 方法名2(self, 参数, …): # 方法2 ...
这里有一个特殊的__init__方法,这是进行初始化的方法,也称为构造函数(constructor),只在生成类的实例时被调用一次。此外,在方法的第一个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点。
下面我们通过一个简单的例子来创建一个类。
class Man:
def __init__(self, name):
self.name = name
print("Initialized!")
def hello(self):
print("Hello " + self.name + "!")
def goodbye(self):
print("Good-bye " + self.name + "!")
m = Man("David")
m.hello()
m.goodbye()
# 运行结果
Initialized!
Hello David!
Good-bye David!
这里我们定义了一个新类Man。上面的例子中,类Man生成了实例(对象)m。
类Man的构造函数(初始化方法)会接收参数name,然后用这个参数初始化实例变量self.name。实例变量是存储在各个实例中的变量。Python中可以像self.name这样,通过在self后面添加属性名来生成或访问实例变量。
1.5 小结
本章重点介绍了实现深度学习(神经网络)所需的编程知识,以为学习深度学习做好准备。从下一章开始,我们将通过使用Python实际运行代码,逐步了解深度学习。
本章只介绍了关于Python的最低限度的知识,想进一步了解Python的读者,可以参考下面这些图书。
关于Python推荐《Python语言及其应用》 一书。这是一本详细介绍从Python编程的基础到应用的实践性的入门书。
电子版已经整理打包好了 希望可以帮助到大家如果你想获取这本书的电子版
可以找我下图拿



