首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开放AI健身杆的策略梯度方法

开放AI健身杆的策略梯度方法
EN

Stack Overflow用户
提问于 2017-10-06 03:25:57
回答 1查看 1.1K关注 0票数 0

我是一个加强学习的初学者,并试图实现策略梯度方法来解决开放AI健身房CartPole任务使用Tensorflow。然而,我的代码似乎运行得非常慢;第一集的运行速度是可以接受的,而从第二集开始运行的速度非常慢。为什么会这样,我如何解决这个问题?

我的代码:

代码语言:javascript
复制
import tensorflow as tf
import numpy as np
import gym

env = gym.make('CartPole-v0')

class Policy:
    def __init__(self):
        self.input_layer_fake = tf.placeholder(tf.float32, [4,1])
        self.input_layer = tf.reshape(self.input_layer_fake, [1,4])
        self.dense1 = tf.layers.dense(inputs = self.input_layer, units = 4,
                                  activation = tf.nn.relu)
        self.logits = tf.layers.dense(inputs = self.dense1, units = 2,
                                  activation = tf.nn.relu)
    def predict(self, inputObservation):
        sess = tf.InteractiveSession()
        tf.global_variables_initializer().run()
        x = tf.reshape(inputObservation, [4,1]).eval()
        return (sess.run(self.logits, feed_dict = {self.input_layer_fake: x}))

    def train(self, features_array, labels_array):
        for i in range(np.shape(features_array)[0]):
            print("train")
            print(i)
            sess1 = tf.InteractiveSession()
            tf.global_variables_initializer().run()
            self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels = labels_array[i], logits = self.logits))
            self.train_step = tf.train.GradientDescentOptimizer(0.5).minimize(self.cross_entropy)
            y = tf.reshape(features_array[i], [4,1]).eval()
            sess1.run(self.train_step, feed_dict={self.input_layer_fake:y})

agent = Policy()
train_array = []
features_array = []
labels_array = []
main_sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for i_episode in range(100):
    observation = env.reset()

    for t in range(200):
        prevObservation = observation
        env.render()

        if np.random.uniform(0,1) < 0.2:
            action = env.action_space.sample()
        else:
            action = np.argmax(agent.predict((prevObservation)))

        observation, reward, done, info = env.step(action)
        add_in = np.random.uniform(0,1)
        if add_in < 0.5:
            features_array.append(prevObservation)
            sarPreprocessed = agent.predict(prevObservation)
            sarPreprocessed[0][action] = reward
            labels_array.append(sarPreprocessed)
        if done:
            break

    agent.train(features_array, labels_array)
    features_array = []
    labels_array = []

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-12 06:02:52

我已经有一段时间没有看到实现策略梯度的尝试了,但据我记忆中的问题是,我在火车函数中使用了一个循环。

当我遍历features_array中的每个元素时,数组本身的长度一直在增长(features_array永远不会被设置为[] ),程序就会慢下来。相反,我应该以“批处理”的方式进行培训,同时定期清除features_array

我在这里实现了一个更简洁的普通策略梯度算法:pg.py

一个更好的、改进的算法(仍然基于策略梯度)的实现称为PPO (最接近策略优化),可以在这里找到:https://github.com/Ashboy64/rl-reimplementations/tree/master/Reimplementations/PPO

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46597809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档