我的问题很简单,什么是验证数据传递的顺序模型model.fit 使用?
并且,它是否会影响模型的训练方式(通常使用验证集,例如,在模型中选择超参数,但我认为这不会发生在这里)?
我在谈论可以像这样传递的验证集:
# Create model
model = Sequential()
# Add layers
model.add(...)
# Train model (use 10% of training set as validation set)
history = model.fit(X_train, Y_train, validation_split=0.1)
# Train model (use validation data as validation set)
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test))
Run Code Online (Sandbox Code Playgroud)
我调查了一下,我看到keras.models.Sequential.fit
调用keras.models.training.fit
,这就好比创建变量val_acc
和val_loss
(可从回调来访问).keras.models.training.fit
还调用keras.models.training._fit_loop
,它将验证数据添加到callbacks.validation_data
调用中,并且还调用keras.models.training._test_loop
,这将self.test_function
在模型的批量上循环验证数据.此函数的结果用于填充日志的值,这些值是可从回调中访问的值.
看到这一切之后,我觉得传递给它的验证集model.fit
并不用于在训练期间验证任何东西,它的唯一用途是获得关于训练模型在完全独立集合的每个时期中如何执行的反馈.因此,使用相同的验证和测试集会很好,对吧?
任何人都可以确认除了从回调中读取之外,model.fit中的验证集是否还有其他任何目标?
我正在尝试使用mnist数据集训练一个简单的神经网络.出于某种原因,当我得到历史记录(从model.fit返回的参数)时,验证准确性高于训练准确度,这真的很奇怪,但如果我在评估模型时检查分数,我会得到更高的训练精度高于测试精度.
无论模型的参数如何,每次都会发生这种情况.此外,如果我使用自定义回调并访问参数'acc'和'val_acc',我会发现同样的问题(数字与历史记录中返回的数字相同).
请帮我!我究竟做错了什么?为什么验证准确度高于训练准确度(您可以看到我在查看损失时遇到同样的问题).
这是我的代码:
#!/usr/bin/env python3.5
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
from keras import backend
from keras.utils import np_utils
from keras import losses
from keras import optimizers
from keras.datasets import mnist
from keras.models import Sequential
from matplotlib import pyplot as plt
# get train and test data (minst) and reduce volume to speed up (for testing)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
data_reduction = 20
x_train = x_train[:x_train.shape[0] // …
Run Code Online (Sandbox Code Playgroud)