Как вернуть историю потери валидации в Keras
Использование 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
возвращает обратный вызов истории, в котором есть атрибут истории, содержащий списки последовательных потерь и других показателей.
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()
Опцию callbacks нужно было называть
model.fit(X_train, Y_train, nb_epoch=5, batch_size=16, callbacks=[history])
Но теперь, если я печатаю
print(history.History)
он возвращает
{}
хотя я запускал итерацию.
Ответы
Ответ 1
Это было решено.
Потери сохраняются только в истории за эпохи. Я использовал итерации вместо использования опций Keras, построенных в эпоху.
поэтому вместо 4 итераций теперь у меня
model.fit(......, nb_epoch = 4)
Теперь он возвращает потерю для каждого прогона эпохи:
print(hist.history)
{'loss': [1.4358016599558268, 1.399221191623641, 1.381293383180471, h1.3758836857303727]}
Ответ 2
Только пример начался с
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'])
Ответ 3
Следующий простой код отлично работает для меня:
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
Ответ 4
Словарь с историями "acc", "loss" и т.д. доступен и сохраняется в переменной hist.history
.
Ответ 5
Другим вариантом является CSVLogger: https://keras.io/callbacks/#csvlogger.
Он создает файл csv, добавляющий результат каждой эпохи. Даже если вы прервите обучение, вы увидите, как оно развилось.
Ответ 6
Я также обнаружил, что вы можете использовать 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.
Ответ 7
На самом деле, вы также можете сделать это с помощью метода итерации. Потому что иногда нам может понадобиться использовать метод итерации вместо встроенного метода эпох, чтобы визуализировать результаты обучения после каждой итерации.
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)
Этот способ позволяет вам получить потери, которые вы хотите, поддерживая свой метод итерации.
Ответ 8
Для нанесения ущерба непосредственно следуют следующие работы:
model_ = model.fit(X, Y, epochs= ..., verbose=1 )
plt.plot(list(model_.history.values())[0],'k-o')