本系列将分为 8 篇 。今天是第二篇 。主要讲讲 TensorFlow 框架的特点和此系列笔记中涉及到的入门概念 。
1.Tensor 、Flow 、Session 、Graphs
TensorFlow 从单词上可以分成 Tensor 和 Flow 两个单词 。Tensor 即张量 ,表明了其数据结构 ;Flow 翻译可理解为流 ,直观的表达了张量之间通过计算相互转化的过程 ;还有一个很重要的概念 Session ,即对话的概念 ,用于执行定义好的运算 。简单的理解 ,Flow 体现了 TF 框架的计算模型 ;Tensor 体现了 TF 框架的数据模型 ;二者可组织数据和定义相应的运算 ,并用图(graphs)表示计算任务 。图(graphs)中的节点称之为op(operation),一个op获得0个或多个Tensor 。而对话则是用于执行定义好的运算 ,即运算都是在 session 中执行的 。
上述介绍结构见下图 ,搭配起来就比较好理解了 。
值得一提的是运算的执行在会话中进行 ,如何进行有两种方式 ,一个是明确调用会话生成和关闭 。另一个是利用 with 上下文管理器 。这里建议利用 python 上下文管理器的机制 ,将所有的计算放在“with”内部即可 ,这样一来 ,当上下文管理器退出时候会自动释放所有资源 ,这样既解决了因为异常退出时资源释放的问题 ,还解决了忘记调用 session.close 函数产生的资源泄露 。上述介绍举例如下 :
2.loss function
首先得了解什么是代价函数 ,也可以是说是损失函数 。指的是一个可以衡量预测值和真实值差异的函数 ,具体形式可以有多种选择 。我们可以用 C(ω) 表示代价函数 ,根据其意义 ,不难理解代价函数有如下性质 :
常用的代价函数有如下几种 :
总的来说 ,我们在训练过程中 ,目标就是通过训练使得代价函数尽可能降低 ,从而使得预期输出和实际输出接近 。
3.欠拟合和过拟合
在我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个名词 。首先欠拟合是指模型没能较好的捕捉到数据特征 ,不能够较理想的拟合数据 ;相对的 ,过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了 ,导致在后期测试的时候不能够很好地识别数据 ,即不能正确的分类 ,模型泛化能力太差 。如下图所示(来源于吴恩达老师课程)
模型训练之初 ,往往是欠拟合的 ,所以我们才有进步空间 ,不断调整算法使得模型能够较好的拟合数据 。欠拟合的解决方法大体有下面几种思路 。
至于过拟合 ,可以想象一个很复杂的网络 ,包含参数相当的多 ,但是我们用于训练的数据却相对有限 。反复的训练之下 ,模型学习太过彻底 。如上图过拟合图中在训练集上十分精确 ,但是在测试集中却得不到较理想的结果 ,即模型的泛化能力很差 。常见的解决办法如下 :
本篇较为干燥 ,小詹自己写的都看不下去了 。但是上边提到的一些概念是本系列文章中会用得到的 ,比如过拟合的一些处理在 mnist 识别分类中就可以用上 。所以为了方便查看理解 ,还是枯燥一点写(读)下去吧 ,如果有纰漏 ,敬请批评指正 。