我们选择不应用已有的层实现(比如来自 tf.layers),大年夜而能对内部运算施加明白的┞菲握,并确保它们能与 TensorForce 的其余部分精确地整合在一路。我们想要避免对动态 wrapper 库的依附,是以仅依附于更低层的 TensorFlow 运算。
以下几行代码添加了一个用于离散动作的 epsilon 摸索,它随时光衰减到最终值:
我们的 layer 库今朝仅供给了异常少的根本层类型,但将来还会扩大。别的你也可以轻松整合你本身的层,下面给出了一个批规范化层的例子:
和经典的监督进修设置(个中的实例和神经收集调用被认为是自力的)不合,强化进修一个 episode 中的时光步取决于之前的动作,并且还会影响后续的状况。是以除了其每个时光步的状况输入和动作输出,可以想象神经收集可能有内部状况在 episode 内的对应于每个时光步的输入/输出。下图展示了这种收集随时光的工作方法:
def batch_normalization(x, variance_epsilon=1e-6): mean, variance = tf.nn.moments(x, axes=tuple(range(x.shape.ndims - 1))) x = tf.nn.batch_normalization(x, mean=mean, variance=variance, variance_epsilon=variance_epsilon) return x
{ "type": "[YOUR_MODULE].batch_normalization", "variance_epsilon": 1e-9}
到今朝为止,我们已经给出了 TensorForce 创建分层收集的功能,即一个采取单一输入状况张量的收集,具有一个层的序列,可以得出一个输出张量。然则在某些案例中,可能须要或更合适偏离如许的层堆叠构造。最明显的情况是当要处理多个输入状况时,这是必须的,应用单个处理层序列无法天然地完成这一义务。
我们今朝还没有为主动创建对应的收集构建器供给更高层的设备接口。是以,对于如许的案例,你必须经由过程编程来定义其收集构建器函数,并像之前一样将其参加到智能体设备中。比如之前的多模态输入(image 和 caption)例子,我们可以按以下方法定义一个收集:
def network_builder(inputs): image = inputs['image'] # 64x64x3-dim, float caption = inputs['caption'] # 20-dim, int with tf.variable_scope('cnn'): weights = tf.Variable(tf.random_normal(shape=(3, 3, 3, 16), stddev=0.01)) image = tf.nn.conv2d(image, filter=weights, strides=(1, 1, 1, 1)) image = tf.nn.relu(image) image = tf.nn.max_pool(image, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1)) weights = tf.Variable(tf.random_normal(shape=(3, 3, 16, 32), stddev=0.01)) image = tf.nn.conv2d(image, filter=weights, strides=(1, 1, 1, 1)) image = tf.nn.relu(image) image = tf.nn.max_pool(image, ksize=(1, 2, 2, 1), strides=(1, 2, 2, 1)) image = tf.reshape(image, shape=(-1, 16 * 16, 32)) image = tf.reduce_mean(image, axis=1) with tf.variable_scope('lstm'): weights = tf.Variable(tf.random_normal(shape=(30, 32), stddev=0.01)) caption = tf.nn.embedding_lookup(params=weights, ids=caption) lstm = tf.contrib.rnn.LSTMCell(num_units=64) caption, _ = tf.nn.dynamic_rnn(cell=lstm, inputs=caption, dtype=tf.float32) caption = tf.reduce_mean(caption, axis=1) return tf.multiply(image, caption)agent_config = Configuration( ... network=network_builder ...)
内部状况和 Episode 治理

这些内部状况的治收成即在时光步之间前向传播它们和在开端新 episode 时重置它们)可以完全由 TensorForce 的 agent 和 model 类处理。留意这可以处理所有的相干用例(在 batch 之内一个 episode,在 batch 之内多个 episode,在 batch 之内没有终端的 episode)。到今朝为止,LSTM 层类型应用了这个功能:
在这个示例架构中,稠密层的输出被送入一个 LSTM cell,然后其得出该时光步的最终输出。当向前推动该 LSTM 一步时,其内部状况会获得更新并给出此处的内部状况输出。对于下一?时光步,收集会获得新状况输入及这个内部状况,然后将该 LSTM 又推动一步并输出实际输出和新的内部 LSTM 状况,如斯持续……
对于带有内部状况的层的自定义实现,该函数不仅必须要返回该层的输出,并且还要返回一个内部状况输入占位符的列表、对应的内部状况输出张量和一个内部状况初始化张量列表(这些都长度雷同,并且按这个次序)。以下代码片段给出了我们的 LSTM 层实现(一个简化版本),并说清楚明了带有内部状况的自定义层的定义方法:
def lstm(x): size = x.get_shape()[1].value internal_input = tf.placeholder(dtype=tf.float32, shape=(None, 2, size)) lstm = tf.contrib.rnn.LSTMCell(num_units=size) state = tf.contrib.rnn.LSTMStateTuple(internal_input[:, 0, :], internal_input[:, 1, :]) x, state = lstm(inputs=x, state=state) internal_output = tf.stack(values=(state.c, state.h), axis=1) internal_init = np.zeros(shape=(2, size)) return x, [internal_input], [internal_output], [internal_init]
预处理状况
我们起首开端用 TensorForce API 创建一个强化进修智能体:
推荐阅读
【技巧沙龙】AI开辟者拭魅战营-7分钟打造1个定制技能。7月22号,我们等你一路! 1、常用的重要目次Linux和Windows操作体系中的文件体系些不合,在进修应用linux之前,可以或许懂得这个不>>>详细阅读
本文标题:基于TensorFlow打造强化学习API:TensorForce是怎样炼成的?
地址:http://www.17bianji.com/lsqh/36233.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示