Python 具有两个神经网络的TensorFlow会话-类型错误:获取参数无无效类型<;类别';非类型'&燃气轮机;

Python 具有两个神经网络的TensorFlow会话-类型错误:获取参数无无效类型<;类别';非类型'&燃气轮机;,python,tensorflow,machine-learning,deep-learning,typeerror,Python,Tensorflow,Machine Learning,Deep Learning,Typeerror,我在stackoverflow上看到过类似的问题,但我发现任何适合/解决我的问题的方法 当我想用两个神经网络控制两个自由度时,我有一些强化学习任务 我有一个这样的代码,带有两个神经网络: def reset_graph(seed=42): tf.reset_default_graph() tf.set_random_seed(seed) np.random.seed(seed) reset_graph() n_inputs = 10 n_hidden = 8 n_o

我在stackoverflow上看到过类似的问题,但我发现任何适合/解决我的问题的方法

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

我有一个这样的代码,带有两个神经网络:


def reset_graph(seed=42):
    tf.reset_default_graph()
    tf.set_random_seed(seed)
    np.random.seed(seed)

reset_graph()

n_inputs = 10
n_hidden = 8
n_outputs = 3

learning_rate = 0.0025

initializer = 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 argument None has invalid type <class 'NoneType'>
它毫无问题地工作

另外,我想知道为什么在由上述代码生成的图上,第一个神经网络的隐藏层(hidden1)和logit(logit1)连接到第二个优化器(opt2),因为我在代码中没有看到这种不必要的连接。也许这是问题的原因,但我也不知道如何改变它。

让我们看看
梯度2
,因为它似乎会导致错误:

>>梯度2
[无,
没有一个
没有一个
没有一个
,
,
,
]
前4个元素是
None
,这解释了
sess.run()
失败的原因(您无法计算
None

那么为什么
gradients2
包含
None
值呢?这些值来自
grads\u和\u vars2
,让我们来看看它:

>>年级和变量2
[(无,),
(无),,
(无),,
(无),,
(,
),
(,
),
(,
),
(,
)]
None
值对应变量
hidden1/kernel
hidden1/bias
logit1/kernel
logit1/bias
。这些是
hidden1
logit1
密集层的参数。这是什么意思?考虑< <代码> GrassS1和Vals2如何计算:

grads_和_vars2=optimizer2.计算梯度(交叉熵2)
因此,我们要求TensorFlow计算有关TensorFlow图中所有变量的
交叉熵2
梯度。这包括根本不依赖于的变量,例如
hidden1
logit1
密集层的参数。这就是为什么存在一些
None
值的原因

由于
sess.run()
不允许您计算
None
值,因此会出现错误

要消除此错误,只需过滤掉
None
值:

gradients=[grad for grad,grads_和_vars中的变量,如果grad不是None]
...
gradients2=[grad2代表grad2,grad2不是无时,grads_和_vars2中的变量2]
错误应该消失


作为旁注:我鼓励您检查TensorFlow 2(使用tf.keras):它更易于使用。

我注意到两件事:在错误输出中,有错误的行有“X”,其余代码有“X1”;cross_entropy2被命名为“cross_e1”。你能检查一下这两个是否是问题吗?谢谢通知,但问题仍然是一样的(我有相同的错误),所以,据我所知,第二个优化器(opt2)和第一个神经网络中的隐藏层和逻辑之间的连接是TensorFlow的正常行为吗?是的,在TensorFlow 1中,
tf.gradients(foo)
优化器。计算梯度(foo)
计算图中所有变量的
foo
梯度(
tf.global\u variables()
)。这是TF1中的一个设计缺陷,在TF2中修复了该缺陷。在TF2中,情况要好得多。您构建了一个模型(使用tf.keras),它拥有其变量的所有权。当您调用
model.compile(…)
时,将创建相应的图形,其中仅基于模型变量计算梯度。干净多了。
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)})