《深度学习应用开发》学习笔记汇总

举报
黄生 发表于 2022/07/10 22:11:01 2022/07/10
【摘要】 在2021年3月份开始学习《深度学习应用开发》,写了一些学习笔记,大概学到8月份就停止了。这里先把一些学习笔记汇总一下。之前好像有听人介绍说吴明辉的课程很不错,最近刚好在中国大学APP上看到他的一个人工智能相关的课程,看了一下确实很不错。课程名称叫做《深度学习应用开发 基于tensorflow的实践》。是一个入门级别的课程,不需要人工智能的基础,不需要太多的数学知识,也不需要什么编程经验。我...

在2021年3月份开始学习《深度学习应用开发》,写了一些学习笔记,大概学到8月份就停止了。这里先把一些学习笔记汇总一下


之前好像有听人介绍说吴明辉的课程很不错,最近刚好在中国大学APP上看到他的一个人工智能相关的课程,看了一下确实很不错。

课程名称叫做《深度学习应用开发 基于tensorflow的实践》。是一个入门级别的课程,不需要人工智能的基础,不需要太多的数学知识,也不需要什么编程经验。我觉得很友好呀,所以现在开始学习并记录一下

第一讲:导论

第二讲:环境搭建和Python快速入门

里面有说“环境复杂,我装Anaconda”,这个要我说,直接用modelarts,不需要装环境。

第三讲,tensorflow编程基础

第四讲,。。。如果能学那么远的话,再说吧。。。


导论里面说了人工智能用来下围棋打游戏,已经完全超越了人类,

但是那又怎么样呢?还能不能做点更有意义的事情?

探索宇宙,非常有意义吧!通过人工智能在天量的天文探测数据中挖掘到一个小版的**。

然后回到我们日常的社会生活之中,语音处理,比如语音输入,生活助理,拨打广告推销电话等等。图像处理。还有计算机写新闻稿,医疗等等,这些应用还是比较多的,看的有点累,就到这里吧!

不过呢,这里有必要提一下介绍一个很有趣的APP,叫做形色,我安装了之后试了一下,家里的几个植物,比如一帆风顺,满天星,银柳都识别成功了,很有趣的APP。

接下来看一下人工智能发展,有必要了解一下它的发展历史。人工智能这个名词源于1956年的一个夏季研讨会。到现在屈指算来已超过一个甲子。

这里说到了一个电影,叫做模仿游戏,有机会找来看看,是和图灵相关的

三次浪潮就是三个时代,三盘棋。分别是1962年的国际跳棋,1997年的国际象棋,以及2016年的围棋。从这个难易程度也可以看出,围棋是最强调系统性思维的,所以 AI想要战胜人类也是最难的。

第一讲到这里就结束了,第二讲看了一点,其中关于人工智能机器学习概念,除了公式的定义之外,用类比的方法讲的非常的简单易懂


有监督学习,无监督学习,半监督学习,强化学习。强化学习说的非常厉害,适用于下棋和游戏这一类领域,基本逻辑是正确就奖励,错误就惩罚来做一个学习。

那么无监督学习的典型应用模式是什么呢?说出来之后你就会觉得无监督学习没有那么神秘了,那就是聚类。一个比较典型的例子就是超市里货架商品摆放,比如啤酒和纸尿裤摆在一起,这个并不是之前打了标签学习到的。

有监督学习的一个典型应用模式,是线性回归,比如虫子叫声的频次和温度的关系。这个应用呢,基本上不能体现人工智能的高大上。因为这个规律,最终用一个一元一次方程就能表示。

还有一个应用模式,就是针对离散数据进行分类,这个感觉实用性更强,比如说工厂里生产的螺丝,对于长度和重量这两个分量进行一个二分类,那么当生产一个螺丝可以判断他到底是合格还是不合格


在1904年的时候,生物学家了解了神经元的结构

然后在1945年的时候发明了神经元模型。那么这个神经元的模型真的可以模拟生物的神经功能吗,个人觉得有点奇妙,不过动物植物本来都是很奇妙的存在。

所谓的全连接层,就是说某层的一个节点,和他上一层的所有节点都有连接。就像连接的边长不同,每条连接的权重也不一样,然后再加上一个偏置值。即便如此,得到的也只是一个线性的表达,为了不丢失表达,也只是用一个简单的加法。

人们发现神经元细胞只有兴奋达到一定的限度才会有所反应,并向后输出。这就好像你和一个小朋友好好说话,他却像没听到一样,而你揪着他的耳朵和他说的时候,他就能听进去,并在行动中能做到。于是根据这个又做了一个激活函数。

常见的激活函数,一个是s型,S的腰是0.5

还有一个修正线性单元激活函数简称为relu

这个计算很简单,就是0和输入值取最大,说它的效果非常好,这个从原理上想不太明白,为什么它的效果就好了?


什么是深度?深度就是简单的量变。神经网络到深度神经网络,就是每一层的节点搞多一点,层数也搞多一点。

但是如果说网络越深,节点越多,表现能力就越好,这个我看未必,过犹未及嘛

深度神经网络本身没再多讲,讲的是卷积神经网络就是CNN。这个是在60年代的时候,在研究猫的神经元时发现的,1998年采用卷积思想的神经网络lenet面世,但是没有火起来,原因是计算能力不够,都干不过其他的算法,怎么能火呢?是金子总会发光的,改善后的alexnet,在2012的比赛中获得突破,一鸣惊人,引起轰动。当然也是因为算力跟上了,这样可以在可接受的时间里可以完成任务。


还有一个是vggnet,他的问题是参数太大。

深度学习的问题:1面向任务单一,依赖于大规模有标签数据,几乎是个黑箱模型。

现在人工智能基本由深度学习代表了,但人工智能还有更多。。。

然后就开始讲深度学习的开发框架。先整了了Theano,开始于2007年的加拿大的蒙特利尔大学。随着tensorflow在google支持下的强势崛起,Theano日渐式微,连它的创始人都反水了。然后是caffe.2013年问世,主要适用于最初的计算机视觉。

Torch.他的一个非常显著的特点就是支持动态图模型,这一点与其它的开发平台不一样。2017年facebook搞了python版的torch,叫做pytorch.并且讲caffe2并入了pytorch.

然后亚马逊和微软也有自己的开发框架。

keras是一个非常高层的库,可以架设在某些开发框架之上。

微软的开发框架,那必然是支持c#. 那DL4J这一个是基于jvm的.,可以和大数据结合。

在然后是百度的开发框架。

最后介绍的当然就是最强框架tensorflow


从清华镜像下载python3的anaconda,然后安装anaconda,安装后,会用到他的prompt和jupyter notebook. 然后设置anaconda的源为清华镜像,安装tensorflow。可安装不带gpu的。教学够用了。这里版本是1.2. 安装好之后,做一个简单的验证,就是打开notebook,然后导入tf再打印版本号就可以了.

这里好像没有提到,要先安装python,所以我理解anaconda安装包里面已经包含了python环境

然后是第三讲python的基础,这一讲可以先跳过。

第四讲的开头插入了一个课程导学,说明tensorflow2.0在2019年已经推出了.虽然2.0和1.x,在本质上没有差别,但运行模式差异巨大,一个是eager execution动态图执行机制,一个是graph execution静态图执行机制,前者比较灵活,可以和python代码混写,后者比较死板,因为门槛高而被初学者所诟病。这个有点像敏捷和瀑布式的开发的区别。

原来的1.x课件会保留,因为有助于底层原理的理解,而2.0的课件也会更新。这样的处理非常好,与时俱进,很负责任。并且建议先看2.0的编程基础那一节。

使用modelarts,所以环境部署这一块就可以免掉了


接下来是第4讲:磨刀不误砍柴工:Tensorflow编程基础。

从tensorfow2.0那一节开始看起,环境呢就不用自己搭建了,直接用modelarts里的开发环境Notebook里的jupyterLab,免费使用只是每小时会停止一下,对于学习来说没有关系。

基本概念,tensorflow=tensor张量 + flow 流

张量具体是啥意思之前不是很明白,只知道张力的概念,比如在亚平老师的太空授课中,水膜加水后能变成水球,就是因为水的表面张力。

那这里的张量,是指一种数据结构,具体来说是多维数组(通过.numpy()来得到)。我的理解它的表现形式可以是,一个单独的数/标量,或一个一维数组/向量,一个二维数组/矩阵,或三维四维多维等等。形式上来统一化,可以叫做:0阶张量/标量/Scalar, 1阶张量/向量/vector, n阶张量/n维数组

流,表示张量数据流动/计算的过程。

每一个张量有一个唯一的类型,运算的类型不匹配会报错,比如int和float32运算就不行,这个是比较严格的,可以先通过tf.cast()做类型转换

常量定义的时候是可以按需求做类型自动转换、reshape的

但是变量的定义中,类型还是根据初值来定的,而设定的需求类型并没有生效:v2=tf.Variable([3,4],tf.float32)

tf里的变量和普通编程语言里的变量是有区别的,区别在于tf里的变量设计为学习中自动优化自动调整它的值,一般无需人工进行赋值,所以它的trainable参数默认是启用的,当然如果是要冻结这些值的时候,就不启用它了


tf2对tf1.x是间接兼容的,原来1.x的API整理到tensorflow.compat.v1包里去了。这样写:

import tensorflow.compat.v1 as tf
tf.disable_eager_execution() #禁用tf2默认的即时执行模式

然后在建立会话来实现计算图执行

sess=tf.Session()
sess.run(node1)

然后是第6讲,单变量线性回归

标签是我们要预测的真实事物y,特征是指用于描述数据的输入变量xi

样本指数据的特定实例x,有标签样本具有{特征,标签},用于训练模型;无标签样本具有{特征,?},用于对新数据做出预测

模型可将样本映射到预测标签,由模型的内部参数定义,内部参数通过学习得到

具体到这里,参数就是 y=wx+b里的w和b,也叫权重和偏差?

在监督式学习中,机器学习算法通过以下方式构建模型:检查多个样本并尝试找出可最大限度的减少损失的模型。这一过程称为经验风险最小化

损失函数有L1,L2。L1是绝对值,L2是均方误差MSE,那么2个场景做损失比较时会有L1一样,L2不一样的情况

本来是挺简单的东西,但是一概念化体系化了之后感觉就搞的复杂了不平易近人了


梯度下降法,梯度是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,也就是更陡峭的方向。下降就是要反方向,沿着比较更不陡峭的方向走,这样方向对了,才能快速的到达到底部收敛。

那么方向确定了,节奏怎么控制呢,步调太慢天都黑了还没下到山脚,小心会被吓死;步调太快步子大了容易扯着蛋,也没有必要。这里的用学习率/步长来描述这个节奏,如果梯度是2.5,学习率是0.01,那下一个尝试的点是距离前一个点2.5*0.01=0.0025的位置。(梯度是固定的,还是每走一步都会变的呢?)

个人认为好的学习率,不应该是一个固定值,而应该是先大后小。也就是先大步快速的到达底部附近,再小步寻找最底部。

学习率是学习开始之前就设置的,叫超参数,这个是和参数不同的,参数是学习过程中学到的。

这里x轴是权重值w,y轴是损失。应该说这是一个很简单的例子,因为参数只考虑了权重值,当参数有数不清的个数的时候,就要变的相当的复杂了。

另外这个图像说是凸型,实际这是一个向上的U的形状,应该叫凹才对吧,要说凸,那也只是往地上凸。


数据不是收集的,是自己生成的,好吧~一个简单的例子学习用的没关系

%matplotlib inline

这个是为了让在jupyter在浏览器里能够显示图像。

生成y=2x+1的随机数据,数据加背景噪声限值0.4

生成等差数列,100个

x_data=np.linspace(-1,1,100)
y_data=2*x_data+1.0+np.random.randn(*x_data.shape)*0.4

*号是把shape元组拆成一个个参数

之前设置了伪随机数种子 np.random.seed(5)

画散点图:plt.scatter(x_data,y_data)

画上帝视角已学习到的的线性函数直线:

plt.plot(x_data,2*x_data+1.0,color='red',linewidth=3)

今天先到这里了。另外发现jupyter里面可以TAB代码补全,可以有很多快捷键方便操作,以前是我孤陋寡闻井底之蛙了
image.png


先定义训练数据的占位符,定义了2个,

1个是特征值x,1个是标签值y

然后定义模型函数,这个函数有3个参数,

1个就是上面说的x,还有2个是参数,分别是w和b,就是2个参数斜率和位移

而上面的2个参数,要用tf.Variable来声明来创建变量,它是会变的,在训练中学习到的,所以给它的初值是多少是无所谓的

然后就是怎么样来训练模型了

训练模型就是一个不断迭代不断改进的过程

image.png

首先是训练参数,也就是超参,一个是迭代次数train_epochs,这里设置为10,根据复杂情况,可能上万次都可能的。一个是学习率learning_rate,这里默认为0.05

下一步定义损失函数,用于描述预测值与真实值之间的误差,从而指导模型收敛方向,这个非常重要,所以我把定义都抄下来了。这个就好像是你在学习的过程中,有一个贴心的小蜜,总能在合适的时候告诉你说,亲你这里不对,亲你那里错了,这样你不会在错误的方向越走越远碰到南墙才回头


这里用的损失函数是采用均方差(Mean Square Error MES),还有一个是交叉熵(cross-entropy

这个tf都提供了方法,这样写:

loss_function=tf.reduce_mean(tf.squre(y-pred))

这里pred是一个节点,就是调用模型函数得到的值;y是标签值

然后是定义优化器,采用梯度下降优化器,优化的目标是什么?由损失函数评估的损失最小,就是目标。这样写:

optimizer=tf.train.GradiantDescentOptimizer().minimize(loss_function)

好了,后面就是创建会话和变量初始化tf.global_variable_initializer()

然后开始迭代训练,训练的内容,是每次将样本逐个输入模型,进行梯度下降优化操作。这里为了演示,每轮迭代后绘制出模型曲线

(这里有点不清楚的地方,是将样本输入模型?还是训练得到了模型?我觉得是前者,训练得到的只是参数值,模型不是训练出来的)

训练代码:

for xs,ys in zip(x_data,y_data): //取值组成样本
  _,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys}) //样本填充到占位符里,跑了2个节点,optimizer节点和loss_function节点
  b0temp=b.eval(session=sess)
  w0temp=w.eval(session=sess)
  plt.plot(x_data,w0temp*x_data+b0temp)

然后打印参数结果:print("w:"sess.run(w))还有b

在把结果可视化

plt.scatter(x_data,y_data,label='Original data')
plt.plot(x_data,x_data*sess.run(w)+sess.run(b),label='Fitted line',color='r',linewidth=3)
plt.legend(loc=2)//指定图例位置

落了很长时间没学,捡起来继续(7月了)。编号也忘了从哪里接上,就从20开始吧。
前面弄完了一元线性回归,现在是波士顿房价预测-多元线性回归。
数据方面,12+1共13个指标,506行数据。
前面12个是多个维度的数据,维度还是比较全面的,是输入值/特征。
比如:城镇人均犯罪率、师生比例、住宅比例、边界是否为河流等
最后1个是自住房的平均房价,是输出值/预测值/标签。

代码里用到的模块有numpy,pandas, shuffle
pandas用来处理文件很方便,shuffle就是洗牌,我们打牌,一局结束后需要洗牌后再开始下一局的

这里介绍了pandas库,处理常规大小的数据文件,会很方便,基于BSD协议的库。
可以自动转换为numpy的多维数组。

下面是代码

%matplotlib notebook

import tensorflow.compat.v1 as tf
tf.disable_eager_execution
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
df=pd.read_csv("data/boston.csv",header=0)
print(df.describe)

开头行有个尖括号开头,结尾也有结尾尖括号,因为MD显示不出来,去掉了

bound method NDFrame.describe of         CRIM   ZN   INDUS   CHAS    NOX     RM   AGE     DIS  RAD  TAX  \
0    0.00632  18.0    2.31     0  0.538  6.575  65.2  4.0900    1  296   
1    0.02731   0.0    7.07     0  0.469  6.421  78.9  4.9671    2  242   
2    0.02729   0.0    7.07     0  0.469  7.185  61.1  4.9671    2  242   
3    0.03237   0.0    2.18     0  0.458  6.998  45.8  6.0622    3  222   
4    0.06905   0.0    2.18     0  0.458  7.147  54.2  6.0622    3  222   
..       ...   ...     ...   ...    ...    ...   ...     ...  ...  ...   
501  0.06263   0.0   11.93     0  0.573  6.593  69.1  2.4786    1  273   
502  0.04527   0.0   11.93     0  0.573  6.120  76.7  2.2875    1  273   
503  0.06076   0.0   11.93     0  0.573  6.976  91.0  2.1675    1  273   
504  0.10959   0.0   11.93     0  0.573  6.794  89.3  2.3889    1  273   
505  0.04741   0.0   11.93     0  0.573  6.030  80.8  2.5050    1  273   

     PTRATIO  LSTAT  MEDV  
0       15.3   4.98  24.0  
1       17.8   9.14  21.6  
2       17.8   4.03  34.7  
3       18.7   2.94  33.4  
4       18.7   5.33  36.2  
..       ...    ...   ...  
501     21.0   9.67  22.4  
502     21.0   9.08  20.6  
503     21.0   5.64  23.9  
504     21.0   6.48  22.0  
505     21.0   7.88  11.9  

[506 rows x 13 columns]
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。