我需要 Keras VGG16 的预训练权重吗?

数据挖掘 机器学习 Python 喀拉斯
2022-01-21 16:04:04

作为背景,我对机器学习领域相对较新,我正在尝试一个项目,目标是对 NBA 比赛中的比赛进行分类。我的输入是来自 NBA 比赛中每场比赛的 40 帧序列,我的标签是给定比赛的 11 个包罗万象的分类。

该计划是获取每个帧序列并将每个帧传递到 CNN 以提取一组特征。然后来自给定视频的每个特征序列将被传递到 RNN。

我目前在我的大部分实现中使用 Keras,并且我选择为我的 CNN 使用 VGG16 模型。下面是一些相关代码:

video = keras.Input(shape = (None, 255, 255, 3), name = 'video')
cnn = keras.applications.VGG16(include_top=False, weights = None, input_shape=
(255,255,3), pooling = 'avg', classes=11)
cnn.trainable = True

我的问题是——如果我的目标是对 NBA 比赛的视频片段进行分类,将 VGG16 ConvNet 的权重初始化为“imagenet”对我来说仍然有益吗?如果是这样,为什么?如果没有,我如何训练 VGG16 ConvNet 以获得我自己的权重集,然后如何将它们插入到这个函数中?我很难找到任何教程,其中有人在使用 VGG16 模型时包含了他们自己的权重集。

如果我的问题看起来很幼稚,我深表歉意,但我非常感谢任何帮助解决这个问题。

2个回答

使用在 ImageNet 上训练的预训练权重是有益的,因为 ImageNet 是一个巨大的数据集,而且相当通用。因此,您更有可能从中获得良好的图像特征。您可能必须尝试从哪一层中提取特征。

如果你想创建自己的嵌入,你需要使用相同的代码,而不是加载权重,而是在你拥有的图像上训练它。我不建议这样做,原因如下

  1. 您的数据集很可能太小,模型无法收敛
  2. VGG16 进行分类,单个帧的标签是什么是设计选择,作为新手,你可能会感到沮丧
  3. 这需要大量的时间和资源,不是一个理想的情况

PS,如果你仍然觉得 ImageNet 没有充分覆盖你的用例,你可以试试在Open Images 数据集上训练的预训练 Inception V3 模型

我建议您使用预训练模型并冻结所有卷积层。在这种情况下,您应该只训练密集层的权重。所以使用transfer learning并冻结卷积层,用你想要的层和最后一层替换密集层softmax原因是图像网已经可以很好地找到篮球比赛的特征。您只需要对每个游戏进行分类。如果您想查看解释,请阅读本文