【发布时间】:2018-04-17 10:22:47
【问题描述】:
我试图让 LSTM 在 Keras 中工作,但即使在第一个 epoch 之后,准确度似乎也太高(90%),我担心训练不正确,我从这篇文章中获得了一些想法:
https://machinelearningmastery.com/text-generation-lstm-recurrent-neural-networks-python-keras/
这是我的代码:
import numpy
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.preprocessing.sequence import pad_sequences
from pandas import read_csv
import simplejson
numpy.random.seed(7)
dataset = read_csv("mydataset.csv", delimiter=",", quotechar='"').values
char_to_int = dict((c, i) for i, c in enumerate(dataset[:,1]))
int_to_char = dict((i, c) for i, c in enumerate(dataset[:,1]))
f = open('char_to_int_v2.txt', 'w')
simplejson.dump(char_to_int, f)
f.close()
f = open('int_to_char_v2.txt', 'w')
simplejson.dump(int_to_char, f)
f.close()
seq_length = 1
max_len = 5
dataX = []
dataY = []
for i in range(0, len(dataset) - seq_length, 1):
start = numpy.random.randint(len(dataset)-2)
end = numpy.random.randint(start, min(start+max_len,len(dataset)-1))
sequence_in = dataset[start:end+1]
sequence_out = dataset[end + 1]
dataX.append([[char[0], char_to_int[char[1]], char[2]] for char in sequence_in])
dataY.append([sequence_out[0], char_to_int[sequence_out[1]], sequence_out[2]])
X = pad_sequences(dataX, maxlen=max_len, dtype='float32')
X = numpy.reshape(X, (X.shape[0], max_len, 3))
y = numpy.reshape(dataY, (X.shape[0], 3))
batch_size = 1
model = Sequential()
model.add(LSTM(32, input_shape=(X.shape[1], X.shape[2])))
model.add(Dropout(0.2))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
n_epoch = 1
for i in range(n_epoch):
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=1, shuffle=False)
model.reset_states()
model.save_weights("weights.h5")
model.save('model.h5')
with open('model-params.json', 'w') as f:
f.write(model.to_json())
scores = model.evaluate(X, y, verbose=0)
print("Model Accuracy: %.2f%%" % (scores[1]*100))
这是我的数据集的样子:
"time_date","name","user_id"
1402,"Sugar",3012
1402,"Milk",3012
1802,"Tomatoes",3012
1802,"Cucumber",3012
etc...
据我了解,我的 dataX 将具有 (n_samples, 5, 3) 的形状,因为我在序列左侧填充零,所以如果我将前 3 个结果构建成某种东西,它将是(第二列基于 char_to_int func,所以我以随机数为例):
[[0, 0, 0], [0, 0, 0], [0, 0, 0], [1402, 5323, 3012], [1402, 5324, 3012]]
我的数据将是:
[[1802, 3212, 3012]]
正确吗?如果是这样,肯定有其他问题,因为这是 1 epoch 之后的输出:
9700/9700 [==============================] - 31s - loss: 10405.0951 - acc: 0.8544
Model Accuracy: 87.49%
我觉得我几乎可以使用这个模型,但我错过了一些重要的东西,我不知道它是什么,我将不胜感激任何关于这方面的指导。谢谢。
【问题讨论】:
-
看看你的损失,它穿过屋顶。你的 Y 数据是什么?您发布的样本有数千个,它应该只是一个二进制数组,有一个 1 和两个 0,因为您正在进行二进制分类。这就是为什么你的输出很奇怪
-
你有几节课?班级平衡吗?也许有一个类可以准确地处理 90% 的示例,并且网络简单学习总是预测这个类?
标签: python machine-learning keras lstm