如何高效的学习 TensorFlow 代码

当前位置: &
980 次阅读 -
本文作者 Steven Dufresne,总结了新手学 TensorFlow 需要的核心知识点和实操内容,旨在鼓励更多人借 TensorFlow 迈入深度学习殿堂 。作为基础入门教程,该教程从 TensorFlow 原理简介讲到上手操作,对核心概念逐条解释,非常适合基础薄弱、苦无入门途径的新手。
Steven Dufresne:在90年代我开始写神经网络软件。TensorFlow开源后,一直十分渴望用它搭建一些有趣的东西。
谷歌的人工智能系统是现在的新热点。当TensorFlow可以被安装在树莓派上,操作变得非常容易。在上面我很快就搭建了一个二进制神经网络。这篇文章中,我将把经验分享给大家,帮助其他想要尝试、深入了解神经网络的人更快上手。
TensorFlow是什么?
引用TensorFlow官网的话,TensorFlow是一个“采用数据流图进行数值计算的开源软件库”。其中“数据流图”是什么意思?这是个很酷的东西。在正式回答之前,我们先谈谈一个简单神经网络的结构。
神经网络基础
一个简单神经网络由输入层(input units)、隐层(hidden units)、阈值(bias unit)、输出层(output units)几部分构成。输入层负责接收数据。隐层之所以这么叫是因为从用户的角度来看,它们是隐藏的。输出层输出我们获得的结果。旁边的阈值是用来控制隐含层和输出层的值是否输出(即超过阈值的神经元才能输出)。两两不同神经元之间的连接是权重,只是一些数字,需要靠训练获得。
训练神经网络,就是为了给权重找到最佳的值,这让神经网络一步步变得“智能”。在下面这个例子中,输入神经元的值被设置为二进制数字0,0,0。接下来TensorFlow会完成这之间的所有事情,而输出神经元会神奇得包含数字0,0,1。即便你漏掉了,它也知道二进制中000下面一个数是001,001接下来是010,就这样一直到111.一旦权重被设定了合适的值,它将知道如何去计数。
在运行神经网络中有一个步骤是将每一个权重乘以其对应的输入神经元,然后将乘积结果保存在相应的隐藏神经元。
我们可以将这些神经元和权重看作成数列(array),在Python中也被称为列表(list)。从数学的角度来看,它们都是矩阵。图中我们只绘制出了其中一部分,这里将输入层矩阵和权重矩阵相乘,得到五元素隐藏层矩阵(亦称为列表或数列)。
从矩阵到张量
在TensorFlow中,这些列表(lists)被称为张量(tensors)。矩阵相乘被称为操作(operation,也翻译作计算节点或运算),即程序员常说的op,阅读TensorFlow官方文件时会经常遇到。进一步讲,神经网络就是一堆张量、以及操作张量的 op 的集合,它们共同构成了神经网络图(graph)。
以下图片取自《TensorBoard, a tool for visualizing the graph》这篇文章,用于检测训练前后的张量值变化。张量是图中的连线,上面的数字代表张量的维度(dimensions)。连接张量的节点是各种操作(op),双击后可以看到更多的细节,比如后面一张图是双击后展现的第一层(layer 1)的细节。
最下面的X,是占位符操作,向输入张量赋值。沿着左边的线向上是输入张量(input tensor)。上面节点标着MatMul操作,使输入张量(input tensor)和权重张量(weight tensor,导向MatMul操作的另一条线)矩阵相乘。
所有这些只是为了更直观的展示出图、张量和操作是什么,让大家更好的理解为什么TensorFlow被称为是“采用数据流图进行数值计算的开源软件库”。但是,我们为什么要创建这些图呢?
为什么创建图?
当前,TensorFlow 只有 Python 的稳定 API,Python 是一门解释型语言。神经网络需要大量的运算,大型神经网络包含数千甚至数百万的权重,通过解释(interpret)每一步来计算的效率极低。
因此,我们通过创建一个由张量和 op 构成的图,包括所有的数学运算甚至变量的初始值,来描述神经网络的结构。只有在创建图之后,才能加载到TensorFlow里的Session。这被称为TensorFlow的“延迟执行”(deferred execution)。 Session通过高效代码来运行计算图。不仅如此,许多运算,例如矩阵相乘,都可以在GPU上完成。此外,TensorFlow也支持多台机器或者GPU同时运行。
创建二进制计数器图
以下是创建二进制计数器神经网络(binary counter neural network)的脚本,完整的代码可以在我的 GitHub 网页上找到。注意,在TensorBoard里还有其他的一些代码保存在其中。
下面我们将从这些代码开始创建张量和 op 组成的图。
首先导入 “tensorflow” 模块,创建一个 session 随后使用。同时,为了让脚本更容易理解,我们也创建了一些变量,包含了网络中的神经元个数。
然后,我们为输入和输出的神经元创建占位符(placeholders)。占位符是TensorFlow里一个操作,便于后续输入实际的数值。这里X和y_是图中的两个张量,每一个都有相关联的 placeholder 操作。
你可能会觉得奇怪,为什么我们要将占位符shape定义为二维列表[None,NUM_INPUTS]和[None,NUM_OUTPUTS],第一个维度都是”None”?从整体来看,神经网络有点像我们每次输入一个值,训练它生成一个特定输出值。但更有效率的方式是,一次提供多个输入\输出对(pair),这就是 batch 。上面shape中的第一维,是每个 batch 中有几组输入/输出对。创建一个 batch 之前我们并不知道里面有几组。实际上,后续我们将使用同一个图来进行训练、测试以及实际使用,所以 batch 的大小不会每次都相同。因此,我们将第一维的大小设置为 Python 占位符对象 ”None“。
接下来,我们创建神经网络图的第一层:将权重定义为W_fc1,阈值(或偏差)定义为b_fc1,隐层定义为h_fc1。这里”fc”意为“完全连接(fully connected)”的意思,因为权重把每一个输入神经元和每一个隐藏神经元连接起来。
tf.truncated_normal 导致了一系列操作和张量,将会把所有权重赋值为标准化的随机数字。
Variable 的操作会给出初始化的值,这里是随机数字,在后面可以多次引用。一旦训练完,也可以很方便的将神经网络保存至文件中。
你可以看到我们用 matmul 操作来执行矩阵乘法的位置。我们插入一个 add 操作来加入偏差权重(bias weights)。其中 relu 运算执行的就是“激活函数”(activation function)。矩阵乘法和加法都是线性运算。神经网络用线性运算能做的事非常少。激活方程提供了一些非线性。这里的relu激活函数,就是将所有小于0的值设置为0,其余值不变。不管你信不信,这为神经网络能够学习的东西打开了一扇全新的大门。
神经网络第二层中的权重和阈值与第一层设置的一样,只是输出层不同。我们再次进行矩阵相乘,这一回乘的是权重和隐层,随后加入偏差权重(bias weights),激活函数被留到下一组代码。
与上面的relu类似,Sigmoid是另一个激活函数,也是非线性的。这里我使用sigmoid函数,一定程度上是因为它能使最终输出值为一个0和1之间,对于二进制计数器而言是一个理想的选择。在我们的例子中,为了表示二进制111,所有的输出神经元都可以有一个很大的值。这和图像分类不同,后者会希望仅仅用一个输出单元来输出一个很大的值。举个例子,比如一张图像里有长颈鹿,我们会希望代表长颈鹿的输出单元输出相当大的值。这种情况下,用softmax函数作为激活函数反倒更适合。
仔细看下前面的代码,会发现似乎有些重复,我们插入了两次sigmoid。实际是我们创建了两次不同的、并行的输出。其中cross_entropy张量将被用来训练神经网络。而 results 张量则是后续用来执行训练过的神经网络,不管它被训练出来作何目的。这是目前我能想到的最好的方法。
最后一件事就是训练(training)。也就是基于训练数据调整所有的权重。记住,在这里我们仍然只是创建一个图。真正的“训练”发生在我们开始运行这个图的时候。
运行过程中供选择的优化器很多,这里我选取了 tf.train.RMSPropOptimizer。因为就像sigmoid一样,它比较适合所有输出值都可能较大的情况。而针对分类的情形,例如图像分类,用tf.train.GradientDescentOptimizer效果可能更好。
训练和使用二进制计数器
在完成创建图之后,就可以开始训练了。
首先,要准备一些训练数据:包括输入变量 inputvals 和目标变量 targetvals 。其中 inputvals 包含输入值,后者的每一个都有对应的 targetvals 目标值。例如,inputvals[0]即[0, 0, 0] ,对应的输出或目标值为targetvals[0] ,也就是 [0, 0, 1] 。
do_training和save_trained都可以硬编码,每次都可以进行更改,或者使用命令行参数进行设置。
首先使所有 Variable 操作对张量初始化;然后,将之前创建的图从底部到 train_step执行最多不超过 10001 遍;这是最后一个添加到图中的东西。我们将 inputvals和targetvals通过RMSPropOptimizer导入train_step操作。这就是通过调整权重,在给定输入值的情况下,让输出值不断接近目标值的步骤。只要输出值和目标值之间的误差足够小,小到某个能承受的范围,这个循环就会停止。
如果你有成百上千的输入/输出组,你可以一次训练一个子集,也就是前面提到的一批(batch)。但这里我们一共只有8组,所以每次都全放进去。
我们也可以将训练好的神经网络保存在一个文件(file)中,下次就不用再训练了。下次可以直接导入一个已经训练过的神经网络文件,文件中只包含进行过变量运算后的张量的值,而不包含整个图的结构。所以即便是执行已经训练好的图,我们仍然需要脚本来创建图形。MetaGraphs可以进行文件保存和导入图,但这里我们不这么做。
请注意,我们是从图形底部运行至结果张量(results tensor),在训练网络中不断重复的创建结果。
我们输入000,希望它返回一个接近001的值。然后将返回的值重复输入再次执行。这样总共运行9次,保证从000数到111有足够的次数,之后再次回到000。
以下就是成功训练后的输出结果。在循环中被训练了200次(steps)。在实际中,训练了10001次仍没有有效降低训练误差的情况非常罕见。一旦训练成功,训练多少次并不重要。
运行二进制计数器
前面说过,这里讲的二进制计数神经网络代码可以在我的Github主页上找到。你可以根据这些代码开始学习,或者观看TensorFlow官网上的其他入门教程。下一步,根据机器人识别物体上获取的灵感,我想通过它做一些硬件方面的研究。
注:转载文章均来自于公开网络,仅供学习使用,不会用于任何商业用途,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:contact@dataunion.org。转载数盟网站文章请注明原文章作者,否则产生的任何版权纠纷与数盟无关。
相关文章!
不用想啦,马上 发表自已的想法.
做最棒的数据科学社区
扫描二维码,加微信公众号
联系我们:&>&Tensorflow 实战Google深度学习框架(高清PDF)
Tensorflow 实战Google深度学习框架(高清PDF)
上传大小:96.7MB
第1章 深度学习简介 1
1.1 人工智能、机器学习与深度学习 2
1.2 深度学习的发展历程 7
1.3 深度学习的应用 10
1.3.1 计算机视觉 10
1.3.2 语音识别 14
1.3.3 自然语言处理 15
1.3.4 人机博弈 18
1.4 深度学习工具介绍和对比 19
第2章 TensorFlow环境搭建 25
2.1 TensorFlow的主要依赖包 25
2.1.1 Protocol Buffer 25
2.1.2 Bazel 27
2.2 TensorFlow安装 29
2.2.1 使用Docker安装 30
2.2.2 使用pip安装 32
2.2.3 从源代码编译安装 33
2.3 TensorFlow测试样例 37
第3章 TensorFlow入门 40
3.1 TensorFlow计算模型——计算图 40
3.1.1 计算图的概念 40
3.1.2 计算图的使用 41
3.2 TensorFlow数据模型——张量 43
3.2.1 张量的概念 43
3.2.2 张量的使用 45
3.3 TensorFlow运行模型——会话 46
3.4 TensorFlow实现神经网络 48
3.4.1 TensorFlow游乐场及神经网络简介 48
3.4.2 前向传播算法简介 51
3.4.3 神经网络参数与TensorFlow变量 54
3.4.4 通过TensorFlow训练神经网络模型 58
3.4.5 完整神经网络样例程序 62
第4章 深层神经网络 66
4.1 深度学习与深层神经网络 66
4.1.1 线性模型的局限性 67
4.1.2 激活函数实现去线性化 70
4.1.3 多层网络解决异或运算 73
4.2 损失函数定义 74
4.2.1 经典损失函数 75
4.2.2 自定义损失函数 79
4.3 神经网络优化算法 81
4.4 神经网络进一步优化 84
4.4.1 学习率的设置 85
4.4.2 过拟合问题 87
4.4.3 滑动平均模型 90
第5章 MNIST数字识别问题 94
5.1 MNIST数据处理 94
5.2 神经网络模型训练及不同模型结果对比 97
5.2.1 TensorFlow训练神经网络 97
5.2.2 使用验证数据集判断模型效果 102
5.2.3 不同模型效果比较 103
5.3 变量管理 107
5.4 TensorFlow模型持久化 112
5.4.1 持久化代码实现 112
5.4.2 持久化原理及数据格式 117
5.5 TensorFlow最佳实践样例程序 126
第6章 图像识别与卷积神经网络 134
6.1 图像识别问题简介及经典数据集 135
6.2 卷积神经网络简介 139
6.3 卷积神经网络常用结构 142
6.3.1 卷积层 142
6.3.2 池化层 147
6.4 经典卷积网络模型 149
6.4.1 LeNet-5模型 150
6.4.2 Inception-v3模型 156
6.5 卷积神经网络迁移学习 160
6.5.1 迁移学习介绍 160
6.5.2 TensorFlow实现迁移学习 161
第7章 图像数据处理 170
7.1 TFRecord输入数据格式 170
7.1.1 TFRecord格式介绍 171
7.1.2 TFRecord样例程序 171
7.2 图像数据处理 173
7.2.1 TensorFlow图像处理函数 174
7.2.2 图像预处理完整样例 183
7.3 多线程输入数据处理框架 185
7.3.1 队列与多线程 186
7.3.2 输入文件队列 190
7.3.3 组合训练数据(batching) 193
7.3.4 输入数据处理框架 196
第8章 循环神经网络 200
8.1 循环神经网络简介 200
8.2 长短时记忆网络(LTSM)结构 206
8.3 循环神经网络的变种 212
8.3.1 双向循环神经网络和深层循环神经网络 212
8.3.2 循环神经网络的dropout 214
8.4 循环神经网络样例应用 215
8.4.1 自然语言建模 216
8.4.2 时间序列预测 225
第9章 TensorBoard可视化 232
9.1 TensorBoard简介 232
9.2 TensorFlow计算图可视化 234
9.2.1 命名空间与TensorBoard图上节点 234
9.2.2 节点信息 241
9.3 监控指标可视化 246
第10章 TensorFlow计算加速 253
10.1 TensorFlow使用GPU 253
10.2 深度学习训练并行模式 258
10.3 多GPU并行 261
10.4 分布式TensorFlow 268
10.4.1 分布式TensorFlow原理 269
10.4.2 分布式TensorFlow模型训练 272
10.4.3 使用Caicloud运行分布式TensorFlow 282
小结 287...展开收缩
综合评分:0(0位用户评分)
所需积分:
下载个数:8
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有0条
审核通过送C币
东南大学 崇志宏:多模态大数据的认知计算(2)-应用中的典型问题 (暑期讨论班PPT和参考书)
创建者:chognzhihong_seu
人工智能之深度学习
东南大学 崇志宏:多模态大数据的认知计算(1)--联结主义套路 (暑期讨论班PPT和参考书)
创建者:chognzhihong_seu
上传者其他资源上传者专辑
如何学习 [美] 本尼迪克特·凯里 著 日出版
深阅读:信息爆炸时代我们如何读书(epub版本)
一页纸工作整理术(epub版本)日出版
一页纸创意思考术(epub版本)日出版
深度工作(epub版本)日出版
人工智能热门标签
VIP会员动态
前端开发重难点
17年软考最新真题及解析
物联网全栈开发专题
二十大技术领域优质资源
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
Tensorflow 实战Google深度学习框架(高清PDF)
会员到期时间:
剩余下载个数:
剩余C币:0
剩余积分:6726
积分不足!
资源所需积分
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站1200个资源免积分下载
资源所需积分
当前拥有积分
当前拥有C币
全站1200个资源免积分下载
资源所需积分
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站1200个资源免积分下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
Tensorflow 实战Google深度学习框架(高清PDF)TensorFlow(13)
目前TensorFlow代码已超过40w行,从代码量上来看,绝不是一个能够迅速上手的小项目。所以,想要精通TensorFlow的同学需要做好心理准备。
对于想要学习TensorFlow(以下简称TF)的人,根据目的不同,可以简单分为以下2类:1. 研究学者,仅仅需要TF这个平台实现深度学习算法,无需了解太多底层原理2. 好学的行业内人员(比如我⊙﹏⊙),不仅需要了解算法模型,同时还要熟悉TF平台的原理。在算子、通信、模型优化等方面进行平台的二次开发的人。研究学者:
你们可以考虑使用Keras,python写的深度神经网络库,已经实现了绝大部分神经网络,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各种激活函数。并且采用TF/Theano作为后端计算引擎,自己本身拥有一套更高层的API,可以同时跑在TF/Theano平台上。
相对于TF来说,这个学习压力小了很多,我们公司负责算法的同事也是用Keras来写模型,然后我再用TF的API来实现分布式部署。附:
开发人员:
对于我们这类人来说,首先需要弄清平台的很多名称、概念、定义, @贾扬清 曾说过TF有太多的Abstraction需要学习。诚然,这加大了我们的学习难度。但是,这也说明Google是想要把这个平台做大做强的,所以才会花时间去设计这一套框架和统一的结构。特别是读了部分源码后,更有这种感触。
那么,具体要怎么开始呢?
极客学院有翻译部分TF的官方文档,对于初步了解Tensor、DAG、Operator、Variable、Device、Optimizer等是帮助的。在看完这些概念后,有一个MNIST的例子程序作为TF的入门。这个样例用一个简单的Softmax实现了手写体数字识别的神经网络,只有一层参数。同时还介绍了Session、tf.placeholder、图的计算等重要概念。
在看完这个样例后,如果理解了DAG和Session,可以继续看用卷积神经网络实现的MNIST,准确率上升到了99%,相对于单层Softmax的92%左右,已经接近目前最高的准确率了。
TF v0.8发布了分布式模型,我也研究了将近1个月,才把Seq2seq机器翻译改造成了分布式,但是现在公司不让发布出来ORZ。好消息是,我改写了社区的MNIST分布式程序,并且已经合并到master分支了。所以,如果想要继续学习分布式的话,我建议可以看一下那份代码。比较遗憾的是,极客学院目前没有翻译分布式的教程,所以大家得移步TF官网(貌似被墙了)。
由于分布式的资料较少,我这里简单梳理下概念,大家在官网会看到他们的定义:
TF采用了PS/Worker的结构来定义集群,其中
PS(parameter server):存储variable(模型参数),主要负责参数更新和发放;
Worker:存储operator,主要负责图计算和梯度计算(TF使用Optimizer实现了自动化的梯度计算);
job:由于工作类型不同,用job_name来区分ps和worker
task:对于每个worker来说,具体做什么任务(算什么图)也有可能不同,用task_index区分
device:指具体的CPU/GPU,通常PS绑定到CPU上,Worker绑定到GPU上,各取所长。
syncReplicaOptimizer:同步优化器,其本质仍然是用普通优化器进行梯度计算,但是通过Queue机制和Coordinator多线程协同实现了所有worker的梯度汇总和平均,最终将梯度传回PS进行参数更新。
以上几个概念对于分布式的理解非常重要。当然,想要完全弄懂,还得不断的看文档和源码。源码我推荐几个python目录下非常值得看的基础类定义:
framework/Ops.py:定义了Tensor、Graph、Opreator类等
Ops/Variables.py:定义了Variable类
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12480次
排名:千里之外
原创:47篇
转载:23篇
(4)(18)(5)(4)(11)(4)(5)(1)(18)(3)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'1984人阅读
人工智能(4)
转自:/question/?sort=created
如题,或者如何掌握TensorFlow,应用到任何领域?
相关问题:
按时间排序
Google发布了Tensorflow游乐场。Tensorflow是Google今年推出的机器学习开源平台。而有了Tensorflow游乐场,我们在浏览器中就可以训练自己的神经网络,还有酷酷的图像让我们更直观地了解神经网络的工作原理。今天,就让硅谷周边带你一起去Tensorflow游乐场快乐地玩耍吧!
昨天,Google深度学习部门Google Brain的掌门人,也是Google里受万众景仰的神级别工程师Jeff Dean,在Google Plus上发布了Tensorflow游乐场的消息:
于是小伙伴们都十分激动地去Tensorflow的网站上玩神经网络了!游乐场的地址是:。让我们快点一起去看看游乐场里有哪些好玩的东东吧。
一打开网站,就看见上面的标语:
“在你的浏览器中就可以玩神经网络!不用担心,怎么玩也玩不坏哦!”
这简直太令人振奋了!面对这么多可以随便点的按钮,咱们从哪儿开始呢?
首先让我们来看看数据。在这个游乐场中,我们有4种不同形态的数据可以玩:
每组数据,都是不同形态分布的一群点。每一个点,都与生俱来了2个特征:x1和x2,表示点的位置。而我们数据中的点有2类:橙色和蓝色。我们的神经网络的目标,就是通过训练,知道哪些位置的点是橙色、哪些位置的点是蓝色。
如果橙色是橙子,蓝色是蓝莓。假设我们有2000个散落在各处的橙子和蓝莓。前1000个,我们知道坐标(1,1)的是蓝莓,(2,2)的是橙子,(0.5,0.5)的是蓝莓等等。我们要用这些信息来训练我们的神经网络,让它能够准确地预测出后1000个哪些是橙子、哪些是蓝莓。
看上面的4组数据,我们会发现,前3中都能相对简单地区分开,而最后一组螺旋数据会是最难的。
Tensorflow游乐场中的数据十分灵活。我们可以调整noise(干扰)的大小,还可以改变训练数据和测试数据的比例多少。下图是不同noise的数据分布。
当我们把每一个数据点的信息喂给机器学习系统时,我们需要做feature extraction,也就是特征提取。如果我们真的是在区分蓝莓和橙子的话,大小、颜色等等都会是我们的特征。而这里,每一个点都有x1和x2两个特征。除此之外,由这两个特征还可以衍生出许多其他特征:
抽象来说,我们的机器学习classifier(分类器)其实是在试图画一条或多条线。如果我们能够100%正确地区分蓝色和橙色的点,蓝色的点会在线的一边,橙色的会在另一边。
上面这些图其实非常的直观。第一张图中,如果x1作为我们的唯一特征,我们其实就是在画一条和x1轴垂直的线。当我们改变参数时,其实就是在将这条线左右移动。其他的特征也是如此。
很容易可以看出,我们需要智能地结合这其中一种或多种的特征,才能够成功地将蓝色点和橙色点分类。这样的feature extraction,其实往往是机器学习应用中最难的部分。好在我们有神经网络,它能够帮我们完成大部分的任务。
如果我们选定x1和x2作为特征,我们神经网络的每一层的每个神经元,都会将它们进行组合,来算出结果:
而下一层神经网络的神经元,会把这一层的输出再进行组合。组合时,根据上一次预测的准确性,我们会通过back propogation给每个组合不同的weights(比重)。这里的线越粗,就表示比重越大:
下面就让我们用最难的螺旋形数据,来试试这个神经网络的表现吧!
在神经网络出现前,我们往往会竭尽所能地想出尽可能好的特征,把它们全都喂给系统。而系统会是个十分浅的系统,往往只有一层。用这样的方法来完成分类。
让我们先来实验传统的方法。在这里,我们将所有能够想到的7个特征都输入系统,并选择只有1层的神经网络:
最后的结果是这样的,可以看出我们的单层神经系统几乎完美地分离出了橙色点和蓝色点:
接下来,让我们来体验神经网络真正的魔法。神经网络最大的魔力,就在于我们根本不需要想出各种各样的特征,用来输入给机器学习的系统。我们只需要输入最基本的特征x1, x2, 只要给予足够多层的神经网络和神经元,神经网络会自己组合出最有用的特征。
在这次试验中,我们只输入x1, x2,而选择1个6层的,每层有8个神经元的神经网络:
最后的结果是这样的。我们发现,通过增加神经元和神经网络的层数,即使没有输入许多特征,我们也能够成功地分类:
神经网络的伟大之处就在于此。当我们在解决分类橙色点和蓝色点这样的简单问题时,想出额外的特征似乎并不是难事。但是,当我们要处理的问题越来越复杂,想出有用的特征就变成了最最困难的事。比如说,当我们需要识别出哪张图片是猫,哪张图片是狗时,哪些特征是真正有效的呢?
而当我们有了神经网络,我们的系统自己就能学习到哪些特征是有效的、哪些是无效的,这就大大提高了我们解决复杂机器学习问题的能力,简直是太酷啦!
看了以上的文章,你是不是对神经网络有了更直观的认识呢?好奇的小伙伴们,欢迎去自己试试看,真的非常好玩!
&(二维码自动识别)
&&o&&o&&o&
反对,不会显示你的姓名
在学习TF的过程中,这本英文书我已经翻译成中文版了,欢迎交流学习
&&o&&o&&o&
反对,不会显示你的姓名
tensorflow 是一个非常不错的工具,但是要理清楚对于新手还是有点困难的~可以去听一下极视角本周四晚上的免费线上分享,有对tensorflow的相关介绍以及如何利用好这个工具给出相关建议。
&&o&&o&&o&
反对,不会显示你的姓名
我整理了TensorFlow 和深度学习的同步学习资料&
&&o&&o&&o&
反对,不会显示你的姓名
推荐一个大赛,最近是有蛮多做TF的同行在报名的,据说还有udacity的优惠券,大家可以试试
&&o&&o&&o&
反对,不会显示你的姓名
默默收藏和加关注的,为什么不点赞啊→_→
作为TensorFlow社区的contributor (41/415),我来说说我的TensorFlow学习过程。
目前TensorFlow代码已超过40w行,从代码量上来看,绝不是一个能够迅速上手的小项目。所以,想要精通TensorFlow的同学需要做好心理准备。
http://cloc.sourceforge.net v 1.64
T=45.33 s (68.5 files/s, 14956.6 lines/s)
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
C++
C/C++ Header
TypeScript
Bourne Shell
NAnt script
Protocol Buffers
Objective C++
Bourne Again Shell
Javascript
Objective C
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
对于想要学习TensorFlow(以下简称TF)的人,根据目的不同,可以简单分为以下2类:
1. 研究学者,仅仅需要TF这个平台实现深度学习算法,无需了解太多底层原理
2. 好学的行业内人员(比如我⊙﹏⊙),不仅需要了解算法模型,同时还要熟悉TF平台的原理。在算子、通信、模型优化等方面进行平台的二次开发的人。
研究学者:
你们可以考虑使用Keras,python写的深度神经网络库,已经实现了绝大部分神经网络,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各种激活函数。并且采用TF/Theano作为后端计算引擎,自己本身拥有一套更高层的API,可以同时跑在TF/Theano平台上。
相对于TF来说,这个学习压力小了很多,我们公司负责算法的同事也是用Keras来写模型,然后我再用TF的API来实现分布式部署。
开发人员:
对于我们这类人来说,首先需要弄清平台的很多名称、概念、定义,&&曾说过TF有太多的Abstraction需要学习。诚然,这加大了我们的学习难度。但是,这也说明Google是想要把这个平台做大做强的,所以才会花时间去设计这一套框架和统一的结构。特别是读了部分源码后,更有这种感触。
那么,具体要怎么开始呢?
极客学院有翻译部分TF的官方文档,对于初步了解Tensor、DAG、Operator、Variable、Device、Optimizer等是帮助的。在看完这些概念后,有一个MNIST的例子程序作为TF的入门。这个样例用一个简单的Softmax实现了手写体数字识别的神经网络,只有一层参数。同时还介绍了Session、tf.placeholder、图的计算等重要概念。
在看完这个样例后,如果理解了DAG和Session,可以继续看用卷积神经网络实现的MNIST,准确率上升到了99%,相对于单层Softmax的92%左右,已经接近目前最高的准确率了。
TF v0.8发布了分布式模型,我也研究了将近1个月,才把Seq2seq机器翻译改造成了分布式,但是现在公司不让发布出来ORZ。好消息是,我改写了社区的MNIST分布式程序,并且已经合并到master分支了。所以,如果想要继续学习分布式的话,我建议可以看一下那份代码。比较遗憾的是,极客学院目前没有翻译分布式的教程,所以大家得移步TF官网(貌似被墙了)。
由于分布式的资料较少,我这里简单梳理下概念,大家在官网会看到他们的定义:
TF采用了PS/Worker的结构来定义集群,其中
PS(parameter server):存储variable(模型参数),主要负责参数更新和发放;
Worker:存储operator,主要负责图计算和梯度计算(TF使用Optimizer实现了自动化的梯度计算);
job:由于工作类型不同,用job_name来区分ps和worker
task:对于每个worker来说,具体做什么任务(算什么图)也有可能不同,用task_index区分&
device:指具体的CPU/GPU,通常PS绑定到CPU上,Worker绑定到GPU上,各取所长。
syncReplicaOptimizer:同步优化器,其本质仍然是用普通优化器进行梯度计算,但是通过Queue机制和Coordinator多线程协同实现了所有worker的梯度汇总和平均,最终将梯度传回PS进行参数更新。
以上几个概念对于分布式的理解非常重要。当然,想要完全弄懂,还得不断的看文档和源码。
源码我推荐几个python目录下非常值得看的基础类定义:
framework/Ops.py:定义了Tensor、Graph、Opreator类等
Ops/Variables.py:定义了Variable类
最后,欢迎大家Follow我的Github账号:
&&o&&o&&o&
反对,不会显示你的姓名
如果你已经对基础知识,比如激活函数,卷积操作等有了了解,最直接有效的方法是看它提供的MINIST例子,然后一边看它的其它model的实现源码,一边自己上手写一些例子实践一下。
个人感觉学习编程最好的方式就是:上来就是干。Talk is cheap, show me the code !
&&o&&o&&o&
反对,不会显示你的姓名
推荐看这个系列视频教程, 有Tensorflow一整套的从入门到较高级运用的详细讲解.&
1. Tensorflow 的基本结构, 用法;&
2. 多层神经网络 (回归 & 分类);&
3. CNN 卷积神经网络;&
4. RNN 循环神经网络;&
5. LSTM 高级循环神经网络;
6. Autoencoder 神经网络的非监督学习;
7. 可视化助手 Tensorboard (查看学习结果, 参数变化, 神经网络结构) 等等.
教程还附加了所需要的代码, 可以用于练习, 是新手快速上路必看的教程. 有了视频里生动的形容, 比文字叙述上手快多了. 听说很多人都是一晚上通宵看完的~ 大家一起加油吧!
系列教程视频 Youtube 接口:&
优酷接口:&
刚制作了 Tensorflow 视频教程对应的学习目录:&视频和辅助材料都很好的对应上了.
频道还会一直有新的关于机器学习的内容不定时更新.
&&o&&o&&o&
反对,不会显示你的姓名
自己实现一篇paper会事半功倍的
&&o&&o&&o&
反对,不会显示你的姓名
我是这样学习的,个人比较关注cv这块的内容,所以我会去看看一些经典的cv模型,比如alexnet,googlenet,vgg,deep residual network等等,然后我会去找找相关的tensorflow的代码实现,在读完paper后,去看相关的代码结构,发现很容易,也更能理解paper,还有一些比较火的cv的应用的例子,我都会去看看相关的paper,如果没有基于tensorflow的源码,我会去自己尝试去写下,这样学起来更优针对性,也更有意思
博客里有一些相关链接, 是个人读paper和学习tensorflow的时候做的笔记:
&&o&&o&&o&
反对,不会显示你的姓名
讲真还是谷歌家的教程最好,一个是 Udacity上的Deep learning教程,一个是Youtube上的Machine learning教程,可以到这个Github查看相应的笔记:
&&o&&o&&o&
反对,不会显示你的姓名
看看这个,希望有帮助:
&&o&&o&&o&
反对,不会显示你的姓名
tensorflow已经过气啦。自己不会写不要紧。赶紧照着我的教程造一个还来得及。&提前为你讲解2017年主流深度学习框架的核心技术&不知道比tensorflow高到哪里去了。垃圾tensorflow名字里都有tensor了,结果连个rank都没有。
&&o&&o&&o&
反对,不会显示你的姓名
我在blog中总结了学习路线,针对新手。
文中的教程或者blog以及论文书籍基本上都是经典,推荐入门学习。
贴在这里:
在学习Tensorflow的过程中磕磕碰碰,总结一些个人心得记录于此,志同道合之友共勉~~
1.稳定的网络:Tensorflow毕竟出自Google,官方文档访问不是很稳定。而且一般来说,对于英文的文档,资料和疑问,Google搜索的结果要比Baidu好很多。(不是偏见,是各有所长,天气地图电影啥的,百度还是做的很好的)
2.Github:这是个开源程序的,Linux内核就在这个网站托管。Github的核心是Git,一种版本控制系统,已经逐渐取代SVN。这个网站托管了很多高质量的或者说世界顶尖的开源项目,比如Tensorflow。学习一下这个网站如何使用,注册个账号,学习一下Git的使用方法。这个网站有自己的tutorial和guide。
3.Linux: Tensorflow的主要运行平台就是Linux,目前在Windows上运行的方案是虚拟机,但是深度学习对计算要求还是比较高的,虚拟机效率不是太高,因此还是推荐在原生Linux中运行。新手推荐发行版是&或者。这个可以自行搜索。学习Linux也有很多好处,因为很多开源软件都only linux的。
4.Python:这是一种非常流行的脚本语言,庞大的第三方库可以快速写出短小容易理解的代码,而且也是Tensorflow的推荐开发语言。教程太多了,这里给几个优秀的教程:,,
5.深度学习(Deep Learning,DL):虽然Tensorflow已经封装好了大部分DL的细节,但是如果不了解DL的相关核心概念,就会很难着手分析问题。首先强烈推荐,通读一遍,然后还有,可以快速浏览或者只看自己不太明白的地方,还有分块介绍的,还有几篇blog,和讲的是卷积神经网络。图像识别用的比较多的就是卷积神经网络,这两篇可以看看。
6.Tensorflow:前面都是铺垫,是为了更好地使用。官方的文档不错,可以从get
started然后tutorial看起,有个中文的,但是更新不及时(官方已经v0.11,这个可能是v0.8或者v0.7),可能有坑,可以和英文对照着看,还有个Tensorflow的,也不错。有篇也不错。
7.优秀博客:,,,,这几个都是我在学习中遇到的非常nice的blog,有时间读读定会有所收获。
8.经典论文及书籍:收集了一些DL的经典论文&书籍,有些杂乱,不过几乎都是经典,各取所需吧。(密码:
4w91)。各位有更好的欢迎推荐,我会整理上传。
9.几篇原创TF相关文章(持续更新):,
其中,Python,DL,Tensorflow是重点,其他都是辅助, 自己感觉够用即可,无需深入。学习中遇到困难首先向搜索引擎询问。
更新:更新了提及的软件版本号,添加了第九部分原创TF相关博文
更新:更新了提及的软件版本号
更新:重新排版,上传了资料
更新:重新排版
&&o&&o&&o&
反对,不会显示你的姓名
&&o&&o&&o&
反对,不会显示你的姓名
可以看这里翻译的教程哦&
本文写给机器学习和tensorflow的初学者。如果你已经知道mnist,softmax(multinomial logistic)regression,你可以会想看这个.不过,首先得确认你已经&&.
初学编程,一般都会学习写一个“hello world!”的程序,MNIST就相当于机器学习领域的“hello world!”
MNIST是一个机器图像数据集。它包含像下面的一些手写的数据图像:
它还包括了每个图像的数字标签。例如,上面的图片的标签是 5、0、 4 和 1。
在本教程中,我们要训练一个模型来识别图像并预测他们是什么数字。我们的目标不是训练一个真的精准的模型,达到极强的性能 — — 虽然我们以后会给你代码来做到 !— — 而是要以之为引字让大家初步了解如何使用TensorFlow。因此,我们要开始与一个非常简单的模型,称为 Softmax 回归。
在本教程中的实际代码是非常短的和所有有趣的事情发生只需要三行代码。然而,了解其背后的理念很重要 ︰ TensorFlow 的工作原理和核心机器学习的概念。正因为如此,我们要非常认真地学习这些代码。
The MNIST Data
MNIST 数据网站上。为了方便,我们已经包括一些
python 代码来自动下载并安装数据。你可以要么下载的代码和将其导入如下,或简单地复制并粘贴它。
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(&MNIST_data/&, one_hot=True)
下载数据分割成三个部分,55,000 的数据点的训练数据 (mnist.train)、 10000 个点的测试数据 (mnist.test) 和 5000 点的验证数据 (mnist.validation)。这种分割是非常重要 ︰ 机器学习中测试数据非常重要,通过它我们才可以验证学到的知识是可以泛化的 !
正如前面提到的每个 MNIST 数据点有两个部分 ︰ 图像的手写的数字和相应的标签。我们将调用图像&xs&和标签&ys&。训练集和测试集包含 x 和 y 们,例如训练图像是&&训练的标签是&。
每个图像是 28 x 28 像素。我们可以把这解读为一大系列的数字 ︰
我们可以把这些数据变成一个 28 × 28 = 784 矢量数组。我们如何拼合数组并不重要,只要所有的图像都一致。从这个角度来看,MNIST 图像都只是一堆784三维向量空间,有很丰富结构 (警告 ︰ 计算密集型的可视化效果)。
扁平数据扔掉图像的二维结构有关的信息。不会很糟糕吗?嗯,最好的计算机视觉方法会利用这种结构,我们将在以后的教程中提到。我们在这里用到的简单方法,使用 softmax 回归,则不会关注这些结构。
其结果是,&是一个形状
[5]的张量(n 维数组)。第一维是图像和第二个维度是每个图像的像素。在张量的每个条目是 0 和 1 之间,为某个特定的图像中像素点的像素强度。
MNIST 中的相应标签是数字 0 至 9,描述给定的图像是哪个数字。出于本教程的目的,我们要想我们作为一个&one-hot&的标签。one-hot矢量是一个由多个0和一个1组成的向量。在这种情况下,第 n 个数字将被表示为一个向量中第 n 个元素为1。例如,3 将是[0,0,0,1,0,0,0,0,0,0]。这样,&是
[55000,10]阵列的浮点数。
现在我们就可以真正开始建立我们的模型了!
Softmax Regressions
我们知道,在 MNIST 中的每个图像是一个数字,无论是零或九。我们想要能够通过一张图片,给它是每个数字的概率。例如,我们的模型可能看到了九的图片并给出 80%的概率它是一个九,但给出它可以是5%是八的可能性 (因为顶层循环) 和极小的概率它可能是所有其他数字。
这是一个经典的案例,其中 softmax 回归是一个自然、 简单的模型。如果你想要将概率分配给一个或者几个不同的可能时,softmax 就可以完成这样的事情。甚至后来,当我们训练更复杂的模型,最后一步也将是softmax一层。
Softmax 回归有两个步骤 ︰ 首先我们要把这些输入的特征加起来,然后我们将这些特征转换成概率。
为了总结了给定的图像的特征,我们把这些像素强度做加权求和。权重的大小表明该特征在确定它为正确分类时候的作用大小。
下面的关系图显示了学到的每个类的权重一个模型。红色代表负的权重,而蓝色表示正的权重。
We also add some extra evidence called a bias. Basically, we want to be able to say that some things are more likely independent of the input. The result is that the evidence for a class i given an input x is:
我们还添加了一些额外的证据,被称为一种偏见。基本上,就指独立于输入的特征。结果是对于i这一类据,我给出了输入 x,结果就是︰
evidencei=∑jWi, jxj+bi
其中Wi是权重,bi是类i的偏见,,j是输入x像素。我们可以通过softmax函数把这些变成预测的概率如下:
y=softmax(evidence)
这里 softmax 担任&激活&或&链接&的功能,把我们的线性函数输出变成我们想要的结果 — — 在这种情况下,概率分布为 10 例。你可以认为它是把输入的证据转换成可能是某一类的可能性。它被定义为 ︰
softmax(x)=normalize(exp(x))
展开方程你会得到如下的公式:
softmax(x)i=exp(xi)/∑jexp(xj)
通常以第一种方式看 softmax︰指数化输入,然后正则化输出。指数化意味着更多的输入特征会指数级增加其权重。相反,较少单元特征会让假设中获得其权重的一小部分。假设分类不会有0或者负的权重。Softmax然后正则化这些权重,以便他们相加为一,形成一个有效的概率分布。(若要了解更多关于softmax 函数的内容,参见&&它迈克尔
· 尼尔森书,完整的交互式可视化中一节)。
你能想象 softmax 回归作为类似下面的内容,虽然现实中会有更多的 xs。对于每个输出,我们计算 xs 的加权的和,添加一个bias,然后应用 softmax。
如果把它写成方程,就可以得到 :
然后我们可以把这个过程“标量化”,变成矩阵相乘和向量相加。这会让计算更加快速。(也是一种简化思考的方法)
更加简化一下,我们可以把它写成:
y=softmax(Wx+b)
要在Python中做到快速数值计算,我们通常使用像 NumPy 做矩阵乘法,然后使用python之外的另一种语言实现的高效代码的库。不幸的是和Pyhton操作的切换间仍有很大的开销。这种开销是尤其糟糕,如果你想要在 Gpu 上或以分布式的方式运行。这种方法下数据传输的成本会比较高。
TensorFlow 也是在 python之外做这些繁重的计算,但它更进一步,从而避免这种开销。不是用python以外的语言独立运行单个昂贵的操作,TensorFlow让我们通过图描述的方式完全从外部运行python的交互操作。(可以在几个机器学习库中看到像这样的方法)。
若要使用 TensorFlow,我们需要将其导入。
import tensorflow as tf
这些交互式的操作需要符号变量。我们先来创建一个:
x = tf.placeholder(tf.float32, [None, 784])
x并不是一个特定的值,它是一个placeholder,一个我们需要输入数值当我们需要tensorflow进行运算时。我们想要输入任意数量的mnist图片,每一个都展开成一个784维的向量。我们用一个二维的[None, 784]浮点张量代表。 (这里的None表示维度可以是任意的长度.)
我们的模型中也需要权重和bias。我们可以把它们看成是额外的输入,Tensorflow有更加好的方法来表示它: Variable. Variable是一个Tensorflow图交互操作中一个可以修改的张量。 它可以在计算中修改。对于机器学习的,一般都有一些Variable模型参数。
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
我们通过给 tf.Variable 来创建这些变量。下面这种情况,我们将初始化 W 和 b 为全零的张量。因为我们将要学习 W 和 b,所以他们初始值是什么都没关系。
注意,W 的形状 [784,10] ,是因为我们想要 784 三维图像向量乘以它输出10 维向量以标识的不同类。b形状是 [10],这样我们可以将其和输出相加。
现在,我们可以实现我们的模型。它只需要一行代码 !
y = tf.nn.softmax(tf.matmul(x, W) + b)
首先,我们通过tf.matmul (x,W)来把x和W相乘。这和我们的方程中看到的顺序是相反的,在那里面是Wx。然后加上b,最后应用&。
就是这样。我们只花了一行代码来定义我们的模型。不是因为 TensorFlow 旨在简化 softmax 回归︰ 它只是想通过非常灵活的方式来描述很多各种各样的数值计算,从机器学习模型到物理模拟。定义后,可以在不同的设备上运行我们的模型︰您的计算机的CPU、Gpu、甚至手机 !
为了训练我们的模型,我们需要定义怎么样的模型才是好的。嗯,实际上,在机器学习中我们通常会为模型定义怎么样是坏的称为成本或损失,然后再试,尽量最小化这个成本或者损失。但两者是等同的。
一个很常见的很好的成本函数是&cross-entropy交叉熵&。出人意料的是,交叉熵虽然产生于对信息压缩码信息理论的思考,但它最终被在很多方面,从赌博到机器学习。它的定义是︰
Hy′(y)=-∑iyi′log(yi)
这里y是我们预测的概率分布,而y′ 是真正的分布(那个我们要输入的one-hot标题).某种理解下,交叉熵可以衡量我们的预测是多少的低效。本文不会更加详细地深入交叉熵,但它很值得去理解-&&.
为了使用交叉熵,我们要先增加一个新的placeholder来放正确的结果:
y_ = tf.placeholder(tf.float32, [None, 10])
然后设置交叉熵, -∑y′log(y):
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
首先,tf.log 计算 y 的每个元素的对数。接下来,我们把y_乘以tf.log(y) 的相应元素的每个元素。然后 tf.reduce_sum y。最后,tf.reduce_mean 在批处理中计算所有示例平均值。
现在,我们知道我们想要我们的模型做什么,它是很容易通过 TensorFlow 去训练它。因为TensorFlow 了解整个图的计算,它可以自动使用反向传播算法有效地确定你的变量是如何影响成本函数并把它最小化。然后,它可以应用您所选择的优化算法来修改变量和降低成本函数。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
本例子中,我们通过TensorFlow使用学习率为 0.5的梯度下降算法尽量减少 cross_entropy 。梯度下降是一个简单的程序,其中TensorFlow 会调整每个变量点从而使之向降低成本的方向运动。但 TensorFlow 还提供了许多其它优化算法︰使用它简单到只需要一行代码。
TensorFlow 实际上做什么在这里,在幕后,是它向你执行反向传播和梯度下降的图表添加新操作。然后它给你回到单个操作,当运行时,会做一步的梯度下降法训练,微调一下您的变量,以降低成本。
现在,我们设置好了我们的模型。最后一件事在我们启动它之前,我们要添加一个操作来初始化我们创建的变量︰
init = tf.initialize_all_variables()
现在我们可以启动一个会话,然后运行初始化变量的操作:
sess = tf.Session()
sess.run(init)
训练走起来-- 我们要进行1000次这样的训练!
for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
Each step of the loop, we get a &batch& of one hundred random data points from our training set. We runtrain_step feeding in the batches data to replace the placeholders.
Using small batches of random data is called stochastic training -- in this case, stochastic gradient descent. Ideally, we'd like to use all our data for every step of training because that would give us a better sense of what we should be doing, but that's
expensive. So, instead, we use a different subset every time. Doing this is cheap and has much of the same benefit.
在循环的每一步,我们从我们的训练集得到一百随机数据点&批处理&。我们运行 train_step 批次的数据来替换占位符。
使用随机数据进行小批量称为随机训练 — — 在这种情况下,随机的梯度下降法。理想情况下,我们想使用我们所有的数据训练的每一步,因为这会给我们感觉是更好的方法,但这样代价太大。相反,每次我们使用一个不同的子集,这样做代价更小而且可以达到相同的效果。
How well does our model do?
Well, first let's figure out where we predicted the correct label. tf.argmax is an extremely useful function which gives you the index of the highest entry in a tensor along some axis. For example, tf.argmax(y,1) is the label our model thinks is most likely
for each input, while tf.argmax(y_,1) is the correct label. We can use tf.equalto check if our prediction matches the truth.
我们的模型表现如何呢?
好吧,先让我们弄清楚我们预测正确的标签在哪里。tf.argmax 是项的极其有益的函数,它给返回在一个标题里最大值的索引。例如,tf.argmax(y,1) 是我们的模型输出的认为是最有可能是的那个值,而 tf.argmax(y_,1) 是正确的标签的标签。如果我们的预测与匹配真正的值,我们可以使用 tf.equal来检查。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
这会返回我们一个布尔值的列表.为了确定哪些部分是正确的,我们要把它转换成浮点值,然后再示均值。 比如, [True, False, True, True] 会转换成 [1,0,1,1] ,从而它的准确率就是0.75.
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
最后我们在测试数据上求准确率的值:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
应该会是大约 92%.
这样的结果是不是已经很好了呢?好吧,并不是真的。事实上,它糟糕透了。这是因为我们使用的一个非常简单的模型。一些小的变化,我们实事上可以达到 97%的准确率。最好的模型可以到达 99.7%以上精度 !(有关详细信息,看一看这结果列表-&&)。
然而重要的是我们学会了使用这个模型。不过,如果你对于这个结果还是不太满意,查阅我们通过一个教程和学习如何通过TensorFlow构建更复杂的模型,它会达到更高的精度哦!
欢迎访问网站:
欢迎关注微信号:奇趣儿beta
欢迎扫描二维码:
&&o&&o&&o&
反对,不会显示你的姓名
回来补充下,给一个学习线路:
再补充一点,参与TensorFlow源码开发,社区非常愿意接受Github Pull-request&
&&o&&o&&o&
反对,不会显示你的姓名
入门最佳拿好不谢
update ###
由于一直做的是文本,基于图像数据的项目都没怎么仔细看过,昨天完整读了官方[cifar10]()整个项目的代码,惊觉这不就是完美的tensorflow项目架构吗!
因此,对于已经看过一定tf代码的童鞋,一定要看官方cifar10的整个项目逻辑。醍醐灌顶,非常有帮助。
至于为什么是先看过一定代码,原因是只有看了很多项目组织代码的烂方式后,才能发现这其中的精妙所在呀!
&&o&&o&&o&
反对,不会显示你的姓名
可以自己从源码来部署一遍。
然后就是从简单的例子开始学习。
我主要再用mxnet,拿这两者来比较,从比较中可以学到不少东西。
tf和mxnet架构极为相似,或者说是英雄所见略同吧
&&o&&o&&o&
本来都忘了这个问题了,不过看到很多人也在关注,也是开森。
我补充一个连接:&&这个是Udacity
谷歌给的deep learning 课程,代码就在tensorflow源码里面。几个作业很有趣。课程画风很可爱,主要是跟着官方Tensorflow的习惯来的,讲解理论的时候会比较照顾得到,比如CNN部分的padding什么的命名都是严格按照TF方法里的标准。
不过建议大家不要把这门课用来入门上手,理论部分讲解的可能不适合入门级。作业代码可能也需要花点时间去理解。
我也放个blog地址,初学者欢迎大家交流评论:
-----再次更新-----
听说大天朝对tf的官网有限制,所以这里有一个中文网站&
不过鉴于TF官方一直在更新,中文翻译可能相对落后。有跟去年就开始使用tf的朋友聊过,他说现在看官方的代码和以前他学习的时候有点不一样了。所以还是尽量多去官网看。
另外,在学习官方tutorial的时候,有些方法在API里没有找到,师兄的建议是要去源码里看。比如LSTM那里,所有的gate都隐藏在cell方法里,要找到进去看才会理解吧。为此,我从Jupyter Notebook特意换上PyCharm,因为这样比较容易trace。
官方tutorial也是。。。醉人。。。我猜每个section都是不同的人写的,思路也有点不一样。。。。。
有新方法再更,就酱。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:54792次
排名:千里之外
转载:108篇
评论:10条
(1)(12)(1)(3)(32)(9)(26)(6)(4)(8)(12)(1)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信