我正在尝试使用策略渐变训练双隐藏层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都很新。非常感谢任何帮助。