Python 与致密层相比,RNN和LSTM的精度较低

Python 与致密层相比,RNN和LSTM的精度较低,python,tensorflow,keras,deep-learning,lstm,Python,Tensorflow,Keras,Deep Learning,Lstm,是我的代码实验室的链接 图表: LSTM RNN 浓密 所有进口产品: import tensorflow as tf from tensorflow.keras.preprocessing import sequence from tensorflow.keras.layers import Dense, Embedding, SimpleRNN, LSTM, Activation, Dropout from tensorflow.keras.utils import to_catego

是我的代码实验室的链接

图表:

LSTM

RNN

浓密

所有进口产品:

import tensorflow as tf
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.layers import Dense, Embedding, SimpleRNN, LSTM, Activation, Dropout
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.metrics import Accuracy
from tensorflow.keras import optimizers
from tensorflow.keras.models import Sequential
from tensorflow.keras.datasets import reuters
from tensorflow.keras import models, Input
我想我没有遗漏任何输入数据,它是矢量化的。和输出,标签编码使用一个热编码实现包括在keras

maxFeatures = 8982
(train_data, train_labels), (test_data,test_labels) = reuters.load_data(num_words = maxFeatures, skip_top=0) 
import numpy as np
def vectorize_sequences(sequences, dimension=maxFeatures):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
    results[i,sequence] = 1.
return results

x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

from tensorflow.keras.utils import to_categorical

y_train = to_categorical(train_labels)
y_test = to_categorical(test_labels)
数据的形状:

列车数据形状:(89828982)和列车标签形状:(898246)

测试数据形状:(22468982)和测试标签形状:(224646)

当使用LSTM或简单RNN时,我无法获得超过~35%的val_精度。我尝试过改变变量,添加不同的激活层,并添加了退出,以防过度拟合。我认为它不合适。使用不同的活化层确实会使其改变1-2%

modelRNN = Sequential()
modelRNN.add(Input(shape=(maxFeatures,)))

modelRNN.add(Embedding(maxFeatures,64))
modelRNN.add(LSTM(64))
modelRNN.add(Dropout(0.2))
modelRNN.add(Dense(46, activation="softmax"))


modelRNN.compile(
  optimizer='adam',
  loss='categorical_crossentropy',
  metrics=['accuracy'],
)

historyRNN = modelRNN.fit(x_train, y_train,
  epochs=10,
  batch_size=256,
  validation_split=0.2
  )
RNN模型的结果:

使用测试数据的评估方法确实给了我不同的准确率,但接近35%

modelRNN.evaluate(x_test,y_test)

71/71 [==============================] - 9s 122ms/step - loss: 2.4143 - accuracy: 0.3620
[2.4142708778381348, 0.36197686195373535]
现在来看有趣的部分:使用密集层使我的val_精度超过75%。对模型的评估再次给了我超过75%的收益

model = models.Sequential()
model.add(Dense(64, activation='relu', input_shape=(maxFeatures,)))
model.add(Dense(64, activation='relu'))
model.add(Dense(46, activation='softmax'))

model.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
拟合后的结果:

我认为这与数据有关,但我不确定是什么

它也可能与我正在使用的优化器有关。我试过rmsprop和adam,结果几乎相同。所以可能是我默认留下的其他变量


我在所有情况下都使用softmax作为最后一层,这样我就可以得到每个标签的概率。可能是激活层问题?例如在嵌入中,但是用我所知道的测试它并没有改变结果。

您正在向嵌入层提供一个热向量。您应该改为输入整数索引。不要调用
vectorize\u sequence()
。创建一个标记字典,并将序列标记化。例如,如果您有一个序列“我的序列我的序列”-您应该将[0,1,0,1]馈送到网络,而不是[[1,0,0,0],[0,1,0,0],[1,0,0,0],[0,1,0,0]。

我的数据是文本,输出是46个标签。所以它应该会起作用。。