2017-04-12 50 views
1
相當於

我想實現CNTK DDPG和整個下面的代碼(使用Tensorflow)創建評論家網絡傳來:什麼是以下tensorflow片段的CNTK

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 

但是,二層的初始化失敗,出現以下錯誤(片段):

RuntimeError: Operation 'Plus': Operand 'Output('Times24_Output_0', [#, *], [300])' has dynamic axes, that do not match the dynamic axes '[#]' of the other operands.

我想知道我做錯了,如何準確地重新創建相同的模型。

回答

2

的原因是,你必須定義state_incntk.inputaction_incntk.input_variable在默認情況下略有不同的類型:cntk.input默認創建不能被綁定到的序列數據的變量,而cntk.input_variable默認創建必須是一個變量綁定到序列數據(NB input_variable已被棄用,並且一些像PyCharm這樣的IDE會以刪除線顯示,請使用cntk.input()或cntk.sequence.input())。

錯誤說,加上操作不能添加cntk.times(l1, W2)具有動態軸[#]與cntk.times(action_in, W2a),其具有動態軸(意味着minibatch尺寸)[#,*](意味着minibatch和序列尺寸)。

最簡單的解決方法是聲明 action_in = cntk.input(action_dim, dtype=np.float32) 這使得其餘的操作類型檢查。

+0

謝謝!我的挫敗感一定使我的視野蒙上陰影。 –

相關問題