《深度学习应用开发》学习笔记汇总
在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代码补全,可以有很多快捷键方便操作,以前是我孤陋寡闻井底之蛙了
先定义训练数据的占位符
,定义了2个,
1个是特征值x,1个是标签值y
然后定义模型函数,这个函数有3个参数,
1个就是上面说的x,还有2个是参数,分别是w和b,就是2个参数斜率和位移
而上面的2个参数,要用tf.Variable
来声明来创建变量,它是会变的,在训练中学习到的,所以给它的初值是多少是无所谓的
然后就是怎么样来训练模型了
训练模型就是一个不断迭代不断改进的过程
首先是训练参数
,也就是超参,一个是迭代次数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]
- 点赞
- 收藏
- 关注作者
评论(0)