Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Keras Python中将TF IDF矢量器与LSTM结合使用_Python_Keras_Nlp_Lstm_Rnn - Fatal编程技术网

如何在Keras Python中将TF IDF矢量器与LSTM结合使用

如何在Keras Python中将TF IDF矢量器与LSTM结合使用,python,keras,nlp,lstm,rnn,Python,Keras,Nlp,Lstm,Rnn,我试图在Python的Keras库中使用LSTM来训练Seq2Seq模型。我想使用TF IDF向量表示语句作为模型的输入,并得到一个错误 X = ["Good morning", "Sweet Dreams", "Stay Awake"] Y = ["Good morning", "Sweet Dreams", "Stay Awake"] vectorizer = TfidfVectorizer() vectorizer.fit(X) vectorizer.transform(X) vecto

我试图在Python的Keras库中使用LSTM来训练Seq2Seq模型。我想使用TF IDF向量表示语句作为模型的输入,并得到一个错误

X = ["Good morning", "Sweet Dreams", "Stay Awake"]
Y = ["Good morning", "Sweet Dreams", "Stay Awake"]

vectorizer = TfidfVectorizer()
vectorizer.fit(X)
vectorizer.transform(X)
vectorizer.transform(Y)
tfidf_vector_X = vectorizer.transform(X).toarray() #shape - (3,6)
tfidf_vector_Y = vectorizer.transform(Y).toarray() #shape - (3,6)
tfidf_vector_X = tfidf_vector_X[:, :, None] #shape - (3,6,1) since LSTM cells expects ndims = 3
tfidf_vector_Y = tfidf_vector_Y[:, :, None] #shape - (3,6,1)

X_train, X_test, y_train, y_test = train_test_split(tfidf_vector_X, tfidf_vector_Y, test_size = 0.2, random_state = 1)
model = Sequential()
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
model.add(LSTM(output_dim = 6, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
adam = optimizers.Adam(lr = 0.001, beta_1 = 0.9, beta_2 = 0.999, epsilon = None, decay = 0.0, amsgrad = False)
model.compile(loss = 'cosine_proximity', optimizer = adam, metrics = ['accuracy'])
model.fit(X_train, y_train, nb_epoch = 100)
上面的代码抛出:

Error when checking target: expected lstm_4 to have shape (6, 6) but got array with shape (6, 1)

有人能告诉我出了什么问题以及如何解决吗

目前,您正在返回最后一层中维度6的序列。您可能希望返回维度1的序列以匹配目标序列。这里我不是100%确定,因为我对seq2seq模型没有经验,但至少代码是这样运行的。也许您可以看看上的seq2seq教程

除此之外,还有两点:当使用顺序API时,只需为模型的第一层指定一个
input\u形状
。另外,
LSTM
层的
output\u dim
参数已被弃用,应替换为
units
参数:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split

X = ["Good morning", "Sweet Dreams", "Stay Awake"]
Y = ["Good morning", "Sweet Dreams", "Stay Awake"]

vectorizer = TfidfVectorizer().fit(X)

tfidf_vector_X = vectorizer.transform(X).toarray()  #//shape - (3,6)
tfidf_vector_Y = vectorizer.transform(Y).toarray() #//shape - (3,6)
tfidf_vector_X = tfidf_vector_X[:, :, None] #//shape - (3,6,1) 
tfidf_vector_Y = tfidf_vector_Y[:, :, None] #//shape - (3,6,1)

X_train, X_test, y_train, y_test = train_test_split(tfidf_vector_X, tfidf_vector_Y, test_size = 0.2, random_state = 1)

from keras import Sequential
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(units=6, input_shape = X_train.shape[1:], return_sequences = True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=1, return_sequences=True, name='output'))
model.compile(loss='cosine_proximity', optimizer='sgd', metrics = ['accuracy'])

print(model.summary())

model.fit(X_train, y_train, epochs=1, verbose=1)

目前,您正在返回最后一层中维度6的序列。您可能希望返回维度1的序列以匹配目标序列。这里我不是100%确定,因为我对seq2seq模型没有经验,但至少代码是这样运行的。也许您可以看看上的seq2seq教程

除此之外,还有两点:当使用顺序API时,只需为模型的第一层指定一个
input\u形状
。另外,
LSTM
层的
output\u dim
参数已被弃用,应替换为
units
参数:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split

X = ["Good morning", "Sweet Dreams", "Stay Awake"]
Y = ["Good morning", "Sweet Dreams", "Stay Awake"]

vectorizer = TfidfVectorizer().fit(X)

tfidf_vector_X = vectorizer.transform(X).toarray()  #//shape - (3,6)
tfidf_vector_Y = vectorizer.transform(Y).toarray() #//shape - (3,6)
tfidf_vector_X = tfidf_vector_X[:, :, None] #//shape - (3,6,1) 
tfidf_vector_Y = tfidf_vector_Y[:, :, None] #//shape - (3,6,1)

X_train, X_test, y_train, y_test = train_test_split(tfidf_vector_X, tfidf_vector_Y, test_size = 0.2, random_state = 1)

from keras import Sequential
from keras.layers import LSTM

model = Sequential()
model.add(LSTM(units=6, input_shape = X_train.shape[1:], return_sequences = True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=6, return_sequences=True))
model.add(LSTM(units=1, return_sequences=True, name='output'))
model.compile(loss='cosine_proximity', optimizer='sgd', metrics = ['accuracy'])

print(model.summary())

model.fit(X_train, y_train, epochs=1, verbose=1)

如上图所示,网络期望最后一层为输出层。您必须给出最后一层的尺寸作为输出尺寸

在您的情况下,它将是行数*1,如错误(6,1)所示是您的维度

在最后一层中将输出尺寸更改为1

使用keras,您可以设计自己的网络。因此,您应该负责使用输出层创建端隐藏层。

如上图所示,网络期望最后一层为输出层。您必须给出最后一层的尺寸作为输出尺寸

在您的情况下,它将是行数*1,如错误(6,1)所示是您的维度

在最后一层中将输出尺寸更改为1


使用keras,您可以设计自己的网络。因此,您应该负责使用输出层创建端隐藏层。

感谢您的解决方案。但是,即使在数据集大小为8000的情况下,模型的拟合速度也非常慢。你能不能给我一些建议,告诉我如何在小批量中运行它。谢谢你的解决方案。但是,即使在数据集大小为8000的情况下,模型的拟合速度也非常慢。你能不能给我一些建议,告诉我如何在小批量中运行它。