2017-09-28 64 views
2

我有一個簡單的基於Keras的LSTM模型。如何在基於Keras的LSTM模型的每個時期獲得一層的權重矩陣?

X_train, X_test, Y_train, Y_test = train_test_split(input, labels, test_size=0.2, random_state=i*10) 

X_train = X_train.reshape(80,112,12) 
X_test = X_test.reshape(20,112,12) 

y_train = np.zeros((80,112),dtype='int') 
y_test = np.zeros((20,112),dtype='int') 

y_train = np.repeat(Y_train,112, axis=1) 
y_test = np.repeat(Y_test,112, axis=1) 
np.random.seed(1) 

# create the model 
model = Sequential() 
batch_size = 20 

model.add(BatchNormalization(input_shape=(112,12), mode = 0, axis = 2))#4 
model.add(LSTM(100, return_sequences=False, input_shape=(112,12))) #7 

model.add(Dense(112, activation='hard_sigmoid'))#9 
model.compile(loss='binary_crossentropy', optimizer='RMSprop', metrics=['binary_accuracy'])#9 

model.fit(X_train, y_train, nb_epoch=30)#9 

# Final evaluation of the model 
scores = model.evaluate(X_test, y_test, batch_size = batch_size, verbose=0) 

我知道如何model.get_weights()得到權重表,但是這就是價值後的模型被充分訓練。我想在每個時代獲得權重矩陣(例如,我的LSTM中的最後一個圖層),而不僅僅是它的最終值。換句話說,我有30個時代,我需要得到30個重量矩陣值。

真的很感謝你們,我沒有找到keras的維基的解決方案。

回答

5

你可以寫一個自定義的回調是:

from keras.callbacks import Callback 

class CollectWeightCallback(Callback): 
    def __init__(self, layer_index): 
     super(CollectWeightCallback, self).__init__() 
     self.layer_index = layer_index 
     self.weights = [] 

    def on_epoch_end(self, epoch, logs=None): 
     layer = self.model.layers[self.layer_index] 
     self.weights.append(layer.get_weights()) 

回調的屬性self.model是對模型的引用的培訓。訓練開始時,通過Callback.set_model()進行設置。

爲了得到最後層的重量在每個時期,與使用它:

cbk = CollectWeightCallback(layer_index=-1) 
model.fit(X_train, y_train, nb_epoch=30, callbacks=[cbk]) 

然後將權重矩陣將被收集到cbk.weights