我正在使用张量流来预测神经网络的输出。我有一堂课,我描述了神经网络,还有一个主文件,在该文件中进行了预测,并根据结果对权重进行了更新。但是,预测似乎很慢。这是我的代码的样子:
class NNPredictor():
def __init__(self):
self.input = tf.placeholder(...)
...
self.output = (...) #Neural network output
def predict_output(self, sess, input):
return sess.run(tf.squeeze(self.output), feed_dict = {self.input: input})
主文件如下所示:
sess = tf.Session()
predictor = NNPredictor()
input = #some initial value
for i in range(iter):
output = predictor.predict_output(sess, input)
input = #some function of output
但是,如果我在类中使用以下函数定义:
def predict_output(self):
return self.output
并具有以下主文件:
sess = tf.Session()
predictor = NNPredictor()
input = #some initial value
output_op = predictor.predict_value()
for i in range(iter):
output = np.squeeze(sess.run(output_op, feed_dict = {predictor.input: input}))
input = #some function of output
该代码的运行速度几乎提高了20-30倍。我似乎不了解这里的工作方式,我想知道最佳实践是什么。
最佳答案
这与Python屏蔽的基础内存访问有关。下面是一些示例代码来说明这个想法:
import time
runs = 10000000
class A:
def __init__(self):
self.val = 1
def get_val(self):
return self.val
# Using method to then call object attribute
obj = A()
start = time.time()
total = 0
for i in xrange(runs):
total += obj.get_val()
end = time.time()
print end - start
# Using object attribute directly
start = time.time()
total = 0
for i in xrange(runs):
total += obj.val
end = time.time()
print end - start
# Assign to local_var first
start = time.time()
total = 0
local_var = obj.get_val()
for i in xrange(runs):
total += local_var
end = time.time()
print end - start
在我的计算机上,它按以下时间运行:
1.49576115608
0.656110048294
0.551875114441
特定于您的情况,在第一种情况下您要调用object方法,而在第二种情况下则不执行。如果您以这种方式多次调用代码,则性能上会有很大差异。
关于python - 在类中处理 tensorflow session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44896433/