Anaconda Python 2.7 Windows 10.の使用.
Keras exmapleを使用して言語モデルをトレーニングしています:
print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars))))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
def sample(a, temperature=1.0):
# helper function to sample an index from a probability array
a = np.log(a) / temperature
a = np.exp(a) / np.sum(np.exp(a))
return np.argmax(np.random.multinomial(1, a, 1))
# train the model, output generated text after each iteration
for iteration in range(1, 3):
print()
print('-' * 50)
print('Iteration', iteration)
model.fit(X, y, batch_size=128, nb_Epoch=1)
start_index = random.randint(0, len(text) - maxlen - 1)
for diversity in [0.2, 0.5, 1.0, 1.2]:
print()
print('----- diversity:', diversity)
generated = ''
sentence = text[start_index: start_index + maxlen]
generated += sentence
print('----- Generating with seed: "' + sentence + '"')
sys.stdout.write(generated)
for i in range(400):
x = np.zeros((1, maxlen, len(chars)))
for t, char in enumerate(sentence):
x[0, t, char_indices[char]] = 1.
preds = model.predict(x, verbose=0)[0]
next_index = sample(preds, diversity)
next_char = indices_char[next_index]
generated += next_char
sentence = sentence[1:] + next_char
sys.stdout.write(next_char)
sys.stdout.flush()
print()
Kerasのドキュメントによると、model.fit
メソッドはHistoryコールバックを返します。このコールバックには、連続する損失のリストとその他のメトリックを含むhistory属性があります。
hist = model.fit(X, y, validation_split=0.2)
print(hist.history)
モデルをトレーニングした後、print(model.history)
を実行すると、エラーが発生します。
AttributeError: 'Sequential' object has no attribute 'history'
上記のコードでモデルをトレーニングした後、モデル履歴を返すにはどうすればよいですか?
UPDATE
問題はそれでした:
以下を最初に定義する必要がありました。
from keras.callbacks import History
history = History()
コールバックオプションを呼び出す必要がありました
model.fit(X_train, Y_train, nb_Epoch=5, batch_size=16, callbacks=[history])
しかし、今私が印刷する場合
print(history.History)
それは戻ります
{}
繰り返しを実行しましたが。
解決されました。
損失はエポックの歴史のみに保存されます。 Kerasビルトインエポックオプションを使用する代わりに、反復を実行していました。
だから私は今持っている4つの反復を行う代わりに
model.fit(......, nb_Epoch = 4)
これで、エポックの実行ごとに損失が返されます。
print(hist.history)
{'loss': [1.4358016599558268, 1.399221191623641, 1.381293383180471, h1.3758836857303727]}
から始まったほんの一例
history = model.fit(X, Y, validation_split=0.33, nb_Epoch=150, batch_size=10, verbose=0)
使用できます
print(history.history.keys())
履歴内のすべてのデータをリストします。
その後、次のように検証損失の履歴を印刷できます。
print(history.history['val_loss'])
次の簡単なコードは私に最適です。
seqModel =model.fit(x_train, y_train,
batch_size = batch_size,
epochs = num_epochs,
validation_data = (x_test, y_test),
shuffle = True,
verbose=0, callbacks=[TQDMNotebookCallback()]) #for visualization
フィット関数を出力変数に必ず割り当ててください。その後、その変数に非常に簡単にアクセスできます
# visualizing losses and accuracy
train_loss = seqModel.history['loss']
val_loss = seqModel.history['val_loss']
train_acc = seqModel.history['acc']
val_acc = seqModel.history['val_acc']
xc = range(num_epochs)
plt.figure()
plt.plot(xc, train_loss)
plt.plot(xc, val_loss)
お役に立てれば。ソース: https://keras.io/getting-started/faq/#how-can-i-record-the-training-validation-loss-accuracy-at-each-Epoch
「acc」、「loss」などの履歴を持つ辞書が利用可能であり、hist.history
変数に保存されます。
もう1つのオプションはCSVLoggerです: https://keras.io/callbacks/#csvlogger 。各エポックの結果を追加するcsvファイルを作成します。トレーニングを中断しても、どのように進化したかを確認できます。
また、verbose=2
を使用して損失をケラに出力できることもわかりました。
history = model.fit(X, Y, validation_split=0.33, nb_Epoch=150, batch_size=10, verbose=2)
そして、次のような素敵な行が出力されます。
Epoch 1/1
- 5s - loss: 0.6046 - acc: 0.9999 - val_loss: 0.4403 - val_acc: 0.9999
ドキュメント によると:
verbose: 0, 1, or 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per Epoch.
実際には、反復法でも実行できます。なぜなら、各反復後にトレーニング結果を視覚化するために、組み込みのエポック法の代わりに反復法を使用する必要がある場合があるためです。
history = [] #Creating a empty list for holding the loss later
for iteration in range(1, 3):
print()
print('-' * 50)
print('Iteration', iteration)
result = model.fit(X, y, batch_size=128, nb_Epoch=1) #Obtaining the loss after each training
history.append(result.history['loss']) #Now append the loss after the training to the list.
start_index = random.randint(0, len(text) - maxlen - 1)
print(history)
この方法により、反復法を維持しながら、必要な損失を得ることができます。
損失を直接プロットするには、次のように機能します。
model.fit(X, Y, epochs= ... )
plt.plot(list(model.history.history.values())[0],'k-o')