神经网络计算过程
人工智能三学派
人工智能:让机器具备人的思维和意识。
三学派分类
1.行为主义:
基于控制论,构建感知-动作控制系统(控制论,如平衡,行走,避障等自适应控制系统)
如:让机器人单脚站立,感知摔倒的方向,控制两只手的动作。保持身体的平衡,这就构建了一个感知-动作控制系统,是典型的的行为主义
2.符号主义:
基于算术逻辑表达式,求解问题时先把问题描述为表达式,在求解表达式。(可用公式描述,实现理性思维,如 专家系统)
在求解某个问题时,可以用if case这样的条件语句和若干计算公式描述出来,就是符号主义的方法。
符号主义可以认为是用公示描述的人工智能,他让计算机具备了理性思维,但是人类不仅具备理性思维,还具备无法用公示描述的感性思维。
3.连接主义:
仿生学,模仿神经元连接关系。(仿脑神经元连接,实现感性思维,如神经网络)
如:神经网络可以让计算机具备感性思维,我们可以用计算机仿出神经网络,让计算机具备感性思维。
训练流程
- 准备数据:采集大量“特征/标签”数据
- 搭建网络:搭建神经网络结构
- 优化参数:训练网络获取最佳参数, 即通过反向传播,优化连接的权重,直到模型的识别准确率达到要求,得到最优的连线权重,把这个模型保存起来。
- 应用网络:将网络保存为模型,输入从未见过的新数据,通过前向传播输出概率值,概率值最大的一个就是分类和预测的结果了。
机器学习初见
什么是机器学习
传统冯诺依曼计算机工作原理:指令和数据都被预先存储,按照指令先后顺序,逐条读取并运行。
特点:输出结果是确定的。因为先干什么后干什么都已经提前写在指令里了。
机器学习定义:如果在一个程序可在任务T上,随经验E的增加,效果P随之增加,则这个程序可以从经验中学习。
机器学习是一种统计学方法,计算机利用已有数据,得出某种模型,在利用此模型预测结果。
随着经验的增加,效果会变好。
机器学习的输入不再是写好的指令而是数据,输出是结果出现的概率。会预先读取大量数据,根据已有数据训练模型,当模型训练好了再把新的数据输入,会计算出新数据所对应的结果。
【机器学习就是先用以往的数据训练模型,再用模型预测新数据的结果】
机器学习三要素:数据;算法;算力。
机器学习最主要的应用
- 对连续数据的预测
- 对离散数据进行分类
人工智能VS机器学习VS深度学习
人工智能:机器模拟人的意识和思维。
机器学习:实现人工智能的一种方法,是人工智能的子集。
深度学习:是深层次神经网络,是机器学习的一种实现方法,是机器学习的子集。
神经网络的分类过程
给鸢尾花分类
0-狗尾草鸢尾
1-杂色鸢尾
2-弗吉尼亚鸢尾
在这里插入代码片人们通过经验总结出规律:通过测量花的花萼长,花萼宽,花瓣长,花瓣宽,可以得出鸢尾花的类别。
(如:花萼长>花萼宽 且 花瓣长/花瓣宽>2 则为1杂色鸢尾)
if语句 case语句——专家系统:
把专家的经验告知计算机,计算机执行逻辑判别(理性计算),给出分类`
神经网络:
采集大量(花萼长,花萼宽,花瓣长,花瓣宽,对应的类别)数据对构成数据集【特征和标签对构成数据集】
输入特征:花萼长,花萼宽,花瓣长,花瓣宽
标签(需人工标定):对应的鸢尾花类别
把数据集喂入搭建好的神经网络结构,网络通过反向传播优化参数,得到模型,模型读入新输入特征,输出识别结果
如下图:y就是三种鸢尾花各自的可能性大小
如下图:每一个X结点都和每一个y结点有关系,叫做全连接网络
损失函数
如果出现输出的类别结果和输入的标签不一样,是因为最开始的参数W和b都是随机产生的,最初训练后的结果都是蒙的。
用损失函数(loss function)定义预测值(y)和标准答案(y_)之间的差距。
损失函数可以定量地判断当前这组参数w和b的优劣。当损失函数输出值最小时,参数w,b会出现最优值。
损失函数的定义有多种方法,均方误差就是一种常用的损失函数,均方误差表征了网络前向传播推理(结果)和标准答案之间的差距。
梯度下降
目的:找到一组参数w和b,使得损失函数最小。
梯度:函数对各参数求偏导后的向量。函数梯度下降方向是函数减小方向
梯度下降法:沿着损失函数梯度下降的方向,寻找损失函数的最小值,得到最优参数的方法。
学习率(learning rate,lr):lr是梯度下降的速度,是一个超参数。如果学习率设置过小,参数更新缓慢;如果学习率设置的过大,梯度可能会在最小值附近来回震荡,跳过最小值,甚至可能无法收敛。
反向传播
画出损失函数 2w+2 的图像,优化参数w,就是要找到某个w,使得损失函数的梯度减小。由图可得,在w=1处。
我们优化函数的目的就是为了找到这个使损失函数loss值最小的w=-1值
代码:
import tensorflow as tf
w=tf.Variable(tf.constant(5,dtype=tf.float32))
lr=0.2
epoch=40
for epoch in range(epoch):for epoch #定义顶层循环,表示对数据集循环epoch次
with tf.GradientTape() as tape: #with结构到grads框起了梯度的计算过程
loss=tf.square(w+1)
grads=tape.gradient(loss,w) #.gradient函数告知谁对谁求导
w.assing_sub(lr*grads) #.assign_sub 对变量做自减 即:w-=lr*grads 即 w=w-lr
print("After %s epoch,w is %f,loss is %f" %(epoch,w.numpy(),loss))
# lr初始值:0.2 请自改学习率0.001 0.999看收敛过程
# 最终目的:找到loss最小 即 w=-1的最优参数w
张量生成
张量概念和阶数
张量(tensor):多维数组(列表)
阶:张量的维数
维数 | 阶 | 名字 | 例子 |
---|---|---|---|
0-D | 0 | 标量 scalar | s=123 |
1-D | 1 | 向量 vector | v=[ 1,2,3 ] |
2-D | 2 | 矩阵 matrix | m=[ [1,2,3] [4,5,6] [7,8,9] ] |
n-D | n | 张量 tensor | t=[ [ [ |
ps: 0阶张量叫做标量,表示的是一个单独的数;
1阶张量叫做向量,表示的是一个一维数组;
2阶张量叫做矩阵,表示的是一个二维数组,每个元素用行号和列号共同索引号
n阶 判断张量是几阶就是最左边有多少个 [ 0个是0阶,1个是1阶,n个是n阶
数据类型
-
tf.int,tf.float…
32位整型 tf.int 32, 32位浮点型tf.float 32, 64位浮点型 tf.float 64 -
tf.bool
tf.constant( [True,False] ) -
tf.string
tf.constant("hello,world! ")
如何创建一个tensor
创建tensor
直接打印a会输出张量的所有信息,包括张量的内容,张量的形状,和张量的数据类型。
张量的形状看shape的逗号隔开了几个数字,逗号隔开了几个数字,这个张量就是几维的,该例子中,shape中用逗号隔开了一个数字(因为只有一个数字 2),说明是一维张量;这个数字是2,说明这个张量里有两个元素,也就是这里的数值1和数值5.
将numpy的数据类型转换为tensor数据类型
很多时候数据是由numpy格式给出的,可以使用conver_to_tensorf()把它变成tensor格式
创建全为0,全为1,全为指定值的张量
ps:多维的 [ ] 里写每个维度的元素个数,中间用逗号隔开。
生成正态分布的随机数,默认均值为0,标准差为1
编写代码时常常随机生成初始化参数,要符合正态分布:
tf.random.normal(维度,mean=均值,stddev=标准差)
生成截断式正态分布的随机数
有时候希望生成的随机数更集中一些:
tf.random.truncated_normal(维度,mean=均值,stddev=标准差)
使用该函数是生成的数据在两倍标准差内,更向均值集中
如:
生成均匀分布随机数
常用TF函数
略。