Тат*_*вич 1 classification neural-network keras tensorflow
我是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)
Run Code Online (Sandbox Code Playgroud)
只有您提供的信息以及您可以尝试改进的许多内容有很多可能的原因,但从高层次来看,这是我体验中最重要的项目.如果你已经检查了大部分内容,我道歉:
当没有足够的数据时,深度学习实际上可能比"经典"ML(例如树,svm)表现更差.任务依赖程度足够多,但作为一个宽松的经验法则,您可能希望拥有与您拥有的数据量大致相同数量级的模型参数.在您发布的模型中,您有100 x 4235 + 100 x 4235 + 4235*1 = 851,235参数.
从您发布的代码来看,您似乎没有使用任何正则化(例如,丢失或L2),也没有使用验证集来测量训练集之外的模型质量.您的模型可能会过度拟合训练集.
对于文本建模,通常使用RNN(例如LSTM或GRU)或CNN而不是密集/完全连接的层.RNN和CNN包含对密集层中不存在的模型序列的架构约束.换句话说,密集层缺乏关于数据类型的先验知识,因此他们可能需要更多的数据/训练时间来获得类似的性能.在Keras回购中有很多这方面的例子:https://github.com/fchollet/keras/tree/master/examples
其中一个例子是使用LSTM的IMDB文本(二进制)分类:https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py
深度学习中另一个非常常见的工具是将文本编码为一个单词向量序列(有时是一个热字符).这些可以初始化为随机向量或者用预先训练的向量(例如GLOVE和word2vec)初始化.上面的例子使用了前一种方法.