【问题标题】:Neural Network in TensorFlow works worse than Random Forest and predict the same label each timeTensorFlow 中的神经网络比随机森林效果更差,并且每次都预测相同的标签
【发布时间】:2017-03-20 10:23:40
【问题描述】:

我是 DNN 和 TesorFlow 的新手。 我在使用 NN 进行二进制分类时遇到问题。

作为输入数据,我有文本数据集,由 TF-IDF 转换为数值向量。

训练数据集的行数为 43 000 特征数 4235

我尝试使用 TFlearn 库,然后使用 Keras io。但结果是一样的 - NN 只预测一个标签 0 或 1,并给出比随机森林更差的准确度。

我将添加用于 NN 构建的脚本。请告诉我它有什么问题。

model = Sequential()

model.add(Dense(100, input_dim=4235, init='uniform', activation='relu'))
model.add(Dense(4235, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# Fit the model
model.fit(X_train, y_train, nb_epoch=100, batch_size=10,  verbose=2)

【问题讨论】:

    标签: neural-network tensorflow classification keras


    【解决方案1】:

    仅凭您提供的信息就有很多可能的原因,还有很多您可以尝试改进的地方,但从高层次来看,这是我的经验中最重要的几项。如果您已经检查了大部分内容,我深表歉意:

    数据量

    当没有足够的数据时,深度学习实际上可能比“经典”机器学习(例如树、支持向量机)表现更差。多少足够取决于任务,但作为一个宽松的经验法则,您可能希望拥有与您拥有的数据量大致相同数量级的模型参数。在您发布的模型中,您有 100 x 4235 + 100 x 4235 + 4235 * 1 = 851,235 个参数。

    正则化

    从您发布的代码看来,您没有使用任何正则化(例如 dropout 或 L2),也没有使用验证集来衡量训练集中模型的质量。您的模型可能过度拟合训练集。

    架构

    对于文本建模,通常使用 RNN(例如 LSTM 或 GRU)或 CNN,而不是密集/全连接层。 RNN 和 CNN 包含对 Dense 层中不存在的模型序列的架构约束。换句话说,密集层缺乏关于数据类型的先验知识,因此它们可能需要更多的数据/训练时间才能获得类似的性能。 Keras repo 中有很多这样的例子:https://github.com/fchollet/keras/tree/master/examples

    一个这样的例子是这个带有 LSTM 的 IMDB 文本(二进制)分类:https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py

    文本特征化

    深度学习中另一个非常常见的工具是将文本编码为一系列词向量(有时是单热字符)。这些可以初始化为 s 随机向量,也可以使用预先训练的向量(例如 GLOVE 和 word2vec)进行初始化。上面的例子使用了前一种方法。

    【讨论】:

    • 谢谢@cortex。我会尝试使用您的所有建议。
    • 还有一件事:不要忘记在将数据提供给 NN 之前对数据进行标准化/归一化!!
    猜你喜欢
    • 2020-04-04
    • 2023-03-26
    • 2018-01-05
    • 2014-09-28
    • 2021-07-12
    • 2014-08-07
    • 2017-09-16
    • 2015-04-15
    相关资源
    最近更新 更多