【问题标题】:Python neural network accuracy - correct implementation?Python 神经网络的准确性——正确的实现?
【发布时间】:2015-10-22 16:21:00
【问题描述】:

我写了一个简单的神经网络/MLP,我得到了一些奇怪的准确度值,想仔细检查一下。

这是我的预期设置:包含 913 个样本和 192 个特征 (913,192) 的特征矩阵。我正在对 2 个结果进行分类,因此我的标签是二进制的并且具有形状 (913,1)。 1 个具有 100 个单位的隐藏层(目前)。所有激活将使用 tanh,所有损失使用 l2 正则化,并使用 SGD 进行优化

代码如下。它是使用 Keras 框架 (http://keras.io/) 在 python 中编写的,但我的问题并非特定于 Keras

input_size = 192
hidden_size = 100
output_size = 1
lambda_reg = 0.01
learning_rate = 0.01
num_epochs = 100
batch_size = 10

model = Sequential()
model.add(Dense(input_size, hidden_size, W_regularizer=l2(lambda_reg), init='uniform'))
model.add(Activation('tanh'))
model.add(Dropout(0.5))

model.add(Dense(hidden_size, output_size, W_regularizer=l2(lambda_reg), init='uniform'))
model.add(Activation('tanh'))

sgd = SGD(lr=learning_rate, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error', optimizer=sgd, class_mode="binary")

history = History()

model.fit(features_all, labels_all, batch_size=batch_size, nb_epoch=num_epochs, show_accuracy=True, verbose=2, validation_split=0.2, callbacks=[history])
score = model.evaluate(features_all, labels_all, show_accuracy=True, verbose=1)

我有两个问题:

这是我第一次使用 Keras,所以我想仔细检查我编写的代码在我选择的参数及其值等方面是否真的正确。

使用上面的代码,我得到的训练和测试集准确率徘徊在 50-60% 左右。也许我只是使用了不好的功能,但我想测试一下可能出了什么问题,所以我手动将所有标签和功能设置为应该可以预测的东西:

labels_all[:500] = 1
labels_all[500:] = 0
features_all[:500] = np.ones(192)*500
features_all[500:] = np.ones(192)

所以我将前 500 个样本的标签设置为 1,其他所有样本都标记为 0。我将前 500 个样本中的每一个的所有特征手动设置为 500,以及所有其他特征(对于其余样本) 得到一个 1

运行此程序时,我的训练准确率约为 65%,验证准确率约为 0%。我期望两种精度都非常高/几乎完美 - 这是不正确的吗?我的想法是具有极高值的特征都具有相同的标签(1),而具有低值的特征得到0标签

我只是想知道我的代码/模型是否不正确,或者我的逻辑是否错误

谢谢!

【问题讨论】:

    标签: python machine-learning neural-network


    【解决方案1】:

    我不知道那个库,所以我不能告诉你这是否正确实现,但它看起来是合法的。

    我认为您的问题在于激活函数 - tanh(500)=1 和 tanh(1)=0.76。这种差异对我来说似乎太小了。尝试使用 -1 而不是 500 进行测试,并将真实数据标准化为 [-2, 2] 左右。如果您需要完整的实数范围,请尝试使用线性激活函数。如果您只关心实数的正半数,我建议使用 softplus 或 ReLU。我已经检查过了,所有这些功能都是 Keras 提供的。

    您也可以尝试对输出设置阈值 - 预期 1 时回答 0.75,预期 0 时回答 0.25 有效,但可能会影响您的准确性。

    另外,尝试调整您的参数。我可以建议(根据我自己的经验)你会使用:

    • 学习率 = 0.1
    • L2 中的 lambda = 0.2
    • 时期数 = 250 或更大
    • 批量大小20-30左右
    • 动量 = 0.1
    • 学习率衰减约 10e-2 或 10e-3

    我想说的是学习率、时期数、动量和 lambda 是这里最重要的因素 - 从最重要到最不重要。

    PS。我刚刚发现您正在统一初始化权重(这甚至是一个词吗?我不是母语人士......)。我不能告诉你为什么,但我的直觉告诉我这是个坏主意。我会选择随机的初始权重。

    【讨论】:

    • 数据通常应该缩放到零均值和单位方差。
    • 数据应该被缩放,这样你的方法才能得到最好的结果。你说的是一个很好的经验法则,但如果他想使用 tanh,大于 1 的方差可能是一个更好的主意。
    • 哦,当然,你说的完全正确。通过tanh函数后我什至没有考虑值。一个后续问题:我正在使用 scipy zscore 来标准化功能(x - xmean / sd)。这足够了吗?因为在极端分数的情况下,该值将超出 [-2,2] 的范围。将我的特征实际标准化到一定范围内的更好方法是什么?
    • 你知道你的特征的边界吗?他们可以是消极的吗?如果没有额外的知识,它必须告诉你应该如何标准化它们。
    • 现在很难说界限是什么,因为我仍处于建立模型和选择(添加/删除特征)以改善拟合的阶段。截至目前,有一些特征是负面的,范围是 [-15,15]。我猜测 tanh 我应该标准化以允许负值,对吗?给定 0 的 tanh 输出值来自输入
    猜你喜欢
    • 2017-08-31
    • 2010-10-24
    • 2017-07-30
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多