r - Keras 模型中训练和验证样本较小时如何衡量过拟合

标签 r machine-learning neural-network deep-learning keras

我有以下情节:

enter image description here

模型是使用以下数量的样本创建的:

                class1     class2
train             20         20
validate          21         13

根据我的理解,情节显示没有过度拟合。但我觉得, 由于样本很小,我不确定模型是否具有通用性 足够的。

除了上面的图之外,还有其他方法来衡量过度拟合吗?

这是我的完整代码:

library(keras)
library(tidyverse)


train_dir <- "data/train/"
validation_dir <- "data/validate/"



# Making model ------------------------------------------------------------


conv_base <- application_vgg16(
  weights = "imagenet",
  include_top = FALSE,
  input_shape = c(150, 150, 3)
)

# VGG16 based model -------------------------------------------------------

# Works better with regularizer
model <- keras_model_sequential() %>%
  conv_base() %>%
  layer_flatten() %>%
  layer_dense(units = 256, activation = "relu", kernel_regularizer = regularizer_l1(l = 0.01)) %>%
  layer_dense(units = 1, activation = "sigmoid")

summary(model)

length(model$trainable_weights)
freeze_weights(conv_base)
length(model$trainable_weights)


# Train model -------------------------------------------------------------
desired_batch_size <- 20 

train_datagen <- image_data_generator(
  rescale = 1 / 255,
  rotation_range = 40,
  width_shift_range = 0.2,
  height_shift_range = 0.2,
  shear_range = 0.2,
  zoom_range = 0.2,
  horizontal_flip = TRUE,
  fill_mode = "nearest"
)

# Note that the validation data shouldn't be augmented!
test_datagen <- image_data_generator(rescale = 1 / 255)


train_generator <- flow_images_from_directory(
  train_dir, # Target directory
  train_datagen, # Data generator
  target_size = c(150, 150), # Resizes all images to 150 × 150
  shuffle = TRUE,
  seed = 1,
  batch_size = desired_batch_size, # was 20
  class_mode = "binary" # binary_crossentropy loss for binary labels
)

validation_generator <- flow_images_from_directory(
  validation_dir,
  test_datagen,
  target_size = c(150, 150),
  shuffle = TRUE,
  seed = 1,
  batch_size = desired_batch_size,
  class_mode = "binary"
)

# Fine tuning -------------------------------------------------------------

unfreeze_weights(conv_base, from = "block3_conv1")

# Compile model -----------------------------------------------------------



model %>% compile(
  loss = "binary_crossentropy",
  optimizer = optimizer_rmsprop(lr = 2e-5),
  metrics = c("accuracy")
)


# Evaluate  by epochs  ---------------------------------------------------------------


#  # This create plots accuracy of various epochs (slow)
history <- model %>% fit_generator(
  train_generator,
  steps_per_epoch = 100,
  epochs = 15, # was 50
  validation_data = validation_generator,
  validation_steps = 50
)

plot(history)

最佳答案

这里有两件事:

  1. 对数据进行分层。类 - 您的验证数据具有与训练集完全不同的类分布(训练集是平衡的,而验证集不是)。这可能会影响您的损失和指标值。最好对结果进行分层,以便两组的类别比例相同。

  2. 数据点如此之少,请使用更粗略的验证模式 - 正如您可能会看到的那样,总共只有 74 张图像。在这种情况下 - 将所有图像加载到 numpy.array 都不是问题(您仍然可以使用 flow 函数进行数据增强)并使用难以获得的验证模式当您将数据放在文件夹中时。我建议您使用的模式(来自 sklearn)是:

    • stratified k-fold cross-validation - 将数据分为 k block - 对于每次选择的 k - 1 block - 首先在 k - 1 上训练模型,然后计算留下待验证的指标。最终结果是验证 block 上获得的结果的平均值。当然,您不仅可以检查平均值,还可以检查损失分布的其他统计数据(例如minmax>、中位数等)。您还可以将它们与每次折叠的训练集上获得的结果进行比较。
    • leave-one-out - 这是先前模式的特殊情况 - 其中 block /折叠的数量等于数据集中的示例数量。此方法被认为是衡量模型性能的最粗略方法。它很少用于深度学习,因为为了在合理的时间内完成计算,训练过程通常很慢并且数据集很大。

关于r - Keras 模型中训练和验证样本较小时如何衡量过拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48675901/

相关文章:

r - 连续时间数据的分位数

R 可以用 ggplot 反转调色板吗?

machine-learning - Sklearn LabelEncoder 在排序时抛出 TypeError

r - 更改 ggpubr::ggarrange 中组合图的背景颜色

machine-learning - 甘斯生成元的损失函数

python - 在默认情况下不创建新范围的情况下,如何在 tensorflow 中重用变量范围?

tensorflow - 如何在 Python 中运行条件神经网络(类似于 R/Stata 中的 clogit)?

java - 加速Java中的数学计算

machine-learning - tf.layers api 中的 kernel_initializer

r - purrr:map 和 glm - 通话问题