- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在tensorflow中编写了一个自定义内核操作来读取csv格式数据。
它在 TestCase 中运行良好,通过 test_session()
函数返回 sess
对象。
当我转向普通代码时,读取器操作每次都会返回相同的结果。然后我在 MyOp:Compute 函数的开头放置了一些调试打印。似乎在第一次运行后,sess.run(myop)
根本没有调用 MyOp:Compute
函数。
然后我返回到我的测试用例,如果我用 tf.Session()
而不是 self.test_session()
替换 session 对象,它也会失败方式。
有人对此有任何想法吗?
为了分享更多细节,这是我的迷你演示代码: https://github.com/littleDing/mini_csv_reader
在测试用例中:
def testSimple(self):
input_data_schema, feas, batch_size = self.get_simple_format()
iter_op = ops.csv_iter('./sample_data.txt', input_data_schema, feas, batch_size=batch_size, label='label2')
with self.test_session() as sess:
label,sign = sess.run(iter_op)
print label
self.assertAllEqual(label.shape, [batch_size])
self.assertAllEqual(sign.shape, [batch_size, len(feas)])
self.assertAllEqual(sum(label), 2)
self.assertAllEqual(sign[0,:], [7,0,4,1,1,1,5,9,8])
label,sign = sess.run(iter_op)
self.assertAllEqual(label.shape, [batch_size])
self.assertAllEqual(sign.shape, [batch_size, len(feas)])
self.assertAllEqual(sum(label), 1)
self.assertAllEqual(sign[0,:], [9,9,3,1,1,1,5,4,8])
正常通话:
def testing_tf():
path = './sample_data.txt'
input_data_schema, feas, batch_size = get_simple_format()
with tf.device('/cpu:0'):
n_data_op = tf.placeholder(dtype=tf.float32)
iter_op = ops.csv_iter(path, input_data_schema, feas, batch_size=batch_size, label='label2')
init_op = [tf.global_variables_initializer(), tf.local_variables_initializer() ]
with tf.Session() as sess:
sess.run(init_op)
n_data = 0
for batch_idx in range(3):
print '>>>>>>>>>>>>>> before run batch', batch_idx
## it should be some debug printing here, but nothing come out when batch_idx>0
label,sign = sess.run(iter_op)
print '>>>>>>>>>>>>>> after run batch', batch_idx
## the content of sign remain the same every time
print sign
if len(label) == 0:
break
最佳答案
看看implementation tf.test.TestCase.test_session() 提供了一些线索,因为它配置 session 与直接调用 tf.Session 有所不同。特别是, test_session()
disables 持续折叠优化。默认情况下,TensorFlow 会将图形的无状态部分转换为 tf.constant()
节点,因为每次运行它们时它们都会产生相同的结果。
在您的“CsvIter”
操作的注册中,有SetIsStateful()
注释,因此TensorFlow会将其视为无状态,因此会受到不断的折叠。然而,它的实现是非常有状态的:一般来说,您希望使用相同的输入张量产生不同结果的任何操作,或者在成员变量中存储可变状态的任何操作,都应该标记为有状态。
解决方案是对 "CsvIter"
的 REGISTER_OP
进行一行更改:
REGISTER_OP("CsvIter")
.Input("data_file: string")
.Output("labels: float32")
.Output("signs: int64")
.Attr("input_schema: list(string)")
.Attr("feas: list(string)")
.Attr("label: string = 'label' ")
.Attr("batch_size: int = 10000")
.SetIsStateful(); // Add this line.
关于python - 为什么自定义读取操作仅适用于 test_session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810996/
我在tensorflow中编写了一个自定义内核操作来读取csv格式数据。 它在 TestCase 中运行良好,通过 test_session() 函数返回 sess 对象。 当我转向普通代码时,读取器
我知道test_session is deprecated in tensorflow 1.13 : Warning: THIS FUNCTION IS DEPRECATED. It will be
我是一名优秀的程序员,十分优秀!