2017-03-16 87 views
0

我想重寫一段使用Keras的tflearn代碼。如何使用特定的權重和偏置在keras中組合兩層?

目標是結合兩個輸入,其中一個輸入跳過第一個層。下面的代碼在tflearn:

# Two different inputs. 
    inputs = tflearn.input_data(shape=[None, 10]) 
    action = tflearn.input_data(shape=[None, 10]) 

    #First layer used only by the inputs 
    net = tflearn.fully_connected(inputs, 400, activation='relu') 

    # Add the action tensor in the 2nd hidden layer 
    # Use two temp layers to get the corresponding weights and biases 
    t1 = tflearn.fully_connected(net, 300) 
    t2 = tflearn.fully_connected(action, 300) 

    # Combine the two layers using the weights from t1 and t2 and the bias from t2 
    net = tflearn.activation(tf.matmul(net,t1.W) + tf.matmul(action, t2.W) + t2.b, activation='relu') 

我嘗試使用下面的代碼複製在Keras驗證碼:

# Two different inputs. 
    inputs = tf.placeholder(tf.float32, [None, 10]) 
    action = tf.placeholder(tf.float32, [None, 10]) 

    #First layer used only by the inputs 
    t1 = Sequential() 
    t1.add(Dense(400, activation='relu', input_shape=(1,10))) 

    # Add the action tensor in the 2nd hidden layer 
    # Use two temp layers to get the corresponding weights and biases 
    t1.add(Dense(300)) 

    t2 = Sequential() 
    t2.add(Dense(300, input_shape=(1,10))) 

    # Combine the two layers 
    critnet = Sequential() 
    critnet.add(Merge([t1, t2], mode='sum')) 
    critnet.add(Activation('relu')) 

    # Create the net using the inputs and action placeholder 
    net = critnet([inputs, action]) 

在keras的代碼具有不同的行爲。如何結合keras中的兩個層以獲得與tflearn中相同的結果?

+1

不確定你的行爲有什麼不同,但這兩個代碼是非常不同的。首先在tflearn代碼中添加一個偏差項(keras代碼中不存在)。然後,tflearn代碼以ReLU激活結束(可以通過.add(激活('relu')))添加到keras中)。 「使用兩個臨時層來獲得相應的權重和偏見」對此沒有任何意義。 – maz

+0

謝謝。 relu激活層確實缺失。我已經添加了它。 評論''使用兩個臨時層來獲得相應的權重和偏差''這意味着我們可以使用t1和t2中的權重和偏差來組合它們並形成一個新層。 在Keras中,我們可以使用Merge合併圖層,如代碼中所示,但是有什麼方法可以合併它們,就像它在tflearn代碼中完成的一樣。 –

回答

0

您可以使用一個Lambda層take以2層作爲輸入並使用keras.backend以相同的方式合併它們。我認爲matmul有K.dot。

相關問題