TensorFlow学习系列(六):变量更新和控制依赖
目录TensorFlow学习系列(一):初识TensorFlow TensorFlow学习系列(二):形状和动态维度 TensorFlow学习系列(三):保存/恢复和混合多个模型 TensorFlow学习系列(四):利用神经网络实现泛逼近器(universal approximator) TensorFlow学习系列(五):如何使用队列和多线程优化输入管道 TensorFlow学习系列(六):变量更新和控制依赖 在本文中,我们将围绕变量更新和控制依赖讨论更深层次的 TensorFlow 能力。 变量更新到目前为止,我们已经将变量专门用于我们模型中的一些权重,这些权重将根据优化器的操作进行更新操作(如:Adam)。但是优化器并不是更新变量的唯一方法,还有别的一整套更高级的函数可以完成这个操作(你将再次看到,这些更高级的函数将作为一种操作添加到你的图中)。 最基本的自定义更新操作是 让我们来看一个例子: import tensorflow as tf # We define a Variable x = tf.Variable(0,dtype=tf.int32) # We use a simple assign operation assign_op = tf.assign(x,x + 1) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(5): print('x:',sess.run(x)) sess.run(assign_op) # outputs: # x: 0 # x: 1 # x: 2 # x: 3 # x: 4 这里没有什么特别地,就跟任何其他操作一样:你能在会话( 我们将这个操作( TF 有许多的函数来支持手动更新变量,你可以在 TensorFlow 的函数帮助页面进行查看,很多的操作都可以被一些张量操作来取代,然后调用
我不会深挖这些函数的功能。其中一些函数可能你现在不是很理解,我的建议是你可以通过一个很简单的脚本来学习这些函数,然后再写入你的实际模型中,这种方法会帮助你节约很多的调试时间。 最后再谈一下参数更新:如果我们想改变参数的维度呢?例如,在参数中多添加一行或者一列?到目前为止,我们一直在谈论 “assign” 这个概念,并没有涉及到维度的改变。 这个问题是可以被解决的,但是比较棘手:
让我们看个例子: import tensorflow as tf # We define a "shape-able" Variable x = tf.Variable( [],# A list of scalar dtype=tf.int32,validate_shape=False,# By "shape-able",i mean we don't validate the shape so we can change it trainable=False ) # I build a new shape and assign it to x concat = tf.concat([x,[0]],0) assign_op = tf.assign(x,concat,validate_shape=False) # We force TF,to skip the shape validation step with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(5): print('x:',sess.run(x),'shape:',sess.run(tf.shape(x))) sess.run(assign_op) # outputs: # x: [] shape: [0] # x: [0] shape: [1] # x: [0 0] shape: [2] # x: [0 0 0] shape: [3] # x: [0 0 0 0] shape: [4] 所以这也不是很难,对吧!让我们继续吧。 控制依赖我们可以更新变量,但是如果你要在更新当前变量之前更新别的变量,那么这会造成一个严重问题:你需要调用很多次的 那么有什么办法吗?当然有,那就是控制依赖。TF 提供了一组的函数来处理不完全依赖情况下的操作排序问题(就是哪个操作先执行的问题)。 让我们从最简单的例子开始:我们先构造一个拥有一个变量( 如果我们开始天真的方式,只需要添加一个 import tensorflow as tf # We define our Variables and placeholders x = tf.placeholder(tf.int32,shape=[],name='x') y = tf.Variable(2,dtype=tf.int32) # We set our assign op assign_op = tf.assign(y,y + 1) # We build our multiplication (this could be a more complicated graph) out = x * y with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(3): print('output:',sess.run(out,feed_dict={x: 1})) # outputs: # output: 2 # output: 2 # output: 2 从结果中我们可以看出,这种操作方式并不 如果你仔细查看上面的代码,并且在脑中构建这个图,你就可以清楚的看到,如果要计算 为了解决这个问题,使得 这种操作确实是存在的!我们可以添加一个控制依赖来做这件事。这样就像 让我们来看一个例子: import tensorflow as tf # We define our Variables and placeholders x = tf.placeholder(tf.int32,y + 1) # We build our multiplication,but this time,inside a control depedency scheme! with tf.control_dependencies([assign_op]): # Now,we are under the dependency scope: # All the operations happening here will only happens after # the "assign_op" has been computed first out = x * y with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(3): print('output:',feed_dict={x: 1})) # outputs: # output: 3 # output: 4 # output: 5 一切都按照我们的想法进行工作了。TF 看到了我们设置的依赖关系,所以它在运行依赖关系里面的操作之前,它会运行
一个陷阱在前面我们讨论了如何去改变变量的维度。但是有一些地方需要注意,当我们使用控制依赖去改变变量维度时,那么我们进入了一个黑盒优化层面。 比如,你可以先查看一下这段代码: import tensorflow as tf # I define a "shape-able" Variable x = tf.Variable( [],dtype=tf.int32,i mean we don't validate the shape trainable=False ) # I build a new shape and assign it to x concat = tf.concat([x,validate_shape=False) with tf.control_dependencies([assign_op]): # I print x after the assignment x = tf.Print(x,data=[x,x.read_value()],message="x,x_read:") # The assign_op is called,but it seems that print statement happens # before the assignment,that is wrong. with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(3): sess.run(x) # outputs: # x: [],x_read: [0] # x: [0],x_read: [0 0] # x: [0 0],x_read: [0 0 0] 让我们仔细看看这段代码:
发生了什么事情??上述代码更像是一个BUG而不是一个好的功能,而且 TF 正在利用高速缓存来加速你的计算,但是这恰恰也是可能遇到的一个BUG,请小心这两点。 结束语那么,我们怎么来使用这些新的性能呢?其中一点我想到的是,维度变化这个功能可以用在 NLP 问题中的句子长度不一问题,如果你在处理词向量问题时,遇到句子之间的长度不同,那么你不需要添加 注意:我不确定这个想法是否能产生好的效果,如果你做了实验,那么我很想听到实验结果,感谢! Reference:http://stackoverflow.com/questions/38994037/tensorflow-while-loop-for-training https://github.com/tensorflow/tensorflow/issues/7782 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- filteredArrayUsingPredicate在swift Array中不存在
- Cocos2D中Node的userObject实例变量使用时一个要注意的地方
- c – gcc(Linux / MinGW)是否存在编译器标志,以便在运行时将
- ruby-on-rails – rails – 如何在视图中呈现JSON对象
- C#/VB.NET 将SVG图片添加到PDF、转换为PDF
- SQLite基本语法手册
- Lambda表达式作为Visual C 2010中的CLR(.NET)委托/事件处理
- 我何时应该谨慎使用.NET中的数据绑定?
- swift – 如何在Xcode 9中实现PKPaymentAuthorizationViewC
- DWR入门 (二)用户实例