【问题标题】:CNNs on Keras converge to the same value no matter the input无论输入如何,Keras 上的 CNN 都会收敛到相同的值
【发布时间】:2018-06-30 19:04:40
【问题描述】:

我最近一直在学习 Keras,并尝试使用 CNN 处理 CIFAR10 数据集。但是,我训练的模型(您可以运行代码 here)无论如何都会为 每个 输入返回相同的答案。我是否忘记了模型定义中的某些内容?

【问题讨论】:

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


    【解决方案1】:

    您忘记对图像进行标准化。目前,x_train 中的值在[0,255] 范围内。这会导致大的梯度更新并停止训练过程。在这种情况下,一种简单的归一化方案是:

    x_train = x_train.astype('float32') / 255
    x_test = x_test.astype('float32') / 255
    

    这会导致值落在[0,1] 范围内。那么你肯定会看到训练的进展。


    更复杂的归一化方案涉及按特征(即按像素)归一化或居中。在这种方法中,我们对所有图像进行归一化,使得所有图像中的每个像素的均值为零,标准差为 1(即它们大多落在[-1,1] 范围内):

    # make sure values are float
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    
    x_mean = x_train.mean(axis=0)
    x_train -= x_mean
    x_std = x_train.std(axis=0)
    x_train /= x_std + 1e-8  # add a small constant to prevent division by zero
    
    # normalize test data using the mean and std of training data
    x_test -= x_mean
    x_test /= x_std + 1e-8
    

    注意最后一部分:永远不会通过自己的均值和标准对测试数据进行归一化。请改用训练均值和标准差。

    【讨论】:

    • 哦,将值标准化就行了。没想到会这么重要。谢谢!
    【解决方案2】:

    你正在对 x_test 进行预测

    predictions = model.predict_classes(x_test, batch_size=50)
    

    然后将它们与 y_train 进行比较

    comparison = [(predictions[i], y_train_[i][0]) for i in range(0, len(predictions))]
    

    我觉得应该是 y_test

    【讨论】:

    • 这肯定是真的,我刚刚纠正了它,但两者仍然不匹配。
    • 你必须训练更长的时期或直到损失下降。损失 14 仍然很高
    • 增加 epoch 的数量没有效果:就像网络收敛到一个局部最小值并且不会从那里移动。
    猜你喜欢
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2017-09-02
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多