2017-07-20 37 views
7

Keras模型可以通過函數API在張量中用作Tensorflow函數,如here所述。在具有Tensorflow張量的Keras模型中使用InputLayer(或輸入)有什麼優勢?

因此,我們可以這樣做:

from keras.layers import InputLayer 

a = tf.placeholder(dtype=tf.float32, shape=(None, 784)) 

model = Sequential() 
model.add(InputLayer(input_tensor=a, input_shape=(None, 784))) 
model.add(Dense(32, activation='relu')) 
model.add(Dense(10, activation='softmax')) 

output = model.output 

這是一個張:

<tf.Tensor 'dense_24/Softmax:0' shape=(?, 10) dtype=float32> 

但是,這也是工作沒有任何InputLayer

a = tf.placeholder(dtype=tf.float32, shape=(None, 784)) 

model = Sequential() 
model.add(Dense(32, activation='relu', input_shape=(784,))) 
model.add(Dense(10, activation='softmax')) 

output = model(a) 

作品,output有與之前相同的形狀:

<tf.Tensor 'sequential_9/dense_22/Softmax:0' shape=(?, 10) dtype=float32> 

我認爲第一種形式允許:

  • 來明確地附上inputsoutputs爲(名稱相同的)模型的屬性,所以我們可以在其他地方重複使用。例如與其他TF操作。
  • 將給定的張量轉換成Keras輸入,並附加元數據(如the source code中所述的_keras_history)。

但是,這不是我們不能用第二種形式做的,所以,有沒有InputLayer(和Input更不用說)的特殊用途(除了多個輸入)?
此外,InputLayer是棘手的,因爲它是用input_shape不同於其他keras層:我們指定批量大小(None這裏),這不是通常的情況下...

回答

5

這似乎是InputLayer有一些用途:

  • 首先,它可以讓你得到純的tensorflow張量原樣,而無需指定它們的形狀。例如。你可以寫

    model.add(InputLayer(input_tensor=a)) 
    

    這是很好的幾個明顯的原因,其中包括較少的重複。

  • 其次,它們允許您使用單個輸入編寫非順序網絡,例如,

     a 
        /\ 
        / \ 
    / \ 
    conv1 conv2 
        |  | 
    

    沒有InputLayer你需要明確養活conv1conv2同張量,或建立在模型上任意標識層。也不是很令人愉快。

  • 最後,它們消除了「也是輸入的圖層」和「正常圖層」之間的任意區別。如果使用InputLayer,則可以在輸入什麼層和哪些層執行某些操作之間有明確區別的地方編寫代碼。這提高了代碼的可讀性,並使得重構更容易。例如,替換第一層變得與替換任何其他層一樣容易,您不需要考慮input_shape

相關問題