2017-09-28 3 views
2

私はKerasベースの単純なLSTMモデルを持っています。ケラスに基づくLSTMモデルの各エポックで1つのレイヤーのウェイトマトリックスを取得する方法は?

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のwikiの解決策を見つけられませんでした。

答えて

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に収集されます、各エポックでの最後の層の重みを取得してそれを使用する

関連する問題