【问题标题】:Detecting if letter is equal to "X" in Keras在 Keras 中检测字母是否等于“X”
【发布时间】:2019-04-19 19:30:57
【问题描述】:

我正在尝试学习 Keras 并尝试一些非常简单的方法。我创建了一个包含 200.000 个随机字母和两列的数据框。字母和 is_x。如果字母为大写“X”,则 is_x 设置为 1(或 True)。

这是我到目前为止所做的:

model = Sequential()
model.add(Dense(32, activation='tanh', input_shape=(X_train.shape[1],)))
model.add(Dense(16, activation='tanh'))
model.add(Dense(y_train.shape[1], activation='sigmoid'))
#model.compile(optimizer=SGD(), loss='categorical_crossentropy', metrics=['accuracy'])
model.compile(optimizer=Adam(lr=0.05), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(X_train, y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, y_test))
results = model.evaluate(X_test, y_test)
y_predict = model.predict(X_test)

print(results)
print("---")
for i in y_predict:
    print(i)

结果如下:

[0.09158177]
[0.09158175]
[0.09158177]
[0.09158177]
[0.09158175]
[0.09158177]
[0.09158173]

如果 is_x 为真,我想要得到的是 1 或 0。我将字母输入为 X_,将 is_x 输入为 y_,但我只得到一些数字,它们看起来都像 0.996 等。准确度也像 0.99,但与现实相去甚远。

我对激活、优化器和损失感到非常困惑。我不明白该选择哪个以及如何解决这个简单的问题。我研究了很多关于 udemy 的培训视频,但没有人解释他们为什么以及如何使用这些功能。

【问题讨论】:

    标签: python keras neural-network deep-learning artificial-intelligence


    【解决方案1】:

    我不能真正有效地回答优化器和激活部分,但我可以在其他部分提供一些帮助。 tanh 和 relu 都是非常流行的激活函数,所以你应该可以使用其中任何一个。同样,Adam 是一个有效的优化器,所以你在那个级别上应该没问题。

    在您的问题中,损失函数应该是 binary_crossentropy。当您要学习两门课程时使用此功能(0/1)。 categorical_crossentropy 用于多类问题,mse 用于回归分析。该算法的目标是最小化该函数的值。因此,您需要为手头的问题选择合适的解决方案。

    您的准确率非常高。造成这种情况的一个主要原因是您在 is x 和 is not x 之间的样本量不均匀。为了获得真正的高分,算法所要做的就是预测所有内容的“不是 x”。

    为了进一步评估你的模型,试试这个:

    from sklearn.metrics import confusion_matrix
    # this will remove the probabilities and give 1/0
    y_predict = (y_predict > .5)
    
    # this will create a confusion matrix
    print(confusion_matrix(y_test, y_predict)
    

    通过显示模型预测 x 的次数和实际结果为 x 的次数、预测不是 x 的次数和实际结果不是 x 的次数以及错误标记的案例,可以更轻松地查看模型的准确性。

           predicted
             not x       x
    not x      #         #
      x        #         #
    

    使用此工具,您可以更好地评估模型的准确性。

    【讨论】:

    • 现在我得到这样的东西 [[14134 0][ 847 0]]。你为什么使用 0.5 ?它总是超过 0.50
    • 我需要更多信息才能真正评估这一点。那段代码:y_predict = (y_predict > .5) 将边界设置为 0.5,并表示高于该值的任何值都应为 1,低于该值的值应为 0。我相信您显示的数字是索引 (14134) 和预测的组具体情况(0)。当你说值总是大于 .5 时,你说的是 y_predict 值还是 results 值?
    • 当我改变亚当的 lr 时它会改变。所以我认为这不是我的问题。
    • 还有一些我不明白的地方。为什么confusion_matrix(y_test, y_predict) 会给我这个奇怪的结果? [[14134 0][847 0]]
    • 哦,那是混淆矩阵。我现在知道了。这意味着它正确地将 14,134 个案例预测为非 x,并在存在 x 时错误地将 847 个案例预测为非 x。请参阅我上面的混淆矩阵示例。 [[14134 0] 是第一行,[847 0]] 是第二行。故事的寓意:它是说一切都不是 x 作为最大化准确性的手段。它未能检测到 x
    猜你喜欢
    • 2013-08-31
    • 2012-05-29
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多