本文参考Kulbear 的【Tensorflow Tutorial】,我基于以上的文章加以自己的理解发表这篇博客,力求让大家以最轻松的姿态理解吴恩达的视频,如有不妥的地方欢迎大家指正。
本文所使用的资料已上传到百度网盘【点击下载】,请在开始之前下载好所需资料,或者在本文底部copy资料代码。
【博主使用的python版本:3.6.2】
到目前为止,我们一直在使用numpy来自己编写神经网络。现在我们将一步步的使用深度学习的框架来很容易的构建属于自己的神经网络。我们将学习TensorFlow这个框架:
- 初始化变量
 - 建立一个会话
 - 训练的算法
 - 实现一个神经网络
 
使用框架编程不仅可以节省你的写代码时间,还可以让你的优化速度更快。
开始之前,我们先导入一些库
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 
:
- 1
 
对于Tensorflow的代码实现而言,实现代码的结构如下:
- 创建Tensorflow变量(此时,尚未直接计算)
 - 实现Tensorflow变量之间的操作定义
 - 初始化Tensorflow变量
 - 创建Session
 - 运行Session,此时,之前编写操作都会在这一步运行。
 
因此,当我们为损失函数创建一个变量时,我们简单地将损失定义为其他数量的函数,但没有评估它的价值。 为了评估它,我们需要运行,初始化损失变量,在最后一行,我们最后能够评估损失的值并打印它的值。
现在让我们看一个简单的例子:
- 1
 - 2
 - 3
 - 4
 - 5
 
:
- 1
 
正如预料中一样,我们并没有看到结果20,不过我们得到了一个Tensor类型的变量,没有维度,数字类型为int32。我们之前所做的一切都只是把这些东西放到了一个“计算图(computation graph)”中,而我们还没有开始运行这个计算图,为了实际计算这两个数字,我们需要创建一个会话并运行它:
- 1
 - 2
 - 3
 
:
- 1
 
- 1
 - 2
 - 3
 - 4
 - 5
 
:
- 1
 
当我们第一次定义x时,我们不必为它指定一个值。 占位符只是一个变量,我们会在运行会话时将数据分配给它。
  让我们通过计算以下等式来开始编程: 
   
    , 
   
   和 
   
   是随机矩阵, 
   
   是随机向量。 
   我们计算 
   
   ,其中W, 
   
   和 
   
   是从随机正态分布中抽取的。  
   
   的维度是(4,3), 
   
   是(3,1), 
   
   是(4,1)。 我们开始定义一个shape=(3,1)的常量X:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 
我们来测试一下:
- 1
 
:
- 1
 - 2
 - 3
 - 4
 
- tf.placeholder(tf.float32, name = “…”)
 - tf.sigmoid(…)
 - sess.run(…, feed_dict = {x: z})
 
需要注意的是我们可以使用两种方法来创建并使用session
方法一:
- 1
 - 2
 - 3
 
方法二:
- 1
 - 2
 - 3
 
我们来实现它:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 
现在我们测试一下:
- 1
 - 2
 
:
- 1
 - 2
 
还可以使用内置函数计算神经网络的成本。因此,不需要编写代码来计算成本函数的  
   
    和  
   
    for i=1…m: 
 
你的代码应该输入,计算sigmoid(得到 ),然后计算交叉熵成本 ,所有的步骤都可以通过一次调用tf.nn.sigmoid_cross_entropy_with_logits来完成。
  很多时候在深度学习中 
   
   向量的维度是从 
   
   到 
   
   的, 
   
   是指分类的类别数量,如果 
   
   ,那么对 
   
   而言你可能需要有以下的转换方式: 
 
 
   这叫做独热编码(”one hot” encoding),因为在转换后的表示中,每列的一个元素是“hot”(意思是设置为1)。 要在numpy中进行这种转换,您可能需要编写几行代码。 在tensorflow中,只需要使用一行代码:
- 1
 
下面我们要做的是取一个标签矢量和C类总数,返回一个独热编码。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 
现在我们来测试一下:
- 1
 - 2
 - 3
 
:
- 1
 - 2
 - 3
 - 4
 
现在我们将学习如何用0或者1初始化一个向量,我们要用到和,给定这些函数一个维度值那么它们将会返回全是1或0的满足条件的向量/矩阵,我们来看看怎样实现它们:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 
测试一下:
- 1
 
:
- 1
 
我们将会使用TensorFlow构建一个神经网络,需要记住的是实现模型需要做以下两个步骤: 
 1. 创建计算图 
 2. 运行计算图
我们开始一步步地走一下:
一天下午,我们和一些朋友决定教我们的电脑破译手语。我们花了几个小时在白色的墙壁前拍照,于是就有了了以下数据集。现在,你的任务是建立一个算法,使有语音障碍的人与不懂手语的人交流。
- 训练集:有从0到5的数字的1080张图片(64x64像素),每个数字拥有180张图片。
 - 测试集:有从0到5的数字的120张图片(64x64像素),每个数字拥有5张图片。
 
需要注意的是这是完整数据集的一个子集,完整的数据集包含更多的符号。
下面是每个数字的样本,以及我们如何表示标签的解释。这些都是原始图片,我们实际上用的是64 * 64像素的图片。 
 
 
 
首先我们需要加载数据集:
- 1
 
我们可以看一下数据集里面有什么,当然你也可以自己更改一下index的值。
- 1
 - 2
 - 3
 
:
- 1
 
 
   和往常一样,我们要对数据集进行扁平化,然后再除以255以归一化数据,除此之外,我们要需要把每个标签转化为独热向量,像上面的图一样。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 
:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 
我们的目标是构建能够高准确度识别符号的算法。 要做到这一点,你要建立一个TensorFlow模型,这个模型几乎和你之前在猫识别中使用的numpy一样(但现在使用softmax输出)。要将您的numpy实现与tensorflow实现进行比较的话这是一个很好的机会。
目前的模型是:LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX,SIGMOID输出层已经转换为SOFTMAX。当有两个以上的类时,一个SOFTMAX层将SIGMOID一般化。
我们的第一项任务是为X和Y创建占位符,这将允许我们稍后在运行会话时传递您的训练数据。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 
测试一下:
- 1
 - 2
 - 3
 
:
- 1
 - 2
 
初始化tensorflow中的参数,我们将使用Xavier初始化权重和用零来初始化偏差,比如:
- 1
 - 2
 - 3
 
博主注: 每次都在创建新对象,对于来说,对于已经创建的变量对象,就把那个对象返回,如果没有创建变量对象的话,就创建一个新的。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 
测试一下:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
:
- 1
 - 2
 - 3
 - 4
 
正如预期的那样,这些参数只有物理空间,但是还没有被赋值,这是因为没有通过session执行。
我们将要在TensorFlow中实现前向传播,该函数将接受一个字典参数并完成前向传播,它会用到以下代码:
- tf.add(…) :加法
 - tf.matmul(… , …) :矩阵乘法
 - tf.nn.relu(…) :Relu激活函数
 
我们要实现神经网络的前向传播,我们会拿numpy与TensorFlow实现的神经网络的代码作比较。最重要的是前向传播要在处停止,因为在TensorFlow中最后的线性输出层的输出作为计算损失函数的输入,所以不需要A3.
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 
测试一下:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 
:
- 1
 
您可能已经注意到前向传播不会输出任何cache,当我们完成反向传播的时候你就会明白了。
如前所述,成本很容易计算:
- 1
 
我们现在就来实现计算成本的函数:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 
测试一下:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
:
- 1
 
得益于编程框架,所有反向传播和参数更新都在1行代码中处理。计算成本函数后,将创建一个“optimizer”对象。 运行tf.session时,必须将此对象与成本函数一起调用,当被调用时,它将使用所选择的方法和学习速率对给定成本进行优化。
举个例子,对于梯度下降:
- 1
 - 2
 - 3
 
要进行优化,应该这样做:
- 1
 - 2
 - 3
 - 4
 
编写代码时,我们经常使用 作为一次性变量来存储我们稍后不需要使用的值。 这里,具有我们不需要的优化器的评估值(并且c取值为成本变量的值)。
现在我们将实现我们的模型
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 - 86
 - 87
 - 88
 - 89
 - 90
 - 91
 - 92
 - 93
 - 94
 - 95
 - 96
 - 97
 - 98
 - 99
 - 100
 
我们来正式运行一下模型,请注意,这次的运行时间大约在5-8分钟左右,如果在的时候,你的的值和我相差过大,那么你就立即停止,回头检查一下哪里出了问题。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 
:
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 

博主自己拍了5张图片,然后裁剪成1:1的样式,再通过格式工厂把很大的图片缩放成64x64的图片,同时把jpg转化为png,因为mpimg只能读取png的图片。
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 
:
- 1
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 
:
- 1
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 
:
- 1
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 
:
- 1
 

- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 
:
- 1
 

事实看来,可能神经网络还有很大的提升空间
- 1
 - 2
 - 3
 - 4
 - 5
 - 6
 - 7
 - 8
 - 9
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 - 62
 - 63
 - 64
 - 65
 - 66
 - 67
 - 68
 - 69
 - 70
 - 71
 - 72
 - 73
 - 74
 - 75
 - 76
 - 77
 - 78
 - 79
 - 80
 - 81
 - 82
 - 83
 - 84
 - 85
 - 86
 - 87
 - 88
 - 89
 - 90
 - 91
 - 92
 - 93
 - 94
 - 95
 - 96
 - 97
 - 98
 - 99
 - 100
 - 101
 - 102
 - 103
 - 104
 - 105
 - 106
 - 107
 - 108
 - 109
 - 110
 - 111
 - 112
 - 113
 - 114
 - 115
 - 116
 - 117
 - 118
 - 119
 - 120
 - 121
 - 122
 
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/bcyy/30459.html