Python CNTK中以下tensorflow片段的等效项是什么

Python CNTK中以下tensorflow片段的等效项是什么,python,cntk,Python,Cntk,我试图在CNTK中实现,并遇到了以下代码(使用Tensorflow)来创建批评家网络: state_input = tf.placeholder("float",[None,state_dim]) action_input = tf.placeholder("float",[None,action_dim]) W1 = self.variable([state_dim,layer1_size],state_dim) b1 = self.variable([layer1_size],state_

我试图在CNTK中实现,并遇到了以下代码(使用Tensorflow)来创建批评家网络:

state_input = tf.placeholder("float",[None,state_dim])
action_input = tf.placeholder("float",[None,action_dim])

W1 = self.variable([state_dim,layer1_size],state_dim)
b1 = self.variable([layer1_size],state_dim)
W2 = self.variable([layer1_size,layer2_size],layer1_size+action_dim)
W2_action = self.variable([action_dim,layer2_size],layer1_size+action_dim)
b2 = self.variable([layer2_size],layer1_size+action_dim)
W3 = tf.Variable(tf.random_uniform([layer2_size,1],-3e-3,3e-3))
b3 = tf.Variable(tf.random_uniform([1],-3e-3,3e-3))

layer1 = tf.nn.relu(tf.matmul(state_input,W1) + b1)
layer2 = tf.nn.relu(tf.matmul(layer1,W2) + tf.matmul(action_input,W2_action) + b2)
q_value_output = tf.identity(tf.matmul(layer2,W3) + b3)
其中self.variable定义为:

def variable(self,shape,f):
    return tf.Variable(tf.random_uniform(shape,-1/math.sqrt(f),1/math.sqrt(f)))
忽略随机初始化(我只想要结构),我尝试了以下操作:

state_in = cntk.input(state_dim, dtype=np.float32)
action_in = cntk.input_variable(action_dim, dtype=np.float32)

W1 = cntk.parameter(shape=(state_dim, layer1_size))
b1 = cntk.parameter(shape=(layer1_size))
W2 = cntk.parameter(shape=(layer1_size, layer2_size))
W2a = cntk.parameter(shape=(action_dim, layer2_size))
b2 = cntk.parameter(shape=(layer2_size))
W3 = cntk.parameter(shape=(layer2_size, 1))
b3 = cntk.parameter(shape=(1))

l1 = cntk.relu(cntk.times(state_in, W1) + b1)
l2 = cntk.relu(cntk.times(l1, W2) + cntk.times(action_in, W2a) + b2)
Q = cntk.times(l2, W3) + b3
但是,layer2的初始化失败,出现以下错误(代码段):

运行时错误:操作“加”:操作数“输出('Times24\u输出\u 0', [#,*],[300])具有与动态轴不匹配的动态轴 其他操作数的“[#]”


我想知道我做错了什么,以及如何准确地重新创建同一个模型。

原因是您在中将state\u定义为cntk。在中输入和action\u定义为cntk。默认情况下,input\u变量的类型略有不同:
cntk。input
会创建一个变量无法绑定到序列数据,而默认情况下,
cntk.input\u variable
会创建一个必须绑定到序列数据的变量(注意,
input\u variable
已被弃用,一些IDE(如PyCharm)会用删除线显示,请使用cntk.input()或cntk.sequence.input()

错误表示加号操作无法将具有动态轴[#](表示小批量维度)的
cntk.times(l1,W2)
与具有动态轴[#,*](表示小批量维度和序列维度)的
cntk.times(action_in,W2a)
相加

最简单的修复方法是声明

action\u in=cntk.input(action\u dim,dtype=np.float32)

这使得其余的操作进行了类型检查

谢谢!我的挫败感一定给我的视力蒙上了阴影。