【发布时间】:2017-08-13 04:00:00
【问题描述】:
我在使用 tensorflow 函数 py_func 时遇到了一些效率问题。
上下文
在我的项目中,我有一批大小为[? max_items m] 的张量input_features。第一个维度设置为?,因为它是一个动态形状(批处理是为自定义 tensorflow 阅读器读取的,并使用 tf.train.shuffle_batch_join() 进行混洗)。第二个维度对应一个上限(我的例子可以取的最大项目数),第三个维度对应于特征维度空间。我还有一个张量num_items,它的尺寸为batch size(所以形状是(?,)),表示示例中的项目数,其他设置为0(以numpy写作风格input_feature[k, num_items[k]:, :] = 0)
问题
我的工作流程需要一些自定义 python 操作(尤其是处理索引,我需要或实例对一些示例执行集群操作),并且我使用了一些包装在 py_func 函数中的 numpy 函数。这很好用,但是训练变得非常非常慢(比没有这个 py_func 的模型慢大约 50 倍),并且函数本身并不耗时。
问题
1 - 这个计算时间增加正常吗?包裹在 py_func 中的函数给了我一个新的张量,它在这个过程中被进一步放大。它解释了计算时间吗? (我的意思是梯度可能更难用这种函数计算)。
2 - 我正在尝试修改我的处理并避免使用py_func 函数。但是,使用 numpy 索引(尤其是我的数据格式)提取数据非常方便,而且我很难以 TF 方式传递它。例如,如果我有一个张量 t1 与 shape[-1, n_max, m] (第一维是动态的 batch_size)和 t2 与形状 [-1,2] 包含整数。有没有一种简单的方法可以在 tensorflow 中执行平均运算,这将导致 t_mean_chunk 形状为 (-1, m) 其中(在一个 numpy 公式中):
t_mean_chunk[i,:] = np.mean(t1[i, t2[i,0]:t2[i,1], :], axis=0) ?
这是(以及其他操作)我在包装函数中所做的事情。
【问题讨论】:
-
假设
pyfunc的运行方式与np.vectorize非常相似,我并不惊讶它会减慢速度。tensorflow使用了大量自己编译的代码。但是在混合使用这个 Python 函数时,它必须求助于某种解释迭代。这要慢得多。
标签: python numpy indexing machine-learning tensorflow