我正在尝试使用Keras来运行强化学习算法.在这个算法中,我正在训练一个神经网络.与其他学习问题的不同之处在于,我需要使用神经网络本身来生成训练数据,并在更新后重复此操作.当我试图并行生成训练数据时,我遇到了问题.
问题是我不能告诉Theano在训练时使用GPU,因为它在生成训练数据时也会使用GPU,如果多个进程调用会导致问题.
更重要的是,即使我THEANO_FLAGS='floatX=float32,device=cpu,openmp=True' OMP_NUM_THREADS=4在python命令之前写作,我也不会在多线程模式下运行.这不会导致任何错误,但我可以看到只有一个线程在运行.
这是我的代码.它是一个简化版本.
import numpy
from numpy import array
import copy
from time import time
import multiprocessing
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import SGD
from keras.models import model_from_json
def runEpisode(qn):
# Some codes that need qn.predict
result = qn.predict(array([[1, 3]])) # That's just for demo
return ([1, 2], 2) # Generated some training data, (X, Y)
def runMultiEpisode(qn, queue, event, nEpisode): # 'queue' is used to return result. …Run Code Online (Sandbox Code Playgroud) 与此问题类似,我正在运行异步强化学习算法,并且需要在多个线程中运行模型预测以更快地获取训练数据。我的代码基于GitHub 上的DDPG-keras,其神经网络基于Keras&Tensorflow构建。我的代码片段如下所示:
异步线程的创建和加入:
for roundNo in xrange(self.param['max_round']):
AgentPool = [AgentThread(self.getEnv(), self.actor, self.critic, eps, self.param['n_step'], self.param['gamma'])]
for agent in AgentPool:
agent.start()
for agent in AgentPool:
agent.join()
Run Code Online (Sandbox Code Playgroud)代理线程代码
"""Agent Thread for collecting data"""
def __init__(self, env_, actor_, critic_, eps_, n_step_, gamma_):
super(AgentThread, self).__init__()
self.env = env_ # type: Environment
self.actor = actor_ # type: ActorNetwork
# TODO: use Q(s,a)
self.critic = critic_ # type: CriticNetwork
self.eps = eps_ # type: float
self.n_step = n_step_ # type: …Run Code Online (Sandbox Code Playgroud)