我正在尝试使用tensorflow编写一个强化学习代理。我在想国家是否应该。变量或可以是使用梯度磁带反向传播的numpy数组。我不确定如果我的状态/动作数组是numpy而不是tensorflow数组,梯度是否正确,我知道损失函数返回一个tf。然而变量。谢谢,我仍然是使用Tensorflow的初学者,任何解释/建议都会有很大帮助。
在一个非常简化的形式(不是逐字),我的代码看起来像:with tf.GradientTape as tape:
#actions/states are both lists of np arrays
action = model.call(state)
states.append(state)
actions.append(actions)
loss = model.loss(states,actions) #loss returns tf.variable
model.optimizer.apply_gradients(tape.gradient(loss, model.variables)
嗨,新手:)optimizer.apply_gradients
操作将只更新具有非零梯度的模型tf.Variable
s(参见输入参数model.variables
)。
参考:https://www.tensorflow.org/api_docs/python/tf/GradientTape
可训练变量(由tf创建)。变量或tf. pat.v1.get_variable,其中trainable=True是两者的默认值案例)被自动监视。张量可以通过调用此上下文管理器上的watch方法。
编辑如果你想调用模型来预测给定的numpy数组:这是可能的。根据文献,model.call()
的输入应该是一个张量对象。您可以简单地从numpy数组中获得一个张量:
state # numpy array
tf_state = tf.constant(state)
model.call(tf_state)
当然,不是为训练循环的每次迭代创建新的tf.constant
,你可以首先初始化一个(不可训练的)tf.Variables
,然后用numpy数组的值更新它的值!下面的代码应该可以工作:
tf_state = tf.Variable(np.zeros_like(state), dtype=tf.float32, trainable=False)
for iter in n_train_iterations:
state = get_new_numpy_state()
tf_state.assign(state)
model.call(tf_state)