使用两个神经网络的TensorFlow会话 – TypeError: Fetch参数None具有无效类型

我在stackoverflow上看到过类似的描述,但我找到的任何内容都不适合/解决我的问题。

我有一些强化学习任务,我想使用两个神经网络来控制两个自由度。

我有这样的代码,使用了两个神经网络:

def reset_graph(seed=42):    tf.reset_default_graph()    tf.set_random_seed(seed)    np.random.seed(seed)reset_graph()n_inputs = 10n_hidden = 8n_outputs = 3learning_rate = 0.0025initializer = tf.contrib.layers.variance_scaling_initializer()X1 = tf.placeholder(tf.float32, shape=[None, n_inputs],name='X1')hidden = tf.layers.dense(X1, 10, activation=tf.nn.tanh,name = 'hidden1', kernel_initializer=initializer)logits1 = tf.layers.dense(hidden, n_outputs,name='logit1')outputs1 = tf.nn.softmax(logits1,name='out1')action1 = tf.multinomial(logits1, num_samples=1,name='action1')cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= action1[0], logits=logits1,name='cross_e1')optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate,name='opt1')grads_and_vars = optimizer.compute_gradients(cross_entropy)gradients = [grad for grad, variable in grads_and_vars]gradient_placeholders = []grads_and_vars_feed = []for grad, variable in grads_and_vars:    gradient_placeholder = tf.placeholder(tf.float32)    gradient_placeholders.append(gradient_placeholder)    grads_and_vars_feed.append((gradient_placeholder, variable))training_op = optimizer.apply_gradients(grads_and_vars_feed)X2 = tf.placeholder(tf.float32, shape=[None, n_inputs],name='X2')initializer2 = tf.contrib.layers.variance_scaling_initializer()hidden2 = tf.layers.dense(X2, 10, activation=tf.nn.tanh,name='hidden2', kernel_initializer=initializer2)logits2 = tf.layers.dense(hidden2, 3,name='logit2')outputs2 = tf.nn.softmax(logits2,name='out2')action2 = tf.multinomial(logits2, num_samples=1,name='action2')cross_entropy2 = tf.nn.sparse_softmax_cross_entropy_with_logits(labels= action2[0], logits=logits2,name='cross_e2')optimizer2 = tf.train.GradientDescentOptimizer(learning_rate=0.002,name = 'opt2')grads_and_vars2 = optimizer2.compute_gradients(cross_entropy2)gradients2 = [grad2 for grad2, variable2 in grads_and_vars2]gradient_placeholders2 = []grads_and_vars_feed2 = []for grad2, variable2 in grads_and_vars2:    gradient_placeholder2 = tf.placeholder(tf.float32)    gradient_placeholders2.append(gradient_placeholder2)    grads_and_vars_feed2.append((gradient_placeholder2, variable2))training_op2 = optimizer2.apply_gradients(grads_and_vars_feed2)init = tf.global_variables_initializer()saver = tf.train.Saver()

当我运行以下代码时:

action_val,action_val2,gradients_val,gradients_val2 = sess.run([action,action2, gradients,gradients2], feed_dict={X1: obs.reshape(1, n_inputs),X2: obs.reshape(1, n_inputs)})

我遇到了一个错误:

TypeError                                 Traceback (most recent call last)<ipython-input-70-fb66a94fa4dc> in <module>     50                 reward, done, obs = agent.step(rotor_speeds)     51 ---> 52                 action_val,gradients_val,action_val2,gradients_val2 = sess.run([action, gradients,action2, gradients2], feed_dict={X1: obs.reshape(1, n_inputs),X2: obs.reshape(1, n_inputs)})...TypeError: Fetch参数None具有无效类型

问题出在gradients2上。当我计算图的其他部分时,它工作得很好。例如:

action_val,action_val2,gradients_val = sess.run(([action1,action2,gradients]),feed_dict={X1: obs.reshape(1, n_inputs),X2: obs.reshape(1, n_inputs)})

它没有问题地工作。

另外,我很好奇为什么在上述代码生成的图中,第一个神经网络的隐藏层(hidden1)和logits(logit1)连接到了第二个优化器(opt2),因为我在代码中没有看到这些不需要的连接。也许这是问题的根源,但我也不知道如何更改它。enter image description here


回答:

让我们看看gradients2,因为它似乎引起了错误:

>>> gradients2[None, None, None, None, <tf.Tensor 'gradients_1/hidden2/MatMul_grad/tuple/control_dependency_1:0' shape=(10, 10) dtype=float32>, <tf.Tensor 'gradients_1/hidden2/BiasAdd_grad/tuple/control_dependency_1:0' shape=(10,) dtype=float32>, <tf.Tensor 'gradients_1/logit2/MatMul_grad/tuple/control_dependency_1:0' shape=(10, 3) dtype=float32>, <tf.Tensor 'gradients_1/logit2/BiasAdd_grad/tuple/control_dependency_1:0' shape=(3,) dtype=float32>]

前四个元素是None,这解释了为什么sess.run()失败(你不能评估None)。

那么为什么gradients2包含None值呢?这些值来自grads_and_vars2,所以让我们看看它:

>>> grads_and_vars2[(None, <tf.Variable 'hidden1/kernel:0' shape=(10, 10) dtype=float32_ref>), (None, <tf.Variable 'hidden1/bias:0' shape=(10,) dtype=float32_ref>), (None, <tf.Variable 'logit1/kernel:0' shape=(10, 3) dtype=float32_ref>), (None, <tf.Variable 'logit1/bias:0' shape=(3,) dtype=float32_ref>), (<tf.Tensor 'gradients_1/hidden2/MatMul_grad/tuple/control_dependency_1:0' shape=(10, 10) dtype=float32>,  <tf.Variable 'hidden2/kernel:0' shape=(10, 10) dtype=float32_ref>), (<tf.Tensor 'gradients_1/hidden2/BiasAdd_grad/tuple/control_dependency_1:0' shape=(10,) dtype=float32>,  <tf.Variable 'hidden2/bias:0' shape=(10,) dtype=float32_ref>), (<tf.Tensor 'gradients_1/logit2/MatMul_grad/tuple/control_dependency_1:0' shape=(10, 3) dtype=float32>,  <tf.Variable 'logit2/kernel:0' shape=(10, 3) dtype=float32_ref>), (<tf.Tensor 'gradients_1/logit2/BiasAdd_grad/tuple/control_dependency_1:0' shape=(3,) dtype=float32>,  <tf.Variable 'logit2/bias:0' shape=(3,) dtype=float32_ref>)]

None值对应于变量hidden1/kernelhidden1/biaslogit1/kernellogit1/bias。这些是hidden1logit1密集层的参数。这意味着什么?考虑grads_and_vars2是如何计算的:

grads_and_vars2 = optimizer2.compute_gradients(cross_entropy2)

所以我们要求TensorFlow计算cross_entropy2相对于TensorFlow图中所有变量的梯度。这包括cross_entropy2根本不依赖的变量,例如hidden1logit1密集层的参数。这就是为什么会有一些None值。

由于sess.run()不允许你评估None值,你会得到一个错误。

为了消除这个错误,你可以简单地过滤掉None值:

gradients = [grad for grad, variable in grads_and_vars if grad is not None]...gradients2 = [grad2 for grad2, variable2 in grads_and_vars2 if grad2 is not None]

错误应该会消失。

作为补充说明:我建议你查看TensorFlow 2(使用tf.keras):它使用起来更加简单。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注