<p>这段代码中有一些奇怪的地方,所以给你一个真正解决潜在问题的答案是很棘手的。但是,我可以解决您观察到的运行时间增长问题。下面,我修改了您的代码,以从游戏循环中提取输入模式生成和对<code>model</code>的调用。你知道吗</p>
<pre><code>import numpy as np
import tensorflow as tf
import time
n_inputs = 9
n_class = 9
n_hidden_1 = 20
population_size = 10
weights = []
biases = []
game_steps = 20 #so we can see performance loss faster
# 2 games per individual
games_in_generation = population_size/2
def generate_initial_population(my_population_size):
my_weights = []
my_biases = []
for key in range(my_population_size):
layer_weights = {
'h1': tf.Variable(tf.truncated_normal([n_inputs, n_hidden_1], seed=key)),
'out': tf.Variable(tf.truncated_normal([n_hidden_1, n_class], seed=key))
}
layer_biases = {
'b1': tf.Variable(tf.truncated_normal([n_hidden_1], seed=key)),
'out': tf.Variable(tf.truncated_normal([n_class], seed=key))
}
my_weights.append(layer_weights)
my_biases.append(layer_biases)
return my_weights, my_biases
weights, biases = generate_initial_population(population_size)
def model(x):
out_layer = tf.add(tf.matmul([biases[1]['b1']], weights[1]['out']), biases[1]['out'])
return out_layer
def play_game():
# Extract input pattern generation.
model_input = np.float32([[0]*9])
model_out = model(model_input)
for game_step in range(game_steps):
start_time = time.time()
move = sess.run(model_out)[0]
# print(" -Step took %s seconds -" % (time.time() - start_time))
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for _ in range(5):
start_time = time.time()
for _ in range(int(games_in_generation)):
play_game()
print(" -Games took %s seconds -" % (time.time() - start_time))
</code></pre>
<p>如果运行,此代码将提供如下信息:</p>
<pre><code> -Games took 0.42223644256591797 seconds -
-Games took 0.13168787956237793 seconds -
-Games took 0.2452383041381836 seconds -
-Games took 0.20023465156555176 seconds -
-Games took 0.19905781745910645 seconds -
</code></pre>
<p>显然,这解决了您观察到的运行时间增长问题。它还将观察到的最大运行时间减少了一个数量级!发生这种情况的原因是,每次调用<code>model</code>时,实际上是在创建一堆<a href="https://www.tensorflow.org/api_docs/python/tf/Tensor" rel="nofollow noreferrer">^{<cd3>}</a>对象,并试图将这些对象添加到图中。这种误解很常见,是因为您试图在命令式python代码中使用张量,就好像它们是python变量一样。我建议在继续之前检查所有的<a href="https://www.tensorflow.org/programmers_guide/graphs" rel="nofollow noreferrer">graphs guide</a>。你知道吗</p>
<p>还需要注意的是,在TensorFlow中,这不是将值传递给图形的正确方法。我可以看到,在游戏的每个迭代过程中,您都希望向模型传递不同的值,但是您不能通过向python函数传递值来实现这一点。必须在模型图中创建一个<a href="https://www.tensorflow.org/api_docs/python/tf/placeholder" rel="nofollow noreferrer">^{<cd4>}</a>,并将希望模型处理的值加载到该占位符上。有很多方法可以做到这一点,但是您可以找到一个例子<a href="https://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder">here</a>。我希望这对你有帮助!你知道吗</p>