使用默认全局图时,是否可以在添加节点后删除节点,或者将默认图重置为空?在IPython中以交互方式使用TF时,我发现自己不得不重复重启内核.如果可能的话,我希望能够更轻松地试验图表.
我正在尝试调试一个有点复杂和非规范的NN架构.计算前向传递很好,并且给我预期的结果,但是当我尝试使用Adam或任何标准优化器进行优化时,即使在一次学习率非常小的迭代之后,我也无处不在.我正试图将它们本地化,并且想知道是否有办法捕获第一次出现的纳米并检测它出现在哪个操作中?我试过tf.add_check_numerics_ops()但它似乎没有做任何事情,或者我可能错误地使用它.
(源代码)文档tf.cond不清楚在评估谓词时要执行的函数是否会产生副作用.我做了一些测试,但结果却相互矛盾.例如,下面的代码不起作用:
import tensorflow as tf
from tensorflow.python.ops import control_flow_ops
pred = tf.placeholder(tf.bool, [])
count = tf.Variable(0)
adder = count.assign_add(1)
subtractor = count.assign_sub(2)
my_op = control_flow_ops.cond(pred, lambda: adder, lambda: subtractor)
sess = tf.InteractiveSession()
tf.initialize_all_variables().run()
my_op.eval(feed_dict={pred: True})
count.eval() # returns -1
my_op.eval(feed_dict={pred: False})
count.eval() # returns -2
Run Code Online (Sandbox Code Playgroud)
即无论谓词评估的值是什么,两个函数都会运行,因此最终结果是减1.另一方面,这个代码片段确实有效,唯一的区别是我添加了新的操作.每次my_op调用图形:
pred = tf.placeholder(tf.bool, [])
count = tf.Variable(0)
my_op = control_flow_ops.cond(pred, lambda:count.assign_add(1), lambda:count.assign_sub(2))
sess = tf.InteractiveSession()
tf.initialize_all_variables().run()
my_op.eval(feed_dict={pred: False})
count.eval() # returns -2
my_op.eval(feed_dict={pred: True})
count.eval() # returns -1
Run Code Online (Sandbox Code Playgroud)
不确定为什么每次创建新的操作都有效,而另一种情况没有,但我显然不会添加节点,因为图形最终会变得太大.
我试图限制tf会话使用的核心数量,但它不起作用.这就是我初始化会话的方式:
sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=1,
intra_op_parallelism_threads=1,
use_per_session_threads=True))
Run Code Online (Sandbox Code Playgroud)
该系统有12个核心/ 24个线程,我可以看到其中40-60%在任何给定的时间点使用.该系统还有8个GPU,但我构建了整个图形tf.device('/cpu:0').
更新:为了澄清,图表本身是一个简单的LSTM-RNN,它与tf源代码中的示例非常接近.为了完整性,这里是完整的图表:
node_input = tf.placeholder(tf.float32, [n_steps, batch_size, input_size], name = 'input')
list_input = [tf.reshape(i, (batch_size, input_size)) for i in tf.split(0, n_steps, node_input)]
node_target = tf.placeholder(tf.float32, [n_steps, batch_size, output_size], name = 'target')
node_target_flattened = tf.reshape(tf.transpose(node_target, perm = [1, 0, 2]), [-1, output_size])
node_max_length = tf.placeholder(tf.int32, name = 'batch_max_length')
node_cell_initializer = tf.random_uniform_initializer(-0.1, 0.1)
node_cell = LSTMCell(state_size, input_size, initializer = node_cell_initializer)
node_initial_state = node_cell.zero_state(batch_size, tf.float32)
nodes_output, nodes_state = rnn(node_cell,
list_input,
initial_state = node_initial_state,
sequence_length …Run Code Online (Sandbox Code Playgroud) 版本0.7和0.6之间的行为发生了变化sparse_to_dense,现在需要对索引进行按字典顺序排序.这对我的一些用途来说是一个有点繁重的要求,因为我生成索引的方式与我生成元素的方式(第三个arg sparse_to_dense)匹配,并且排序两者都有点麻烦.我看到该validate_indices选项可以设置False为忽略它.这样做是否安全?为什么要求首先?
似乎只tf.get_variable接受Tensor形状int.这是不同的tf.Variable,可以接受Tensors.这是正确的,如果是这样,tf.get_variable当形状是Tensor什么时,是否有一种解决方法可以开始工作?我不想session在图形构造的这个阶段运行,因为它会使下游的许多事情复杂化.
我正在尝试使用针对RNN的cuDNN绑定,这涉及调用params_size()使用创建的模型CudnnLSTM.这将在参数缓冲区中保存的参数数量作为a返回Tensor,然后用于创建保存参数的变量.而不是使用tf.Variable它的所有警告,我想tf.get_variable用来保存参数值,这样我就可以使用兼容的所有各种初始化器轻松初始化它们tf.get_variable等等.所有新机器都围绕着tf.get_variable,所以必须回到低级别tf.Variable是非常繁琐的.这似乎是一个非常奇怪的限制,tf.get_variable不接受Tensors什么tf.Variable时候.
是否有可能在两个操作创建后创建控件依赖关系?我意识到,tf.control_dependencies在执行之前可以让一个操作等待另一个操作,但必须在tf.control_dependencies上下文中创建依赖操作.我想首先独立构造两个ops,然后添加依赖项.
我正在尝试执行一条条件代码,而这条代码依赖于另一个先执行的操作.这项工作的简单版本,如下所示:
x = tf.Variable(0.)
x_op = tf.assign(x, 1.)
with tf.control_dependencies([x_op]):
true_fun = lambda: tf.assign_add(x, 3.)
false_fun = lambda: tf.constant([])
pred = tf.constant(True)
cond_op = control_flow_ops.cond(pred, true_fun, false_fun)
Run Code Online (Sandbox Code Playgroud)
当评估cond_op组x于4.0预期.但是,这个更复杂的版本不起作用:
def rest(x): tf.gather(x, tf.range(1, tf.size(x)))
x = tf.Variable([0., 1.])
x_op = tf.assign(x, [0., 1., 2.], validate_shape=False)
with tf.control_dependencies([x_op]):
true_fun = lambda: tf.assign(x, rest(x), validate_shape=False)
false_fun = lambda: tf.constant([])
pred = tf.constant(True)
cond_op = control_flow_ops.cond(pred, true_fun, false_fun)
Run Code Online (Sandbox Code Playgroud)
特别是x被分配[1.]而不是[1., 2.].我想要的逻辑是x首先被分配 …