简体   繁体   English

如何在 Keras 中返回验证丢失的历史记录

[英]How to return history of validation loss in Keras

Using Anaconda Python 2.7 Windows 10.使用 Anaconda Python 2.7 Windows 10。

I am training a language model using the Keras exmaple:我正在使用 Keras 示例训练语言 model:

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()

According to Keras documentation, the model.fit method returns a History callback, which has a history attribute containing the lists of successive losses and other metrics.根据 Keras 文档, model.fit方法返回一个 History 回调,该回调具有一个包含连续损失列表和其他指标的 history 属性。

hist = model.fit(X, y, validation_split=0.2)
print(hist.history)

After training my model, if I run print(model.history) I get the error:训练我的 model 后,如果我运行print(model.history) ,我会收到错误:

 AttributeError: 'Sequential' object has no attribute 'history'

How do I return my model history after training my model with the above code?在使用上述代码训练我的 model 后,如何返回我的 model 历史记录?

UPDATE更新

The issue was that:问题是:

The following had to first be defined:必须首先定义以下内容:

from keras.callbacks import History 
history = History()

The callbacks option had to be called必须调用回调选项

model.fit(X_train, Y_train, nb_epoch=5, batch_size=16, callbacks=[history])

But now if I print但现在如果我打印

print(history.History)

it returns它返回

{}

even though I ran an iteration.即使我运行了一个迭代。

It's been solved.已经解决了。

The losses only save to the History over the epochs.损失只保存到历史上的时代。 I was running iterations instead of using the Keras built in epochs option.我正在运行迭代而不是使用 Keras 内置的 epochs 选项。

so instead of doing 4 iterations I now have所以我现在没有进行 4 次迭代

model.fit(......, nb_epoch = 4)

Now it returns the loss for each epoch run:现在它返回每个 epoch 运行的损失:

print(hist.history)
{'loss': [1.4358016599558268, 1.399221191623641, 1.381293383180471, 1.3758836857303727]}

Just an example started from只是一个例子从

history = model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, verbose=0)

You can use你可以使用

print(history.history.keys())

to list all data in history.列出历史记录中的所有数据。

Then, you can print the history of validation loss like this:然后,您可以像这样打印验证损失的历史记录:

print(history.history['val_loss'])

The following simple code works great for me:以下简单的代码对我很有用:

    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

Make sure you assign the fit function to an output variable.确保将拟合函数分配给输出变量。 Then you can access that variable very easily然后您可以非常轻松地访问该变量

# 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)

Hope this helps.希望这会有所帮助。 source: https://keras.io/getting-started/faq/#how-can-i-record-the-training-validation-loss-accuracy-at-each-epoch来源: https : //keras.io/getting-started/faq/#how-can-i-record-the-training-validation-loss-accuracy-at-each-epoch

具有“acc”、“loss”等历史的字典可用并保存在hist.history变量中。

I have also found that you can use verbose=2 to make keras print out the Losses:我还发现您可以使用verbose=2使 keras 打印出损失:

history = model.fit(X, Y, validation_split=0.33, nb_epoch=150, batch_size=10, verbose=2)

And that would print nice lines like this:这会打印出像这样的漂亮线条:

Epoch 1/1
 - 5s - loss: 0.6046 - acc: 0.9999 - val_loss: 0.4403 - val_acc: 0.9999

According to their documentation :根据他们的文档

verbose: 0, 1, or 2. Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch.

For plotting the loss directly the following works:为了直接绘制损失,以下工作:

import matplotlib.pyplot as plt
...    
model_ = model.fit(X, Y, epochs= ..., verbose=1 )
plt.plot(list(model_.history.values())[0],'k-o')

Another option is CSVLogger: https://keras.io/callbacks/#csvlogger .另一种选择是 CSVLogger: https ://keras.io/callbacks/#csvlogger。 It creates a csv file appending the result of each epoch.它创建一个 csv 文件,附加每个时期的结果。 Even if you interrupt training, you get to see how it evolved.即使你中断训练,你也能看到它是如何演变的。

Actually, you can also do it with the iteration method.其实,你也可以用迭代法来做。 Because sometimes we might need to use the iteration method instead of the built-in epochs method to visualize the training results after each iteration.因为有时我们可能需要使用迭代方法而不是内置的 epochs 方法来可视化每次迭代后的训练结果。

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)

This way allows you to get the loss you want while maintaining your iteration method.这种方式可以让您在保持迭代方法的同时获得想要的损失。

Thanks to Alloush,感谢 Alloush,

Following parameter must be included in model.fit() :以下参数必须包含在model.fit()

validation_data = (x_test, y_test)

If it is not defined, val_acc and val_loss will not be exist at output.如果未定义, val_acc输出时将不存在val_accval_loss

Those who got still error like me:那些仍然像我一样错误的人:

Convert model.fit_generator() to model.fit()model.fit_generator()转换为model.fit()

you can get loss and metrics like below: returned history object is dictionary and you can access model loss( val_loss) or accuracy(val_accuracy) like below:您可以获得如下损失和指标:返回的历史 object 是字典,您可以访问 model 损失(val_loss)或准确度(val_accuracy),如下所示:

model_hist=model.fit(train_data,train_lbl,epochs=my_epoch,batch_size=sel_batch_size,validation_data=val_data)

acc=model_hist.history['accuracy']

val_acc=model_hist.history['val_accuracy']

loss=model_hist.history['loss']

val_loss=model_hist.history['val_loss']

dont forget that for getting val_loss or val_accuracy you should specify validation data in the "fit" function.不要忘记,要获得 val_loss 或 val_accuracy,您应该在“适合”function 中指定验证数据。

history = model.fit(partial_train_data, partial_train_targets,
validation_data=(val_data, val_targets),
epochs=num_epochs, batch_size=1, verbose=0)
mae_history = history.history['val_mean_absolute_error']

I had the same problem. The following code worked  for me.

mae_history = history.history['val_mae']

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM