神经网络入门及tensorflow实战
分享一下最近接触到的神经网络的知识:TensorFlow神经网络实战
-
- 神经网络
人工智能(大概念)
机器学习+搜索策略
IBM深蓝战胜世界冠军(国际象棋)采用传统的搜索策略
机器学习综合搜索策略或算法领域都会用到
alpha go zero 从0开始 启发式搜索中的思路 打败原来的alpha go
2015年tf开源
2016年alpha go打败李世石
2017年alpha go zero 从空白状态学起自学围棋打败前辈
腾讯 AI围棋绝艺登台亮相
国内外各大公司都纷纷宣布将人工智能作为下一个重要的战略重心
人工智能,深度学习,机器学习
深度学习是机器学习的一种方法
深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化。深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。深度学习是一个框架,例如TensorFlow就是深度学习框架
-
-
- 背景
-
诞生于20世纪中叶,是一种仿生学产品
兴起的三大驱动要素:算法、大数据、计算力
主要功能:分类
图像 密集型矩阵 自动驾驶
语音 语音助手
文本 稀疏矩阵 新闻推送 百度app
-
-
- 神经网络的结构
-
节点和层
输入到输出整个预测过程
正向学习,反向参数调校
4个神经元
神经元
h()激励函数:提供规模化的非线性能力,激励函数某种意义上是模拟大脑神经元被激发的一种概念,有一个状态变化是非线性的
常用的激励函数有:sigmoid、tanh、ReLu三种
sigmod 优点整个区间都可导,反向传播整个区间可导性好不是原点对称
tanh 将sigmod平移到原点避免sigmod做数据中心化,表现会更好,但不足是
当趋向无限大变化很小,学习效率小,周期长
ReLu函数当大于0线性 在0区间段导数为0有改进版取小的斜率,线性的
一般用框架做都选用ReLu
当做二分类时用sigmod也可以
学习过程中产生的函数值(预测值)和训练集真值(label特征)有差异这个就是损失函数要做的事
-
-
-
神经元
- 二输出神经元:一个神经元
-
神经元
-
神经元:最小的神经网络
逻辑回归:最简化的网络结构
y=W*X 线性处理
h()激化函数 非线性处理
W*x->h(W*x+b) 其实是一个整体
x=[x1,x2,x3]
W=[
w1,
w2,
w3]
b=[b1,b2,b3]
W是权重 矩阵乘法
h是**函数 非线性变换
b是偏置
x 是特征样本
例如
x=[房屋面积,房屋价格,评分]
x=[100,100w,6]
x=[3,1,2] x为3个特征
W=[0.4,0.6,0.5] 系数对应3个
h(a)=a/100 h(a) **函数
y=W*x=3*0.4+1*0.6+2*0.5=28 一个输出
h(W*x)=h(28)=0.28
二分类:估计是0
忽略b 干扰
神经元**函数 sigmod 解决二分类问题
0,1之间的值是一个概念
P(Y=0|x) 为0概率估计
P(Y=1|x) 为1概率估计
这就是二分类逻辑回归模型
-
-
-
- 多输出神经元
-
-
加神经元就可多输出,这里2个神经元做3分类逻辑回归模型
W从向量扩展为矩阵
输出W*x则变成向量
例如
X=[3,1,2] X为3个特征 X(1,3)
W=[[0.4,0.6,0.5],[0.3,0.2,0.1]] w为2行3列矩阵 W(2,3)
Y=[y0,y1]=[2.8,1.3]
Y[0]=W[0]*X
Y[1]=W[1]*X
Y= W.T.dot(X)
如何将二分类扩展为多分类?
二分类Y只有一个输出
分母相同,做归一化,指定W*x做多输出就可以了
实现二分类转换多分类的逻辑回归模型
多输出神经元的softmax()函数回归
Y=[y0,y1]=[2.8,1.3]
exp(Y)=[exp(-2.8),exp(-1.3)]=[0.06,0.27]
sum=1+0.06+0.27=1.33
P(Y=0|x)=0.06/1.33=0.045
P(Y=1|x)=0.27/1.33=0.203
P(Y=2|x)=1.00/1.33=0.752
-
- TensorFlow实现逻辑回归模型
Mnist数据集介绍和获取
TensorFlow中逻辑回归使用的函数
代码实现
判断识别率 准确率是多少
图片的10分类任务
-
-
-
认识MNIST数据集
- 简述
-
认识MNIST数据集
-
Tensorflow框架在tensorflow.contrib.learn.python.learn.datasets包中提供多个机器学习的数据集。这里介绍的是MNIST数据集,其功能都定义在mnist.py模块中。MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,告诉我们这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1
-
-
-
- 结构
-
-
外观
one-hot 独热编码 (0,0,0,1,0,0,0,0,0,0) 表示3
Image部分:手写体的图片 (让学生来写的)
Label部分:图片代表哪个数字 (学生写的正确答案)
属于监督学习
-
-
-
- 加载
-
-
有两种方式可以获取MNIST数据集:
1) 自动下载
TensorFlow框架提供了一个函数:read_data_sets,该函数能够实现自动下载的功能。
2)手动下载
用户也能够手动下载数据集,然后向read_data_sets函数传递所在的本地目录
http://yann.lecun.com/exdb/mnist
-
-
- 实现逻辑回归模型:softmax函数
-
1.逻辑回归 处理二分类问题 是softmax的特例
:代表线性回归函数
2.softmax 可处理多分类问题
softmax是逻辑回归的泛化
softmax函数与sigmoid函数类似都可以作为神经网络的**函数。
sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。
而softmax把一个k维的real value向量[a1,a2,a3,a4….]映射成一个[b1,b2,b3,b4….],其中bi是一个0-1的常数(概率),然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。
所以对于MNIST分类任务是多分类类型,所以需要使用softmax函数作为神经网络的**函数。
MNIST的每一张图片都表示一个数字,从0到9。
有10种可能性
softmax模型可以用来给不同的对象分配概率。
为了得到一张给定图片属于某个特定数字类的证据(evidence),我们对图片像素值进行加权求和。
如果这个像素具有很强的证据说明这张图片不属于该类,那么相应的权值为负数,相反如果这个像素拥有有利的证据支持这张图片属于这个类,那么权值是正数。
红色代表负数权值(不是),蓝色代表正数权值(是)。
例如 看0 中间红色的出现表示不可能是0因为0是空心的
evidencei公式 是一元线性回归
其中 代表权重,
代表数字 i 类的偏置量,j 代表给定图片 x 的像素索引用于像素求和。然后用softmax函数可以把这些证据转换成概率 y:
把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。
对每一类别估算一个概率:
比如
预测数字3是80%
预测数字5是5%
概率大的数字做输出结果
原理:
可判定为某类的特征相加,然后这些特征转化为判定是这一类的概率
Numpy使用C和Fortran语言编写的调用openblas,mkl等有延迟而用tf做性能更好
前馈神经网络(一个带有10个神经元的隐藏层)
B和Y都为一个[10]类型的向量,X为一个[784]类型的向量(一个样本,公式4),W是一个[10,784]类型的矩阵。
X是输入参数,为训练数据,即多张图像;(多个样本使用公式5)
W和B是未知参数,即通过神经网络来训练的数据;
Y为输出参数,为图像标签,将使用该值与已知标签进行比较。
-
-
- 训练模型:代价函数
-
我们可以创建一个模型(model),但我们仍然不知道模型的好坏。为了评估一个TensorFlow模型的性能,我们可以提供一个期望值,然后比较模型产生值和期望值之差来进行评估。
前面线性回归用的是均方差损失
y表示真值 Model(x)表示预测值
由于传递神经网络采用梯度下降法来逐渐调整式(4)中的W和B参数,即逐步减少均分误差的值;然而若以"均分误差"为标准逐步调整参数,其归约的速度非常慢。所以提出以"交叉熵"法为标准评估模型的值
交叉熵损失
y是真值 Model(x) 预测值
交叉熵产生于信息论里面的信息压缩编码技术
优化器基于梯度下降法自动修改神经网络的训练参数,即W和b的值。
-
-
- 评估模型
-
tf.argmax:能给出某个tensor对象在某一维上的其数据最大值所在的索引值。由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签。
tf.cast:类型转换,将一个tensor对象的所有元素类型转换为另一种类型。即上述将tf.equal方法生成的布尔值转换成浮点数。
tf.reduce_mean:求矩阵或向量的平均值。若x=[[1., 1.] [2., 2.]],则tf.reduce_mean(x) ==> 1.5=(1+1+2+2)/4,
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
y预测值,y_真值
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
例如,[True, False, True, True] 会变成 [1,0,1,1] ,取平均值后得到 0.75
-
-
- 实现只有一层的神经网络
-
一个线性层的softmax回归模型的神经网络
-
-
卷积神经原理
- 卷积神经的概念
-
卷积神经原理
来历:
Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络
优点:
CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。
适用领域:
语音识别、图像识别等多个领域
结构分类:
特征提取层、特征映射层
极少预处理 很重要的优点
过去很复杂枯燥的处理简化
-
-
- 卷积神经网络结构
-
输入层+卷积层+**函数+池化层+全连接层+输出层
其中(卷积层+**函数+池化层可以是n个)
-
-
- 卷积层
-
卷积的主要目的是为了从输入图像中提取特征。
卷积可以通过从输入的一小块数据中学到图像的特征,并可以保留像素间的空间关系。
- 提取特征
- 保留像素间空间关系
-
- **函数
-
ReLU 是一个元素级别的操作(应用到各个像素),并将特征图中的所有小于 0 的像素值设置为零。ReLU 的目的是在 ConvNet 中引入非线性。
-
-
- 池化层
-
池化层:降低了各个特征图的维度,但可以保持大部分重要的信息。空间池化有下面几种方式:最大化、平均化、加和等等。
-
-
- 全连接层
-
全连接层:使用图像的特征把输入图像基于训练数据集进行分类。
-
-
- 卷积网络Mnist训练过程
-
整个卷积神经网络训练的过程
-
-
- 训练目标
-
用时50分钟
-
-
- tensorflow 模型的保存和读取
-
深度学习耗时 几万次 几十万 几百万 上亿次如果中途遇到问题导致中断重新
在训练模型后,希望保存训练的结果,以便下次再使用或是方便日后查看,
这时就用到了Tensorflow变量的保存。
变量的保存是通过tf.train.Saver()方法创建一个Saver管理器,来保存计算图模型中的所有变量。
我们要注意,我们的存储文件save.ckpt是一个二进制文件,Saver存储器提供了向该二进制文件
保存变量和恢复变量的方法。保存变量的方法就是程序中的save()方法,保存的内容是从变量名到tensor值的映射关系。
Saver提供了一个内置的计数器自动为checkpoint文件编号。
这就支持训练模型在任意步骤多次保存。
此外,还可以通过global_step参数自行对保存文件进行编号,
例如:global_step=2,则保存变量的文件夹为model.ckpt-2。
那如何才能恢复变量呢?首先,我们要知道一定要用和保存变量相同的Saver对象来恢复变量。其次,不需要事先对变量进行初始化。
1 . 2 tensorflow入门与实战:
- TensorFlow框架
- 简介
来历:谷歌研发的第二代人工智能学习系统
原理:张量从流图的一端流动到另一端的计算过程
用途:可用于语音识别,图像识别等多个深度学习领域
优势:开源,代码更新快,公司势力强
TensorFlow既是一个实现机器学习算法的接口,也是执行机器学习算法的框架
除执行深度学习算法,还可以用来实现其他算法,包括KNN,线性回归,逻辑回归,随机森林等,用户可以方便地用它设计神经网络结构例如CNN,RNN等
张量 n维数组
flow 流
小到手机大到数台服务器
都在用tf
google更新版本快
-
- TensorFlow环境搭建
tensorflow是基于python脚本语言的,因此需要安装python,
当然还需要安装numpy、scipy、six、matplotlib等几十个扩展包。
如果一个个安装,装到啥时候去?
不过现在有了集成环境anaconda,安装就方便了。
python的大部分扩展包, 都集成在anaconda里面了,因此只需要装这一个东西就行了。
安装
tf并不是python写成的库,底层有很多C++或CUDA的代码
有时需要编译安装
分为CPU版 只使用CPU安装
GPU版还要安装CUDA
推荐使用anaconda做为python环境避免大量的兼容性
CUDA是navidia 英伟达发明的并行计算架构,使得之前只使用CPU变为cpu和GPU协调处理,在视频应用中使用CUDA加速处理. 显卡中GPU图形处理器做了优化超过通用CPU,但只有navidia显卡才使用CUDA
-
-
- 安装步骤
-
1.安装anaconda
2.启动 anaconda prompt 管理员方式
更新pip
python -m pip install --upgrade pip
3.安装tensorflow
pip install tensorflow-1.6.0rc0-cp36-cp36m-win_amd64.whl
.whl格式的文件本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。方便在机器上进行python模块的安装
CPU版
GPU版
4.验证
在anacoda prompt下
>python
>>> import tensorflow as tf
>>> tf
>>> tf.__version__
'1.6.0-rc0'
>>> tf.__path__
['C:\\ProgramData\\Anaconda3\\lib\\site-packages\\tensorflow']
jupyter notebook
用浏览器修改字体
代码自动补全
conda install -c conda-forge jupyter_contrib_nbextensions
hinterland勾上
Codefolding:代码折叠
Collapsible Headings:标题折叠
- TensorFlow基础
- 计算图模型
张量在数学/物理上解释不同
tensor张量就是多维数组(数据结构)
flow流是计算模型
tf中的所有计算都会转化为计算图上的节点
tf就是通过计算图的形式来表述计算的编程系统
TensorFlow 中的 Tensor表示张量(多维数组)
TensorFlow 中的 Flow 表示张量之间通过计算流相互转换的过程。
TensorFlow 的每一个计算都是图上的一个节点,节点之间的边描述了节点之间的依赖关系。
TensorFlow用张量这种数据结构来表示所有的数据。
用一阶张量来表示向量,如:v = [1.2, 2.3, 3.5] ,
如二阶张量表示矩阵,如:m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]],可以
看成是方括号嵌套的层数。
TensorFlow 程序一般分为两个阶段:
构建过程:会构建出一个图(graph),即所谓的计算图(computation graph);
执行过程:使用 session 执行构建过程中生成的图中的操作。
#tf.constant是一个计算,这个计算的结果为一个张量,保存在变量data1中
data1 = tf.constant(2, dtype=tf.int32,name='data1')
tf和np不同,计算的结果是一个张量的结构
一个张量保存了三个属性:name名字,type类型,shape维度
tf的计算通过计算图的模型建立
计算图每个节点代表一个计算,计算结果保存在张量中
张量用途
1.对中间计算结果的引用
2.当计算图构建完后张量可获得计算结果,也就是真实的数字
会话
执行定义好的计算
会话拥有并管理tf程序运行时所有资源
计算完后需要关闭会话帮助系统回收资源
命令式编程
x = 1
y = 2
b = 3
x * y + b
立即执行,好理解,灵活,好调试
不足:整体优化难 统一辅助函数很难
声明式编程
# 构建
x=tf.constant(1)
y=tf.constant(2)
b=tf.constant(3)
r1=tf.multiply(x,y)
r2=tf.add(r1,b)
# 执行
sess=tf.Session()
print(sess.run(r1))
print(sess.run(r2))
sess.close()
先构建计算图,再输入数值计算,好处拿到计算图便于优化存取
不足:不好调试,监视中间结果不便
relu = tf.nn.relu(tf.matmul(w, x) + b)
-
-
基本用法
- 常量和变量
-
基本用法
# 构建
data1=tf.constant(2,dtype=tf.int32) #常量
data2=tf.Variable(10,name='var') #变量
init=tf.global_variables_initializer()#所有变量必须初始化
#print(data1)
#print(data2)
# 执行 所有的操作用会话完成
sess=tf.Session()
sess.run(init)
print(sess.run(data1))
print(sess.run(data2))
sess.close()
#tf=tensor+graph=张量(数据)+计算图(数据操作过程)
#session 所有计算图交给session执行 交互环境 tensor有哪些 flow有哪些
简化一点的写法
# 构建
data1=tf.constant(2,dtype=tf.int32) #常量
data2=tf.Variable(10,name='var') #变量
init=tf.global_variables_initializer()#所有变量必须初始化
#print(data1)
#print(data2)
# 执行 所有的操作用会话完成
with tf.Session() as sess:
sess.run(init)
print(sess.run(data1))
print(sess.run(data2))
-
-
- 四则运算
-
import tensorflow as tf
data1=tf.constant(6)
data2=tf.constant(2)
dataAdd=tf.add(data1,data2)
dataMul=tf.multiply(data1,data2)
dataSub=tf.subtract(data1,data2)
dataDiv=tf.divide(data1,data2)
with tf.Session() as sess:
print(sess.run(dataAdd))
print(sess.run(dataMul))
print(sess.run(dataSub))
print(sess.run(dataDiv))
print('over')
-
-
- 矩阵运算
-
#placehold 占位符
data1=tf.placeholder(tf.float32)
data2=tf.placeholder(tf.float32)
dataAdd=tf.add(data1,data2)
with tf.Session() as sess:
print(sess.run(dataAdd,feed_dict={data1:6,data2:2}))
print('over')
# 一维 [1,2,3]
# 二维 [[1,1],[2,2],[3,3]]
# 三维 [[[1],[1],[1]],[[2],[2],[2]],[[3],[3],[3]]]
data1=tf.constant([[6,6]])
data2=tf.constant([[2],[2]])
data3=tf.constant([[3,3]])
data4=tf.constant([[1,2],
[3,4],
[5,6]])
with tf.Session() as sess:
print(sess.run(data4)) #打印整体
print(sess.run(data4[2])) #打印某行
print(sess.run(data4[:,0])) #打印某列
print(sess.run(data4[0,1])) #打印某个元素
#构建
data1=tf.constant([[6,6]])
data2=tf.constant([[2],[2]])
data3=tf.constant([[3,3]])
data4=tf.constant([[1,2],
[3,4],
[5,6]])
matmul1=tf.matmul(data1,data2) #矩阵点乘
matmul2=tf.multiply(data1,data2)#逐个元素乘
matAdd=tf.add(data1,data3) #逐个元素加
#执行
with tf.Session() as sess:
print(sess.run(matmul1))
print(sess.run(matmul2))
print(sess.run(matAdd))
-
- TensorFlow实现一个线性回归模型
线性回归:是一种统计方法,来确定两种或两种以上变量间相互依赖的定量关系
所有的点x值和y值有相关依赖关系
一元线性回归: y=w*x+b
任务:
根据训练数据预测一元线性回归模型,并用验证数据验证预测的一元线性回归模型是否正确
实现步骤:
(x,y)
1 3
2 5.1
3 6.99
y=w*x+b
1.假设一个线性回归模型
y=h(x)=3*x+5
2.判断这个假设回归模型对不对
3*1+5=8 和3比效果不好
代价函数(给预测函数打个分值就像考试一样):
越小越好,这里用均方差
(8-3)的平方+(11-5.1)的平方+(14-6.99)的平方/2*3
3.调整这个模型参数
h(x)=2.8*x+4
h(x)=2.6*x+3
...
h(x)=2.0*x+1
求最优解算法:梯度下降算法
4.得到符合要求的线性回归模型
5.用验证数据验证训练出来的模型对不对
小结:
1.获取训练数据和验证数据 一堆(x,y)组成的训练点
2.假设一个一元线性回归函数 y=w*x+b
3.判断假设函数好坏 代价函数
4.调整假设的一元线性回归函数 (用代价函数值)梯度下降算法 步伐(学习率)
5.得到最优的预测的一元线性回归函数
6.根据验证数据预测函数是否符合要求
目标:想获得一个做预测的模型
- 训练数据 哪里来?
- 实现模型(假设的模型)
- 找到代价函数(损失函数)
- 获得基于梯度下降法的优化器
- 用优化器来最小化代价函数(训练我们模型的参数)
- 评价模型(测试数据)
忽略警告:
安装tensorflow遇到:Your CPU supports instructions that this TensorFlow binary was not compiled to use
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tensorflow 性能优化过的框架 numpy
- TensorFlow神经网络实战
-
- 神经网络
人工智能(大概念)
机器学习+搜索策略
IBM深蓝战胜世界冠军(国际象棋)采用传统的搜索策略
机器学习综合搜索策略或算法领域都会用到
alpha go zero 从0开始 启发式搜索中的思路 打败原来的alpha go
2015年tf开源
2016年alpha go打败李世石
2017年alpha go zero 从空白状态学起自学围棋打败前辈
腾讯 AI围棋绝艺登台亮相
国内外各大公司都纷纷宣布将人工智能作为下一个重要的战略重心
人工智能,深度学习,机器学习
深度学习是机器学习的一种方法
深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化。深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。深度学习是一个框架,例如TensorFlow就是深度学习框架
-
-
- 背景
-
诞生于20世纪中叶,是一种仿生学产品
兴起的三大驱动要素:算法、大数据、计算力
主要功能:分类
图像 密集型矩阵 自动驾驶
语音 语音助手
文本 稀疏矩阵 新闻推送 百度app
-
-
- 神经网络的结构
-
节点和层
输入到输出整个预测过程
正向学习,反向参数调校
4个神经元
神经元
h()激励函数:提供规模化的非线性能力,激励函数某种意义上是模拟大脑神经元被激发的一种概念,有一个状态变化是非线性的
常用的激励函数有:sigmoid、tanh、ReLu三种
sigmod 优点整个区间都可导,反向传播整个区间可导性好不是原点对称
tanh 将sigmod平移到原点避免sigmod做数据中心化,表现会更好,但不足是
当趋向无限大变化很小,学习效率小,周期长
ReLu函数当大于0线性 在0区间段导数为0有改进版取小的斜率,线性的
一般用框架做都选用ReLu
当做二分类时用sigmod也可以
学习过程中产生的函数值(预测值)和训练集真值(label特征)有差异这个就是损失函数要做的事