
唤醒手腕 - 神经网络与深度学习(Tensorflow 2.0 应用篇)更新中
机器学习是什么?简单说就是无序数据转化为价值的方法,从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。机器学习价值和重要性?自动化 (Automatically) : 机器学习方法可以看做是自动化生成算法的算法。快速 (Fast) :机器学习方法可以节约时间。相比如人
机器学习、深度学习简介
现在搞传统机器学习相关的研究论文确实占比不太高,有的人吐槽深度学习就是个系统工程而已,没有数学含金量。但是无可否认的是深度学习是在太好用啦,极大地简化了传统机器学习的整体算法分析和学习流程,更重要的是在一些通用的领域任务刷新了传统机器学习算法达不到的精度和准确率。
深度学习这几年特别火,就像几年前的大数据一样,不过深度学习其主要还是属于机器学习的范畴领域内,所以这篇文章里面我们来唠一唠机器学习和深度学习的算法流程区别。
机器学习是什么?
简单说就是无序数据转化为价值的方法,从广义上来说,机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。但从实践的意义上来说,机器学习是一种通过利用数据,训练出模型,然后使用模型预测的一种方法。
- “训练”与“预测”是机器学习的两个过程,“模型”则是过程的中间输出结果,“训练”产生“模型”,“模型”指导 “预测”。
- 机器学习方法是计算机利用已有的数据(经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法。
- 让我们把机器学习的过程与人类对历史经验归纳的过程做个比对。
机器学习价值和重要性?
我们专注于这些工具解决实际问题的能力和机器学习实践,从数据中抽取规律,并用来预测未来。
-
自动化 (Automatically) : 机器学习方法可以看做是自动化生成算法的算法。
-
快速 (Fast) :机器学习方法可以节约时间。相比如人工处理,机器学习方法可以更加快速分析样例数据并生成算法。
-
精确性 (Accurate) : 由于自动化的特性,机器学习方法可以基于更多的数据、运行更长的时间,生成更精确的决策。
-
规模 (Scale) : 机器学习方法可以给人工无法解决的问题提供解决方案。
机器学习应用举例
分类问题:图像识别、垃圾邮件识别
回归问题:股价预测、房价预测
排序问题:点击率预估、推荐
生成问题:图像生成、图像风格转换、图像文字描述生成
机器学习应用流程
机器学习的算法流程
实际上机器学习研究的就是数据科学(听上去有点无聊),下面是机器学习算法的主要流程:主要从1)数据集准备、2)探索性的对数据进行分析、3)数据预处理、4)数据分割、5)机器学习算法建模、6)选择机器学习任务,当然到最后就是评价机器学习算法对实际数据的应用情况如何。
深度学习算法集合
包含:1. 卷积神经网络 2. 循环神经网络 3. 自动编码器 4. 稀疏编码 5. 深度信念网络 6.限制玻尔兹曼机
神经元 - 逻辑斯蒂回归模型
由于神经网络的模拟对象是人的大脑,那么在讨论具体的模型之前,我们有必要先从生物学的角度来看看人的大脑有哪些特性。
根据生物学的研究,人脑的计算单元是神经元(neuron)。它能根据环境变化做出反应,再将信息给其他的神经元。在人脑中,大约有 860 亿个神经元,它们相互联结构成了极其复杂的神经系统,而后者正是人类智慧的物质基础。因此遵循人脑的生物结构,我们首先需要搭建模型来模拟人的神经元。
神经元基本介绍
神经元是神经网络的最小结构,将多个神经元组合在一起就形成了神经网络。神经元也可以经过一些设置之后形成一个逻辑回归模型。
输入信号来自外部或别的处理单元的输出,在数学上表示为行向量
x
=
(
x
1
,
x
2
,
…
,
x
m
)
x=(x_1,x_2,…,x_m)
x=(x1,x2,…,xm),其中
x
i
x_i
xi 为第
i
i
i 个输入的激励电平,
m
m
m 表示输入数目。
连接到结点k的加权表示为加权向量 W k = ( w k 1 , w k 2 , … , w k m ) W_k=(w_k1,w_k2,…,w_km) Wk=(wk1,wk2,…,wkm),其中 w k i w_{ki} wki 表示从结点 i i i(或第 i i i 个输入点)到结点 k k k 的加权,或称 i i i 与 k k k 结点之间的连接强度。
计算功能的主要作用是对每个输入信号进行处理以确定其强度(加权);确定所有输入信号的组合效果(求和);然后确定其输出(转移特性)。
也就是说,当神经元接受来自 n 个其他神经元传递过来的输入信号,神经元将接受到的输入值按照某种权重加起来,叠加起来的刺激强度 S 可用公式表示:
S
=
w
1
x
1
+
w
2
x
2
+
⋯
+
w
n
x
n
=
∑
i
=
1
n
w
i
x
i
S = w_1x_1 + w_2x_2 + \cdots + w_nx_n = \sum_{i=1}^{n}{w_ix_i}
S=w1x1+w2x2+⋯+wnxn=i=1∑nwixi
而这种输出,并非赤裸裸地直接输出,而是与当前神经元的阈值进行比较,然后通过激活函数(Activation Function)
向外表达输出,在概念上这叫做感知机(Perceptron),其模型可用公式表示:
y = f ( ∑ i = 1 n w i x i − θ ) y = f(\sum_{i=1}^{n}{w_ix_i - \theta}) y=f(i=1∑nwixi−θ)
在这里的 θ \theta θ 就是所谓的阈值
(Threshold)
, f f f 就是激活函数, y y y 就是最终输出。
神经元目标
神经元的目标是根据大量输入和输出示例调整权重。因此,假设我们向神经元展示了一千个猫的图片和非猫图片的示例,并且我们展示了每个示例中我们展示了哪些特征以及我们确信它们在这里的确定程度。基于上千张图像神经元决定:
哪些特征是重要的和正面的(例如每只猫的都有一条尾巴,因此权重必须大而且是正的)
哪些特征并不重要(例如,只有少数图片有2只眼睛,因此权重很小)
哪些特征是重要的和负面的(例如每个包含角的图片实际上是一只独角兽而不是猫的图片,所以权重必须大而且是负的)
神经元 - 简单基本计算问题
神经网络是一组按层次组成的神经元。每个神经元都是一个数学运算,它接受输入,乘以它的权重,然后通过激活函数将总和传递给其他神经元。神经网络正在学习如何根据前面的例子调整输入的权重来对输入进行分类。
它把输入值乘以它们的权重,然后将它们相加起来,之后,它将激活函数应用于求和。
二分类的逻辑斯谛模型
逻辑斯谛分布的分布函数 F ( x ) F(x) F(x) 的曲线如图所示,其图形是一条S形曲线,曲线在中心附近增长最快,在两端增长速度较慢。当 x x x 无穷大时, F ( x ) F(x) F(x) 接近于 1;当 x x x 无穷小时, F ( x ) F(x) F(x)接近于 0。
二项逻辑斯蒂回归模型是一种分类模型,由条件概率分布 P ( Y ∣ X ) P(Y|X) P(Y∣X) 表示,形式为参数化的逻辑斯蒂分布?这里随机变量X取值为实数,随机变量 Y Y Y 取值为 1 或 0。
假设一组数据的分布如上图所示,建立一个什么样的模型将两个类别区分开来呢?
线性回归模型
z
=
W
T
x
+
b
z = W^Tx + b
z=WTx+b,线性回归模型的输出值是一个实值,而二分类任务的输出标记(在二项逻辑斯蒂回归中,我们强制将正类标记为1,负类标记为0,后面将会提到这样做的原因),于是我们考虑将实值
z
z
z 转换为
0
/
1
0/1
0/1 值。
最理想的单位阶跃函数:
y
=
{
0
i
f
z
<
0
0.5
i
f
z
=
0
1
i
f
z
>
0
最理想的单位阶跃函数: y = \begin{cases} 0 & if & z < 0 \\ 0.5 & if & z=0 \\ 1 & if & z > 0\end{cases}
最理想的单位阶跃函数:y=⎩
⎨
⎧00.51ifififz<0z=0z>0
但单位阶跃函数是不连续的,我们希望找到在一定程度上接近单位阶跃函数的替代函数,并希望它单调可微,对数几率函数正是这样一个常用的替代函数,对数几率函数(又叫sigmod函数,logistic函数)
y = 1 1 + e − z y = \frac{1}{1+e^{-z}} y=1+e−z1
对于给定的输入实例 x x x,按照上述分布函数可以求得 P ( Y = 1 ∣ x ) 和 P ( Y = 0 ∣ x ) P(Y=1|x)和P(Y=0|x) P(Y=1∣x)和P(Y=0∣x) 。逻辑斯谛回归是比较两个条件概率值的大小,将实例 x x x 分到概率值大的那一类。
神经元多输出:
W
W
W 从向量扩展为矩阵,输出
W
∗
x
W*x
W∗x 则变成向量
在统计学里,多类别逻辑回归是一个将逻辑回归一般化成多类别问题得到的分类方法。用更加专业的话来说,它就是一个用来预测一个具有类别分布的因变量不同可能结果的概率的模型。
二项逻辑斯谛回归模型是二项分类模型,用于二分类问题中。可以将其推广到多项逻辑斯谛回归模型,用于多分类问题。假设离散型随机变量Y的可能取值集合是{1,2,…,K},那么多项逻辑斯谛回归模型是:
多项逻辑斯蒂回归又称为softmax回归,是二项逻辑斯蒂回归的推广,用于多类别分类。
梯度下降、损失函数
什么是梯度下降?
首先我们可以把梯度下降拆解为梯度+下降,那么梯度可以理解为导数(对于多维可以理解为偏导),那么合起来变成了:导数下降,那问题来了,导数下降是干什么的?这里我直接给出答案:梯度下降就是用来求某个函数最小值时自变量对应取值。
其中这句话中的某个函数是指:损失函数(cost/loss function),直接点就是误差函数。
损失函数就是一个自变量为算法的参数,函数值为误差值的函数。所以梯度下降就是找让误差值最小时候算法取的参数。
在机器学习中有一类算法就是产生一条曲线来拟合现有的数据,这样子就可以实现预测未来的数据,我们将这个算法叫做回归。
还有一类算法也是产生一条曲线,但是这条曲线用来将点分为两块,实现分类,我们将这个算法叫做分类。但是这面两种算法产生的拟合曲线并不是完全和现有的点重合,拟合曲线和真实值之间有一个误差。所以我们一般用损失函数的值来衡量这个误差,所以损失函数的误差值越小说明拟合效果越好。
简单理解:损失函数表示预测值与实际值之间的误差。
声明式编程介绍
越是声明式,意味着下层要做更多的东西,或者说能力越强。也意味着效率的损失。越是命令式,意味着上层对下层有更多的操作空间,可以按照自己特定的需求要求下层按照某种方式来处理。
实际上,这对概念应该叫做“声明式接口”和“命令式接口”。可能是因为它大部分时候是在谈论“语言”这种接口方式时才会用到,所以会叫做“声明式编程”和“命令式编程”。
当然,你也可以把它当成一种编程思想,也就是说,在构建自己的代码时,为了结构的清晰可读,把代码分层,层之间的接口尽量声明式。这样你的代码自然在一层上主要描述从人的角度需要什么;另一层上用计算机逻辑实现人的需要。
Anaconda 安装 Tensorflow
TensorFlow是学习深度学习时常用的Python神经网络框架。TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。
TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
它是谷歌基于DistBelief进行研发的第二代人工智能学习系统。2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源。
Anaconda 基本介绍
Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows 系统,提供了包管理与环境管理的功能,可以很方便地解决多版本 python 并存、切换以及各种第三方包安装问题。Anaconda利用工具 / 命令conda 来进行 package 和 environment 的管理,并且已经包含了Python和相关的配套工具。
Anaconda 重要组件 | 解释 |
---|---|
Anaconda Navigtor | 用于管理工具包和环境的图形用户界面,后续涉及的众多管理命令也可以在 Navigator 中手工实现。 |
Jupyter notebook | 基于web的交互式计算环境,可以编辑易于人们阅读的文档,用于展示数据分析的过程。 |
qtconsole | 可执行 IPython 的仿终端图形界面程序,相比 Python Shell 界面,qtconsole 可以直接显示代码生成的图形,实现多行代码输入执行,以及内置许多有用的功能和函数。 |
spyder | 使用Python语言、跨平台的、科学运算集成开发环境。 |
这里先解释下conda、anaconda 这些概念的差别。conda 可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。包管理与 pip 的使用类似,环境管理则允许用户方便地安装不同版本的 python 并可以快速切换。
Anaconda 则是一个打包的集合,里面预装好了conda、某个版本的 python、众多 packages、科学计算工具等等,所以也称为Python 的一种发行版。其实还有Miniconda,顾名思义,它只包含最基本的内容 python 与 conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda是一种选择。
conda将几乎所有的工具、第三方包都当做 package 对待,甚至包括 python 和 conda 自身!因此,conda 打破了包管理与环境管理的约束,能非常方便地安装各种版本 python、各种 package 并方便地切换。
安装 Anaconda Python 发行版
Anaconda官方网站:https://www.anaconda.com/
选择相应的Anaconda进行安装,进入Anaconda的官网,下载对应系统版本的Anaconda,官网现在的版本是 For Windows Python 3.9 • 64-Bit Graphical Installer • 594 MB。
就和安装普通的软件一样,全部选择默认即可,注意勾选将 python3.9 添加进环境变量。Advanced Options 都勾选。
稍等片刻即可安装成功,在 window 应用菜单可以找到,展示如下所示:
使用火狐浏览器打开 Jupyter notebook:
当上述操作执行完成之后,进行配置环境变量,新建 ANACONDA_HOME 环境变量,路径选为anaconda安装路径,在 Path 中添加三个环境变量:
%ANACONDA_HOME%\Scripts
%ANACONDA_HOME%
%ANACONDA_HOME%\Library\bin
验证:在cmd中输入 conda --version
,得到如下界面说明安装成功:
就要进行下一步的操作,安装 tensorflow,在Anacconda Prompt 或者 Anacconda PowerShell Prompt 中进行配置(毕竟命令行更有那味)
anaconda配置:打开cmd切换到国内的镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes
TensorFlow安装:这里建议安装tensorflow 1.15 的版本,需要安装其他版本的只需要在安装tensorflow的命令行中修改对应版本号即可。
打开cmd运行,首先创造 tensorflow 1.15 需要的环境(cmd 命令行 python -V 查看版本)
如何选择 tensorflow-cpu 和 tensorflow-gpu?
简而言之,就是你跑深度学习程序的时候用显卡跑还是内存跑;若是 你有显卡并且cuda支持,当然使用显卡跑了,会快很多,相应的就选择 tensorflow-gpu 版本,若是没有显卡或者cuda不支持你电脑的显卡,那只能用内存了,安装 tensorflow-cpu 版本。
安装 tensorflow 环境(gpu 版本)
conda create -n tensorflow_gpu pip python=3.9
然后再验证安装环境是否成功,输入conda info --envs
,出现 tensorflow_gpu
即为创建成功:
然后进行激活 TensorFlow 环境(在 Anaconda PowerShell Prompt 中启动 Tensorflow 环境)
activate tensorflow
注:当不使用 tensorflow 时,关闭 tensorflow 环境,命令为:deactivate
如果你不想要这个名为 tensorflow 的环境,就按照如下方法移除该环境:
conda remove -n tensorflow --all
若你安装的是 gpu 版本,还需要 cuda:CUDA Toolkit 10.0 Archive 安装地址:CUDA Toolkit 10.0 Archive
安装 tensorflow 环境(gpu 版本)
conda create -n tensorflow_gpu pip python=3.9
然后再验证安装环境是否成功,输入conda info --envs
,出现 tensorflow
即为创建成功。或者打开开始菜单 > Anaconda3 > Anaconda Navigator,点击左侧的 Environments,可以看到 tensorflow 的环境已经创建好了。
然后进行激活 TensorFlow 环境(在 Anaconda Prompt 中启动 Tensorflow 环境)
activate tensorflow
注:当不使用 tensorflow 时,关闭 tensorflow 环境,命令为:deactivate
pip 安装 cpu 版本 TensorFlow ,执行下面命令进行安装
pip install --upgrade --ignore-installed tensorflow
为什么使用 python -m pip 而不是 pip / pip3?
如果您是在 Windows 上运行,使用 python -m pip 还有一个额外的好处,那就是它可以让 pip 自我更新。基本上,当您执行 pip install --upgrade pip 时,系统会认为 pip.exe 正在运行,因此,Windows 是不会让您覆盖 pip.exe 的。
但是,如果您执行python -m pip install --upgrade pip,就可以避免这个问题,因为正在运行的是 python.exe,不是 pip.exe 应用。
至此为止,anaconda 的安装,tensorflow 的安装都已经成功完成。
测试 cpu 版本的TensorFlow
重新打开Anaconda Prompt >activate tensorflow >python来启动 tensorflow,并进入python环境。
TensorFlow 使用图 (Graph) 来表示计算任务;并使用会话(Session)来执行图,通过 Session.close() 来关闭会话(这是一种显式关闭会话的方式)。会话方式有显式和隐式会话之分。
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!') # 初始化一个TensorFlow的常量
sess = tf.Session() # 启动一个会话
print(sess.run(hello))
安装 Tensorflow 常见问题
2022-06-12 10:16:05.296405: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
解决办法:https://www.dll-files.com/cudart64_110.dll.html 网站上下载:cudart64_110.dll
下载完之后,需要把改文件解压,然后将cudart64_110.dll放在文件夹下C:\Windows\System32,现在的电脑大多是64位的,放在这个文件夹下应该可以解决问题。
在 Pycharm 编辑器中 配置 Tensorflow 环境的 python 编辑器:
在虚拟环境 venv 安装 tensorflow 2.0,然后进行测试:
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
hello = tf.constant('hello,tensorflow')
sess = tf.compat.v1.Session()
print(sess.run(hello))
2022-06-12 11:52:28.876334: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘nvcuda.dll’; dlerror: nvcuda.dll not found
解决办法:把相应的dll文件下载下来,将其放入C:\Windows\System32文件夹下即可。
怎么查看 TensorFlow 是 gpu 版本还是 cpu 版本?
from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())
假设tensorflow安装在D:\Anaconda3\Lib\site-packages\tensorflow环境里。
那么打开D:\Anaconda3\Lib\site-packages\tensorflow\python\platform\build_info.py这个文件,查看相应的需要安装 CUDA 和 cuDNN 版本。
机器学习基本介绍、引言
机器学习的实现必须依赖计算机程序,而计算机程序的运行需要有明确的变量和运行逻辑。因此,我们需要将机器学习的思想用计算机可实施的数学语言去表述。
机器学习的实质是,寻找一个合适函数,能够基于输入,输出人类想要的结果。
Define a set of function
机器学习的过程可以转化为一个“大海捞针”的选择过程。第一步,我们要先准备一个 function set(函数集合),这些函数有好有坏,而我们的目标函数应该在里面,只是不知道是哪一个。
Goodness of function
为了筛选出我们的目标函数,首先要确定什么是“好”。“好”的定义不同,目标函数自然也不同。对于不同的任务,“好”的定义是不同的,需要针对具体任务去建立评价方法(需量化)。
例如,对于有监督的分类任务,我们希望目标函数的对应输出和实际一致,如下所示:
如果一个函数,看到猴子图输出猴子,看到猫的图输出猫,那就是好的。如果一个函数看到狗却输出猴子或猫,那才是坏的。通过在训练样本中的识别正误记录,可以计算出函数的好坏程度。
Pick the best function
只是有一个能够决定 function 好坏是评价方法是不够的。因为 function set 有成千上万个候选的 function,所以我们需要一个有效率的演算法,可以快速从function set中挑出最好的。最好的function 一般被记为 f*,这个函数应当具备举一反三的能力(测试集性能也较高)
单神经元网络简单测试
搭建基本环境:采用 Jupyter Lab
Jupyter Lab 最新的基于 web 的交互式开发环境,适用于 notebook、code 和 data。其灵活的界面允许用户配置和设计数据科学、科学计算、计算新闻和机器学习领域的工作流。模块化设计可以轻松的实现更多扩展功能。
采用 Anaconda 启动 Jubyter lab:点击 Launch 即可启动,以计算机默认浏览器打开。
点击 File 选择 New > Notebook > 创建 ipynb 文件:
% config IPComleter.greedy = True
# 按 A 键增加 行,按 TAB 键盘 进行代码提示
简单案例测试
举例输入:[-1.0, 0.0, 1.0, 2.0, 3.0, 4.0];输出:[-3.0, -1.0, 1.0, 3.0, 5.0, 7.0]
from tensorflow import keras
import numpy as np
model = keras.Sequential([keras.layers.Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
xs = np.array([-1.0, 0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)
model.fit(xs, ys, epochs=500)
print(model.predict([10.0]))
运行结果:loss 越来越小,预测 10.0,预测值是:[18.976002]
更多推荐
所有评论(0)