假设您的数据和预处理如下:
num_classes = 10
input_shape = (28, 28, 1)
(x_train, y_train), (x_valid, y_valid) = keras.datasets.mnist.load_data()
y_train_cp = y_train
y_valid_cp = y_valid
x_train = x_train.astype("float32") / 255
x_valid = x_valid.astype("float32") / 255
x_train = np.expand_dims(x_train, -1)
x_valid = np.expand_dims(x_valid, -1)
print("x_train shape:", x_train.shape)
print(x_train.shape[0], "train samples")
print(x_valid.shape[0], "validation samples")
y_train = keras.utils.to_categorical(y_train, num_classes)
y_valid = keras.utils.to_categorical(y_valid, num_classes)
您可以创建多个验证,例如
_, x_train_subset, _, y_train_subset = train_test_split(x_train, y_train, test_size=0.25, random_state=42)
validationMasks = {}
for i in range(0,10):
validationMasks[i] = y_valid_cp==i
validationSets = {}
validationSets['train_sub'] = datagen_valid.flow(x_train_subset,y_train_subset)
validationSets['1'] = datagen_train.flow(x_valid[validationMasks[1]],y_valid[validationMasks[1]])
validationSets['0'] = datagen_train.flow(x_valid[validationMasks[0]],y_valid[validationMasks[0]])
validationSets['6'] = datagen_train.flow(x_valid[validationMasks[6]],y_valid[validationMasks[6]])
validationSets['8'] = datagen_train.flow(x_valid[validationMasks[8]],y_valid[validationMasks[8]])
现在,您可以使用自定义回调
class MultipleValidationCallBack(keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs=None):
for thisValidationType in validationSets:
thisLoss = self.model.evaluate(validationSets[thisValidationType])
logs[thisValidationType+"_loss"] = thisLoss[0]
logs[thisValidationType+"_acc"] = thisLoss[1]
模型拟合可以像这样,
modelLog = getModel().fit(
datagenFlow_train,validation_data=datagenFlow_valid,
callbacks=[MultipleValidationCallBack()],
epochs=5)
historyDf = pd.DataFrame(modelLog.history)
historyDf[['train_sub_loss','val_loss','0_loss','1_loss']].plot()
详情请参考可运行的端到端代码,解释请看Medium上的一篇文章
self.model.metrics[i-1]
是一个字符串。__name__
不再必要(并且会生成错误)。 - Waylon Flinn