У меня проблема с объединением кадров в while_loop.Во-первых, версия, которая работает, но в простой цикл.Эта версия довольно медленная, поэтому я хотел бы запустить этот код в tf.while_loop
import gym
import tensorflow as tf
import matplotlib.pyplot as plt
import time
env = gym.make("Pong-v0")
def preprocess(frame):
with tf.variable_scope('frame_process'):
output_frame = tf.image.rgb_to_grayscale(frame)
output_frame = tf.image.crop_to_bounding_box(output_frame, 35, 0, 160, 160)
output_frame = tf.image.resize_images(output_frame,[80,80],method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
return tf.squeeze(output_frame)
start_time = time.time()
frame = env.reset()
state = preprocess(frame)
stack = tf.stack(4 * [state], axis=2)
step_op = lambda action : env.step(action)[:3]
with tf.Session() as session:
session.run(tf.global_variables_initializer())
for i in range(100):
action = tf.py_func(lambda : env.action_space.sample(),[],[tf.int64])
frame_, reward, done = tf.py_func(step_op,[action], [tf.uint8, tf.double, tf.bool])
state_ = preprocess(frame_)
stack = tf.concat([stack[:,:,1:], tf.expand_dims(session.run(state_),2)], axis=2)
print("Done in --- %s seconds ---" % (time.time() - start_time))
stack2 = session.run(stack)
for x in range(4):
plt.imshow(stack2[:,:,x], cmap='gray')
plt.show()
Примечание : в этой версии мне нужно запустить session.run(state_)
, когда яхочу tf.expand_dims
, потому что если я этого не сделаю, я получу Illegal Instruction!
, и изображения будут повреждены.Я не знаю почему ...
Вот моя вторая версия с while_loop:
import tensorflow as tf
import gym
import matplotlib.pyplot as plt
import time
env = gym.make("Pong-v0")
def preprocess(frame):
with tf.variable_scope('frame_process'):
output_frame = tf.image.rgb_to_grayscale(frame)
output_frame = tf.image.crop_to_bounding_box(output_frame, 35, 0, 160, 160)
output_frame = tf.image.resize_images(output_frame,[80,80],method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
return tf.squeeze(output_frame)
def body(index,stack):
action = tf.py_func(lambda : env.action_space.sample(),[],[tf.int64])
frame_, reward, done = tf.py_func(step_op,[action], [tf.uint8, tf.double, tf.bool])
state_ = preprocess(frame_)
state_.set_shape((80,80))
next_stack = tf.concat([stack[:,:,1:], tf.expand_dims(state_,2)], axis=2)
return tf.add(index, 1), next_stack
start_time = time.time()
frame = env.reset()
state = preprocess(frame)
stack = tf.stack(4 * [state], axis=2)
i = tf.constant(0)
STEPS = tf.constant(100)
while_condition = lambda i, stack: tf.less(i, STEPS)
step_op = lambda action : env.step(action)[:3]
loop_result = tf.while_loop(while_condition, body, (i, stack))
with tf.Session() as session:
session.run(tf.global_variables_initializer())
idx, s = session.run(loop_result)
print("Done in --- %s seconds ---" % (time.time() - start_time))
for x in range(4):
plt.imshow(s[:,:,x], cmap='gray')
plt.show()
Когда я запускаю этот код, я получаю Illegal Instruction!
, а изображение неправильный.Я думаю, это потому, что я не могу оценить frame_
, прежде чем развернуть его.Можно ли оценить мой frame_
перед выполнением tf.expand_dims
в tf.while_loop
, как в моем первом примере?