Keras:在for循环中构建一个火车功能会产生内存问题

时间:2018-04-19 07:52:41

标签: python tensorflow keras

我正在尝试使用策略渐变训练双隐藏层CNN。我有一个自定义丢失功能。我正在尝试使用kkweon的Cartpole游戏代码在Keras(后端TF)中实现它。代码如下,

def _build_train_fn(network):
    action_prob_placeholder = network.output
    action_onehot_placeholder = K.placeholder(shape=(None, output_dim), 
                                              name = "action_onehot")
    discount_reward_placeholder = K.placeholder(shape=(None, ), 
                                                name = "discount_reward")

    action_prob = K.sum(action_prob_placeholder * action_onehot_placeholder, 
                        axis=1)
    log_action_prob = K.log(action_prob)

    loss = -log_action_prob * discount_reward_placeholder
    loss = K.mean(loss)

    adam = optimizers.Adam()

    updates = adam.get_updates(loss = loss, params = network.trainable_weights)

    train_fn = K.function(inputs=[network.input, 
                                       action_onehot_placeholder, 
                                       discount_reward_placeholder], 
                                outputs=[], updates=updates)
    return(train_fn)

现在我在for循环中运行训练功能,在那里我拍摄小批量的剧集并为此进行训练。因此,我需要为每个小批量构建列车功能,因为它取决于网络输出。 for循环中的批量训练就是这样,

if episode_number % batch_size == 0:
            mini_batch_states = np.asarray(mini_batch_states).reshape([len(mini_batch_states), 14])
            mini_batch_moves = np.asarray(mini_batch_moves)

            train_fn = _build_train_fn(network)
            train_fn([mini_batch_states, mini_batch_moves, mini_batch_rewards])

问题在于随着迷你批次数量的增长,内存使用量会继续增加。我已经尝试在循环之前构建函数一次,这解决了内存问题,但删除了动态学习的方面,并收敛到0.5 winrate而不是一致地增长。

也使用

del train_fn

无法解决内存问题。

我对TF和Keras都很新。非常感谢任何帮助。

0 个答案:

没有答案