笔记来源书籍:《深度学习入门:基于+Python+的理论与实现》
对于深度学习的学习,最好的办法就是亲自实现。从零开始编写可实际运行的程序,一边看源代码,一边思考。个人认为对于编程语言的相关学习其实都离不开亲自实现,只有亲自实现才能让印象深刻,有自己的理解。在光看数学式和理论说明无法理解的情况下,可以尝试阅读源代码并运行,很多时候思路都会变得清晰起来。对数学式感到困惑时,就阅读源代码来理解技术的流程,这样的事情相信很多人都经历过。
在自己亲自实现中,会进行各种实践,你可能会因为某些问题卡住,这种费时的工作对深刻理解技术而言是宝贵的财富。
使用python环境为3.x版本,在外部库方面,除了NumPy库和Matplotlib 库之外,极力避免使用其它外部库。安装成功后可在终端中使用python --version
查看python版本,使用命令python
进入python环境,此时可以在终端运行python代码。
NumPy是用于数值计算的库,提供了很多高级的数学算法和便利的数组(矩阵)操作方法。
Matplotlib是用来画图的库。使用Matplotlib能将实验结果可视化,并在视觉上确认深度学习运行期间的数据。
除了简单的加减乘除外,**代表乘方,例如3**2代表3的二次方。在python版本中7/5所得为小数,不为整数1。
数据类型可用type()函数查看,例如type(10),结果为int类型,输出为
在python中,变量声明不用定义类型。Python是属于“动态类型语言”的编程语言,所谓动态,是指变量的类型是根据情况自动决定的。例如
x = 10 #变量赋值
print(x)
其中#为注释。
即数组,定义和使用方式为
a = [1, 2, 3, 4, 5]#生成列表,不用声明类型和大小
print(a)#输出列表内容
len(a)#获取列表长度
#访问第一个元素的值,终端可直接输出如果使用pycharm,需要使用print函数进行输出
a[0]
Python的列表提供了切片 (slicing)这一便捷的标记法。使用切片不仅可以访问某个值,还可以访问列表的子列表(部分列表)。
a[0:2]#获取索引值为0到1(不包括2)的元素
a[1:] # 获取从索引为1的元素到最后一个元素
a[:3] # 获取从第一个元素到索引为2(不包括3)的元素
a[:-1] # 获取从第一个元素到倒数第二个元素(不包括最后一个元素)
与列表对应的还有元组,定义方式为a_tuple = (1,23,4,3,33,6,7,89),可以发现用的是括号,同时元组方法较少。
列表根据索引储存值,字典以键值对的形式储存参数。类似《新华字典》,将单词和含义对应起来,如下面例子
me = {'height':180} # 生成字典
print(me['height']) #访问元素,输出结果为180
me['weight'] = 70 # 添加新元素
print(me)#输出结果为{'height': 180, 'weight': 70}
Python中有bool型。bool型取True或False中的一个值。针对bool型的运算符包括and、or和not。
hungry = True
print(type(hungry))#输出
print(not hungry)#输出False
print(hungry and sleepy)#输出false
hungry = True
if hungry:
print("I'm hungry")
注意python中,以缩进作为作用域,例如上面的if语句,下面的print语句缩进4个字符,即一个tab键,代表前面if条件成立时,此处代码将被执行。
循环处理
for i in [1, 2, 3]:#按顺序访问列表中的元素
print(i)
使用def关键字定义函数
def hello():
print("Hello World!")
hello()#调用函数,输出Hello World!
函数带参数
def hello(object):
print("Hello " + object + "!")
hello("cat")#输出Hello cat!
python中可以使用加号拼接字符串
关闭Python解释器时,Linux或Mac OS X的情况下输入Ctrl-D
(按住 Ctrl,再按D键);Windows的情况下输入Ctrl-Z
,然后按Enter键。
一般我们都会在特定编译器运行python代码,这里讲下终端运行python文件,两步进行
python python文件
运行python程序定义类创建属于自己的数据类型,使用class
关键字。定义类要遵循下面模板
class 类名:
def __init__(self, 参数, …): # 构造函数
...
def 方法名1(self, 参数, …): # 方法1
...
def 方法名2(self, 参数, …): # 方法2
...
这里有一个特殊的__ init __方法,这是进行初始化的方法,也称为构造函数(constructor),只在生成类的实例时被调用一次。此外,在方法的第一 个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点.举个例子
class Calculator:
def __init__(self,num1,num2):
self.num1=num1
self.num2=num2
self.add();
def add(self):
c = self.num1 + self.num2
print(c)
def devide(self,x,y):
c = x/y
print(c)
calcul=Calculator(1,2)#获取类实例,这里会输出3,因为实例化时__init__方法会调用
calcul.devide(4,2)#输出2.0
类Calculator的构造函数(初始化方法)会接收参数num1,num2,然后用这个参数初始化实例变量self.num1和self.num2。实例变量是存储在各个实例中的变量。Python的类中可以像self.num1这样,通过在self后面添加属性名来生成或访问实例变量.
python中使用import导入库,
import numpy as np
上面语句直译为“将numpy作为np导入”,后续numpy的方法可以通过np来调用。
使用np.array()方法,接受python的列表作为参数,生成NumPy数组。一维数组在数学上也称为向量。
>>> x = np.array([1.0, 2.0, 3.0])
>>> print(x)
[ 1. 2. 3.]
>>> type(x)
可以使用NumPy数组进行算术运算。
>>> x = np.array([1.0, 2.0, 3.0])
>>> y = np.array([2.0, 4.0, 6.0])
>>> x + y # 对应元素的加法
array([ 3., 6., 9.])
>>> x - y
array([ -1., -2., -3.])
>>> x * y # element-wise product,对应元素运算
array([ 2., 8., 18.])
注意:如果元素个数不同,程序就会报错,所以元素个数保持一致非常重要(维度可以不同,具体看后面的广播功能)。
NumPy也可对单一数值进行运算
>>> x = np.array([1.0, 2.0, 3.0])
>>> x / 2.0
array([ 0.5, 1. , 1.5])
这个功能称为广播。
多维数组(也称矩阵)生成
>>> A = np.array([[1, 2], [3, 4]])
>>> print(A)
[[1 2]
[3 4]]
>>> A.shape
(2, 2)
>>> A.dtype
dtype('int64')
shape方法返回数组形状,dtype方法返回类型。矩阵的运算方法与一维数组相同。
注意:数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统称为张量(tensor)。
NumPy中,形状不同的数组也可进行运算,这个功能称为广播。
上面例子中我们已经知道数组能与标量2.0进行计算,此时标量2.0被扩展为1*3的数组,此外,还可以不同维度的数组进行运算,例如下图
元素索引从0开始,访问方法如下
>>> X = np.array([[51, 55], [14, 19], [0, 4]])
>>> print(X)
[[51 55]
[14 19]
[ 0 4]]
>>> X[0] # 第0行
array([51, 55])
>>> X[0][1] # (0,1)的元素
55
for语句访问各个元素
>>> for row in X:
... print(row)
...
[51 55]
[14 19]
[0 4]
NumPy还可以使用数组访问各个元素
>>> X = X.flatten() # 将X转换为一维数组
>>> print(X)
[51 55 14 19 0 4]
>>> X[np.array([0, 2, 4])] # 获取索引为0、2、4的元素
array([51, 14, 0])
运用这个标记法可以获取满足条件的数组元素。
>>> X > 15
array([ True, True, False, True, False, False], dtype=bool)
>>> X[X>15]
array([51, 55, 19])
对NumPy数组使用不等号运算符等(上例中是X > 15),结果会得到一个 布尔型的数组。上例中就是使用这个布尔型数组取出了数组的各个元素(取出True对应的元素)。
Python等动态类型语言一般比C和C++等静态类型语言(编译型语言) 运算速度慢。实际上,如果是运算量大的处理对象,用 C/C++写程 序更好。为此,当 Python中追求性能时,人们会用 C/C++来实现 处理的内容。Python则承担“中间人”的角色,负责调用那些用 C/ C++写的程序。NumPy中,主要的处理也都是通过C或C++实现的。 因此,我们可以在不损失性能的情况下,使用 Python便利的语法
Matplotlib 是用于绘制图形的库,使用Matplotlib可以轻松地绘制图形和实现数据的可视化。
用matplotlib的pyplot模块绘制图形。在绘制图形之前需要导入两个包
import numpy as np
import matplotlib.pyplot as plt
用下面代码绘制和展示sin图形
#生成数据
x = np.arange(0,6,0.1)#以0.1为单位,生成0到6的数据
y = np.sin(x)
#绘制图形
plt.plot(x,y)
plt.show()
输出结果为
我们在上面例子的图形上追加cos图形,并添加标题和给x轴标签名等。
#生成数据
x = np.arange(0,6,0.1)#以0.1为单位,生成0到6的数据
y1 = np.sin(x)
y2 = np.cos(x)
#绘制图形
plt.plot(x,y1,label="sin")
plt.plot(x,y2,linestyle="--",label="cos")#用虚线绘制
plt.xlabel("x")#x轴标签
plt.ylabel("y")#y轴标签
plt.title('sin & cos')#标题
plt.legend()#显示label内容
plt.show()
输出图形为
pyplot 中还提供了用于显示图像的方法 imshow()
。另外,可以使用 matplotlib.image模块的imread()
方法读入图像。
导入包
import matplotlib.pyplot as plt
from matplotlib.image import imread
读入图像
img = imread('lena.png') # 读入图像(设定合适的路径!)
plt.imshow(img)
plt.show()
输出如图
how()`。另外,可以使用 matplotlib.image模块的`imread()`方法读入图像。导入包
import matplotlib.pyplot as plt
from matplotlib.image import imread
读入图像
img = imread('lena.png') # 读入图像(设定合适的路径!)
plt.imshow(img)
plt.show()
输出如图