2017-02-12 147 views
3

我有一個我在Keras中構建的順序模型。 我試圖弄清楚如何改變輸入的形狀。在下面的例子如何在Keras中的順序模型中更改輸入形狀

model = Sequential() 
model.add(Dense(32, input_shape=(500,))) 
model.add(Dense(10, activation='softmax')) 
model.compile(optimizer='rmsprop', 
     loss='categorical_crossentropy', 
     metrics=['accuracy']) 

讓我們說,我想建立與不同的輸入形狀的新模式,概念這應該是這樣的:

model1 = model 
model1.layers[0] = Dense(32, input_shape=(250,)) 

有修改模型輸入形狀的方法?

回答

1

想想在這種情況下改變輸入形狀意味着什麼。

你的第一個模型

model.add(Dense(32, input_shape=(500,))) 

具有致密層這確實是一個500x32矩陣。

如果將輸入更改爲250個元素,則圖層的矩陣和輸入維度將不匹配。

但是,如果您嘗試實現的是重複使用最後一層來自第一個500元素輸入模型的訓練參數,則可以通過get_weights獲得這些權重。然後,您可以重新構建新模型並使用set_weights在新模型中設置值。

model1 = Sequential() 
model1.add(Dense(32, input_shape=(250,))) 
model1.add(Dense(10, activation='softmax')) 
model1.layers[1].set_weights(model1.layers[1].get_weights()) 

記住MODEL1第一層(又名model1.layers [0])仍然是未經訓練的

+0

是否有保持整個模型並改變輸入層的方法?實際上我有一個複雜的模型,我想用全套輸入和部分輸入組來進行訓練並比較結果。我尋找一種方法來修改modlel1中的輸入尺寸,同時保持模型的其餘部分完全相同(當然除了輸入尺寸和固定層) –

+0

我認爲不是。正如我所說,尺寸不匹配。如果你想知道你的模型在部分輸入方面的表現如何,我會建議僅用你的部分輸入來訓練一個不同的模型。你可以做什麼,但如果你真的想在不同尺寸輸入的情況下使用相同的模型,可以使用RNN而不是MLP。 – maz

1

有點關係,所以希望有人會發現這很有用:如果你有一個現有的模型,其中input是一個看起來像(None,None,None,3)的佔位符,例如,您可以加載模型,用具體形狀的輸入替換第一個圖層。比如當你想使用的iOS CoreML模型(在我的情況下,模型是一個MLMultiArray代替CVPixelBuffer,模型編譯失敗的輸入),這種轉變是非常有用的

from keras.models import load_model 
from keras import backend as K 
from keras.engine import InputLayer 
import coremltools 

model = load_model('your_model.h5') 

# Create a new input layer to replace the (None,None,None,3) input layer : 
input_layer = InputLayer(input_shape=(272, 480, 3), name="input_1") 

# Save and convert : 
model.layers[0] = input_layer 
model.save("reshaped_model.h5")  
coreml_model = coremltools.converters.keras.convert('reshaped_model.h5')  
coreml_model.save('MyPredictor.mlmodel')