【问题标题】:Neural Network with random weights does not learn具有随机权重的神经网络不学习
【发布时间】:2018-10-17 01:37:48
【问题描述】:

我想将使用在 imagenet 上预训练的 VGG16 模型的分类器与不使用 imagenet 权重的分类器进行比较,因此我使用加载模型

model = applications.VGG16(weights=None, include_top=False, input_shape=(img_width, img_height, 3))

根据Keras documentation,使用“weights=None”会随机初始化权重。

我现在的问题是神经网络总是给出相同的输出,即使在训练了多个 epoch 并尝试了不同的学习率之后,它总是将所有图像预测为同一类。

我认为输入数据(2 个不同类别的图像)或我的代码不是问题,因为在使用 imagenet 权重进行初始化和训练时,我的分类器学得很好,在测试集上达到了 90% 的准确率。

可能是什么问题?也许权重初始化?但是我不知道在加载这样的模型时如何使用不同的初始化器

【问题讨论】:

  • 如果你预定义了权重会发生什么?它仍然提供相同的课程吗?
  • 正如您在问题中提到的,它总是预测同一类,您的网络可能偏向于该类。检查您的数据集是否已正确隔离并有足够的数据从头开始训练
  • @deathangel908 我不确定在加载应用程序时如何在 Keras 中执行此操作。
  • @thefifthjack005 我的训练数据中有 2:1 的类拆分。我只有 360 个不同的示例,但我正在使用数据增强来人为地增加它。我知道这是一个非常少量的数据,但是在使用预训练模型时效果很好
  • 如果您正在批量训练,请检查两个类的数据是否作为每批中的训练示例传递,以便模型能够在每批中查看两个类的数据。我的观点是,很难从头开始在 vgg 上训练具有小数据集的模型,因为它有很多参数需要优化。所以更喜欢微调模型。

标签: python tensorflow machine-learning neural-network keras


【解决方案1】:

您可能正面临梯度消失的问题。

如果你使用 relu 激活函数,请查看“kaiming 初始化”为你的体重。目标是在前向传递期间,在每一层之后的输出保持平均值为 0,标准差为 1。

对于 relu 激活函数,您必须使用随机正态分布乘以 2/(给定层的输入数)的平方根进行初始化。

weight_initialisation = random_normal * sqrt(2/(number of input for the layer))

对于 CNN,我认为输入的数量将是过滤器的数量 * 内核中的单元数量(或 5 * 5 对于 [5, 5] 内核)

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 2016-07-11
    • 1970-01-01
    • 2019-03-15
    • 2011-08-17
    • 2020-10-29
    • 1970-01-01
    • 2017-02-28
    • 2016-11-28
    相关资源
    最近更新 更多