0%

【SE】MindSpore开源创新实践课程笔记

毕业实习中 关于华为 昇腾MindSpore开源创新实践课程内容部分学习笔记

Python编程基础

Python基础

工具包的导入

1
2
3
4
5
6
7
8
9
10
# 导入整个模块
import os
os.getcwd()

# 导入模块中的指定函数
from os import getcwd()
getcwd()

# 名字较为复杂,用as取别名
import matplotlib.pyplot as plt

变量范围

1
2
3
4
5
6
a = 1 # 全局变量
def func():
b = 3 # 函数内部,局部变量
c = 2
print(a+c) # √
print(b+c) # ×

数据结构

数值和字符串

python3支持int、float、bool、complex(复数)几种类型的数值

1
2
3
4
a = 5
b = 2
print(a/b) #2.5
print(a**b) #平方,25

python中没有字符,单个字符被认作长度为1的字符串;

1
2
3
4
5
s1 = "python"
s2 = 'python' # 单引号和双引号完全一样,没有区别
s3 = '''
python
''' # 三引号字符串 可以是多行字符串

原始字符串,在字符串前面加入字母r,屏蔽掉字符串中的所有转义字符

1
s = r"p\y\tho\n" # print: p\y\tho\n

字符串有序不可变

1
2
3
s = "python"
print(s[0])
s[0]="a" # 报错,不可修改

字符串的运算

1
2
3
4
5
6
a = "hello"
b = "world"
c = 2
print(a+b) # helloworld
print(a*2) # hellohello

字符串常用的操作,包括切割、大小写替换、拼接等,这些操作没有修改原来的字符串,而是生成了新的字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
s = "python"
# 切割,str.split(str1): 以str1 为分隔符 对字符串进行分割
s.split('h') # ['pyt','on']

# 替换,str.replace(str1, str2): 将字符串中的str1 替换为 str2生成新的字符串
s.replace('py','PY')

# 大小写替换
# str.lower(): 字符串中的大写转小写
# str.upper(): 字符串中的小写转大写
s = "PYthon"
s.lower() # python
s.upper() # PYTHON

# 拼接
# str.join(iter):将所给参数中的每个元素以指定字符连接成一个新字符串
"-".join("python") # p-y-t-h-o-n

格式化输出

1
"my name is %s,age is %d" %('AI',63)

列表和元组

列表:有序,其中元素可以是任意数据类型,可随时添加或删除元素

List[obj1,obj2,… ]

1
2
3
L=[1,2,3] #创建列表
L[1] # 访问元素
L[1] = 0 # 修改元素

列表中的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
animals = ['cat','dog','monkey']
animals.append('fish') # 追加元素
animals.remove('fish') # 删除指定数据;
# 若有多个fish,只会删除第一个fish

anmials.insert(1,'fish') # 在下标1的地方插入fish
animals.pop(1) # 删除下标为1 的元素,返回值为删除的这个元素

# 遍历元素 并获取对应索引
for i in enumerate(animals):
print(i)

# list.sort(cmp=None,key=None,reverse=False)
# cmp为可选参数,若指定该参数,会使用该参数的方法进行排序
# key是用来比较的元素
# reverse为排序规则,False默认升序

切片和索引

1
2
3
4
5
6
7
8
l=[1,2,3,[4,5]]
l[3][0]# 索引访问从0~n-1,所有有序序列都能使用

# 切片,list[start:end:step]
# start为0,end为n-1,step为1时 可省略
l=[0,1,2,3,4]
l[::] # 0,1,2,3,4
l[1,4,2] # 1,3

元组:不可变 的有序序列,元素可以是任意对象,小括号包裹元素

1
2
3
4
t = (1,[1,2],'python')
# 创建单个元组
t1=(5) # t1<class,'int'>
t2=(5,) # 创建单个元组需要用逗号来表明是元素 t2<class,'tuple'>

字典和集合

字典的每个元素由两部分组成:键+值;(key,vale)

键:不可变且唯一;如果字典有相同的键,则后面的键对应的值会将前面的值覆盖,数据量大时,字典数据 的访问速度比列表快

字典的三种赋值操作

1
2
3
x = {'food':'Spam','quantity':4,'color':'pink'}
x2 = dict(food='Spam',quantity=4,color='pink')
x3 = dict([('food','Spam'),('quantity',4),('color','pink')])

获取字典数据

1
2
3
4
5
6
7
8
9
10
print(x['food']) # 若访问不存在的键,会报错
print(x.get('food'))
print(x.get('x')) # None
# 使用get获取数据 ,若键不存在会返回指定的str
print(x.get('x'),'x不存在') # x不存在

# 查看所有键
print(x.keys())
print(x.values())
print(x.items()) # 键值对

插入和修改

1
2
x['x']='x'
x['x']=0

集合中的元素唯一,花括号包裹元素,可以被修改,无序

1
2
3
4
sample_set={'Prince','Techs'}
print('Data',in sample_set) # False: in检查集合中是否某一元素
sample_set.add('Data')
sample_set.remove('Data')

列表去重

1
2
3
list1=[1,1,2,3]
print(list(set(list1))) # 1,2,3
sample_set = frozenset(sample_set) # 不可变集合

运算符和数据拷贝

浅拷贝:对数据的表面结构进行拷贝,如果数据是嵌套的结构,则嵌套结构里的元素是对之前数据的引用。修改之前的数据会影响拷贝得到的数据

深拷贝:解决了嵌套结构中深层结构只是引用的问题;对所有数据进行一次复制,修改之前的数据则不会改变拷贝得到的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
a=[1,2,3,[4,5]]
b=a # 赋值
c=a.copy() # 浅拷贝

import copy
d = copy.deepcopy(a) # 深拷贝

a[0]=6 # 修改a的值
'''
然后打印abcd
a=[6,2,3,[4,5]]
b=[6,2,3,[4,5]]
c=[1,2,3,[4,5]]
d=[1,2,3,[4,5]]
'''
a[3][0]=7 # 修改嵌套列表的值
'''
然后打印abcd:
a=[6,2,3,[7,5]]
b=[6,2,3,[7,5]]
c=[1,2,3,[7,5]]
d=[1,2,3,[4,5]]
'''

控制流

if-elif-else的形式;判断条件中的0,None,空值等默认为False,其余为True

1
2
3
4
5
6
7
8
a = input("score:")
a = float(a)
if 100>=a>=60
...
elif 0<=a<60:
...
else:
...

Python中的for语句可以接受 可迭代对象作为参数,每次迭代一个

1
2
3
4
for i in [1,2,3]
print("循环第%d次"%(i))
else# 在循环正常结束后执行
print("循环结束")

Python中没有do-while,while循环也可以添加else

函数和对象

自定义函数def

自定义函数,打印不同方式传入的参数

  • 必备参数:必备参数须以正确的顺序传入函数,调用时的数量必须和声明时一样
  • 关键字参数:函数调用时使用等号赋值的形式传入参数
  • 默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值
  • 不定长参数:有时可能需要一个函数能处理比当初声明更多的参数,这些不定长参数声明时不会命名。args,kwargs:加了型号的变量args会存放所有未命名的变量参数,args为元组,而加\ 的变量kwargs会存放命名参数,形如key=value的参数,kwargs为字典
1
2
3
4
5
6
7
8
9
10
11
12
def func(a=1, b=2, *args):
print(a+b)
print(args)

# 必备参数
func(0,4)

# 关键字参数
func(b=4,a=0)

# 不定长参数
func(1,2,3,4,5)

匿名函数

lambda创建匿名函数,相比普通函数而言,匿名函数只是一个表达式,函数体比def简单很多,

1
2
a = lambda x,y:x+y # lambda 参数:表达式
a(1,2) # 调用函数

面向对象

Python中创建类使用关键字class,并且具有封装、继承、多态的特点

  • 封装:把方法、数学、事件集中到一个统一的类中,对使用者屏蔽其中的细节
  • 继承:在现有类的基础上,进行扩展生成新的子类
  • 多态:一个同样的函数对于不同的对象可以有不同的实现
1
2
3
4
5
6
7
8
9
10
class Person(object): # py3中 所有类默认继承object
def _init_(self,age,name): #self:指实例化的对象
#_init_ 对象初始化时调用的方法
self._age=age #类属性
self.name=name
def func(self):
print("xxx")

p1=Person(age="18",name="zyl")
p1.func()

Python是一门动态语言

1
2
3
4
5
6
7
p1.ID=9191
print(p1.ID) # 9191,ID这个属性是添加到这个对象的,而不是类的
print(Person.ID) # 报错

# 继承
class Man(Person): # 继承Person类
pass

默认情况下,属性在Python中都是public,类所在模块和导入了类所在模块的其他模块都可以访问到。

如果类中的某些属性不想被外界访问或者继承,可以对其私有化:

  • 在属性或方法前加上一个下划线,可以防止模块的属性用 “from mymodule import” 来加载,它只可以在本模块中使用
  • 在方法或属性前加 双下划线,可以实现完全私有化

IO操作和异常捕获

文件读写

Python中内置了读写文件的函数,open,返回文件对象

open(filename,mode,encoding)

——filename:包含要访问的文件名称的字符串值

——mode:决定了打开文件的模式(r:只读,w:写入,a:追加,b:二进制的形式操作)

——encoding:打开文件的编码格式,默认utf8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
f=open("text.txt",'w') # 若文件不存在会新建一个
Str=input("Please input...")
f.write(Str)
f.close()

f.open("text.txt",'r')
print(f.read(6)) # 读取6个字符,当前光标后移6个字符
print(f.read()) # 读取光标所在位置至最后
f.close()

# 使用(上下文管理器)with语句进行文件写入,不需要close语句
with open("text.txt",'w') as f:
f.write("python文件操作")
with open("text1.txt",'r') as f:
print(f.read())

异常捕获

——编码错误

——异常:运行时出错

1
2
3
4
try:
print(1/0)
except Exception as e:
print(e) #捕获

常用工具库

  • 标准库:安装Python后可以直接使用,例如os,sys,time等模块
  • 第三方库:需要安装后才可以使用的库,如numpy(用于科学计算),pandas(用于数据处理),scikit-learn(机器学习库)

sys模块

负责程序与Python解释器的交互,提供了一系列的函数和变量,用于操控Python运行时的环境

1
2
3
4
5
6
7
8
# sys.exit([n]):此方法可以使当前程序退出,n=0表示正常退出,其他值表示异常退出
import sys
for i in range(100):
if i==5:
sys.exit(0) # 执行到这里时,当前程序就停止了,后面的代码不会执行

sys.path # 捕获模块搜索路径
sys.platform # 获取当前系统平台

os模块的使用

负责程序和os的交互,提供了访问os底层的接口

1
2
3
4
import os
os.getpid() # 获取当前进程id
os.getcwd() # 获取当前所在路径
os.chdir("C:\\") # 更改当前工作目录

MindSpore框架简介

机器学习概览

简介

利用历史数据训练得到模型,再利用这个模型去处理新的数据,预测未来属性

基于规则的方法:使用显性编程解决问题,规则可以被人工明确

机器学习:使用样本训练,决策的规则复杂或者难以描述,由机器自动学习规则

使用机器学习的情况

  • 问题解决方案复杂,或者问题可能涉及到大量数据却没有明确的数据分布函数
  • 规则十分复杂 或者无法描述:人脸识别、语音识别
  • 任务的规则会随时间改变:生产线上的瑕疵检测
  • 数据分布本身随时间变化,需要程序不停的重新适应:预测 商品销售的趋势

机器学习解决的主要问题

  • 分类

    程序需要指定输入属于k类中的哪一类。学习算法通常会输出一个函数,$f:R^n\rightarrow (1,2,\dots,k)$ ,比如cv中的图像分类算法解决的就是一个分类任务

  • 回归

    程序会对给定输入 预测输出数值,学习算法通常会输出一个函数$f:R^n\rightarrow R$,比如预测投保人的索赔金额,预测证券未来的价格

  • 聚类

    对大量未知标注的数据集,按数据内在相似性,将数据划分为多个类别,类别内的数据相似度较大,类别间的相似性较小,比如图片检索,用户画像

分类和回归是预测问题的两种主要类型,分类的输出是离散的类别值,而回归的输出是连续数值

机器学习分类

监督学习

  • 利用已知类别的样本,训练学习得到一个最优模型,使其达到所要求性能
  • 再利用这个训练所得模型,将所有的出入映射为相应的输出,对输出进行简单的判断,从而实现分类的目的,即:对未知数据进行分类
  • 解决回归问题,回归——拟合出一个趋势
  • 解决分类问题

无监督学习

  • 对没有标记的样本,学习算法直接对输入数据集进行建模,例如聚类。把相似度高的东西放在一起,对于新来的样本,计算相似度后,按相似程度进行归类
  • 用户画像
  • 聚类:k-means

半监督学习

  • 试图让学习器自动地对大量未标记数据进行利用以辅助少量有标记数据进行学习
  • 分类:有标记的数据训练模型
  • 聚类
  • 回归

强化学习

  • 学习系统从环境到行为映射的学习,以使奖励信号(强化信号)函数值最大,强化学习不同于连接主义学习中的监督学习,主要表现在教师信号上,强化学习中由环境提供的强化信号 是对产生动作的好坏作一种评价(通常为标量信号),而不是告诉强化学习系统如何去产生正确的动作
  • 模型感知环境,做出行动,根据状态和奖惩做出调整和选择
  • 强化学习总是在寻找什么样的行动才是最佳的,比如,自动驾驶汽车遇到黄灯开始闪了,是刹车还是加速通过;对于吸尘机器人,是继续吸尘还是回去充电

机器学习算法总体流程

数据收集 ——数据清洗——特征提取与选择——模型训练——

数据集:机器学习任务中使用的一组数据,每个数据称为一个样本,反映样本在某方面的表现或性质的事项或属性称为特征。

训练集:训练过程中使用的数据集。从数据中学得模型的过程称为学习(训练)

测试集:学得模型后,对其进行预测,使用的数据集。

训练集和测试集不可以有交集

数据预处理

数据清理:填充缺失值,发现并清除造成数据集异常点

数据降维:简化数据属性,避免维度爆炸

数据标准化:减少噪声,提高模型准确性

脏数据

不完整:数据中缺少属性 或 包含一些确实的值

多噪音:包含错误的记录或异常点

不一致:存在矛盾的、有差异的记录

过拟合的原因——误差

  • 最终预测的总误差 = 偏差² + 方差 + 不可消解的误差

  • 方差(Variance)

    模型的预测结果 在均值附近 的偏移的幅度

    来源于莫小在训练集上对小波动的敏感性的误差

  • 偏差(Bias)

    模型的预期(或平均)预测值与试图预测的正确值之间的差异

随着模型复杂度上升,训练误差逐渐减小;同时测试误差会随着复杂度的增大而减小都某一点,继而反向增大,凸曲线

机器学习的性能评估——回归

  • MAE(Mean Absolute Error)平均绝对误差,越趋于0,表示模型越拟合训练数据($y_i$真实值,$\hat{y}_{i}$ 预测值)

  • MSE(Mean Square Error)

  • $R^2$ 取值范围(负无穷,1 ],值越大,表示模型越拟合训练数据,TSS表示样本之间的差异情况,RSS表示预测值与样本值之间的差异情况

机器学习的重要方法

梯度下降法

  • 批量梯度下降法(BGD)

    使用所有数据集中的样本(共m个)在当前点的梯度之和来对权重参数进行更新

  • 随机梯度下降法(SGD)

    随机选取一个数据集中的样本在当前的梯度来对权重参数进行更新操作

  • 小批量梯度下降法(MBGD)

    结合BGD和SGD,每次选择数据集中n个样本的梯度来对权重参数进行更新

超参数

参数:模型自动学习

超参数:人工手动设定

模型从超参数 常用于估计模型参数的过程中

通常根据给定的预测建模问题而调整

常见的模型超参数

Lasso、Ridge回归中的λ

训练神经网络的学习速率,迭代次数、批次大小、激活函数、神经元数量

支持向量机的C和σ超参数

KNN中的K

超参数搜索的一般过程

将数据集

网格搜索

随机搜索

交叉验证

机器学习的常见算法

案例

深度学习概览