Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
Python 3.x 使用LSTM训练的模型只能预测所有样本的相同值_Python 3.x_Machine Learning_Keras_Deep Learning_Lstm - Fatal编程技术网

Python 3.x 使用LSTM训练的模型只能预测所有样本的相同值

Python 3.x 使用LSTM训练的模型只能预测所有样本的相同值,python-3.x,machine-learning,keras,deep-learning,lstm,Python 3.x,Machine Learning,Keras,Deep Learning,Lstm,我有一个包含4000行和两列的数据集。第一列包含一些句子,第二列包含一些数字。 大约有4000个句子,它们被100个不同的数字分类。例如: Sentences Codes Google headquarters is in California 87390 Steve Jobs was a great man 70214 Steve Jobs

我有一个包含4000行和两列的数据集。第一列包含一些句子,第二列包含一些数字。 大约有4000个句子,它们被100个不同的数字分类。例如:

Sentences                                         Codes

Google headquarters is in California              87390
Steve Jobs was a great man                        70214
Steve Jobs has done great technology innovations  70214
Google pixel is a very nice phone                 87390
Microsoft is another great giant in technology    67012
Bill Gates founded Microsoft                      67012 
类似地,总共有4000行包含这些句子,这些行用100个这样的代码进行分类

我已经尝试了下面的代码,但当我预测时,它预测的是一个相同的值。换句话说,y_pred给出了一个相同值的数组

我能知道代码哪里出错了吗

import pandas as pd
import numpy as np

xl = pd.ExcelFile("dataSet.xlsx")
df = xl.parse('Sheet1') 

#df = df.sample(frac=1).reset_index(drop=True)# shuffling the dataframe


df = df.sample(frac=1).reset_index(drop=True)# shuffling the dataframe
X = df.iloc[:, 0].values
Y = df.iloc[:, 1].values

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import pickle 

count_vect = CountVectorizer()
X = count_vect.fit_transform(X)

tfidf_transformer = TfidfTransformer()
X = tfidf_transformer.fit_transform(X)

X = X.toarray()

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
y = Y.reshape(-1, 1)  # Because Y has only one column

onehotencoder = OneHotEncoder(categories='auto')
Y = onehotencoder.fit_transform(y).toarray()


from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

inputDataLength = len(X_test[0])
outputDataLength = len(Y[0])

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers.embeddings import Embedding
from keras.preprocessing import sequence
from keras.layers import Dropout

# fitting the model
embedding_vector_length = 100
model = Sequential()
model.add(Embedding(outputDataLength,embedding_vector_length, input_length=inputDataLength))
model.add(Dropout(0.2))
model.add(LSTM(outputDataLength))
model.add(Dense(outputDataLength, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=10, batch_size=20)
y_pred = model.predict(X_test)
invorg = model.inverse_transform(y_test)
y_test = labelencoder_Y.inverse_transform(invorg)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)

您使用的是
binary\u交叉熵
即使您有
100个
类。这不是正确的做法。对于此任务,您必须使用
categorical\u crossentropy

像这样编译你的模型

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)
model.compile(loss='classifical\u crossentropy',optimizer='adam',metrics=['accurity'])

另外,您正在使用模型进行预测,并转换为类标签,如下所示

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)
由于您的模型是使用softmax激活的,以便获得类别标签,因此您必须找到预测的
argmax

例如,如果预测值为
[0.2,0.3,0.0005,0.99]
则必须取argmax,这将为您提供输出
3
。高概率的类

所以你必须像这样修改预测代码

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)

现在,您将在
invorg
中获得实际类标签,并在
y\u pred

中获得预测类标签,您正在使用
二进制交叉熵
即使您拥有
100个
类。这不是正确的做法。对于此任务,您必须使用
categorical\u crossentropy

像这样编译你的模型

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)
model.compile(loss='classifical\u crossentropy',optimizer='adam',metrics=['accurity'])

另外,您正在使用模型进行预测,并转换为类标签,如下所示

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)
由于您的模型是使用softmax激活的,以便获得类别标签,因此您必须找到预测的
argmax

例如,如果预测值为
[0.2,0.3,0.0005,0.99]
则必须取argmax,这将为您提供输出
3
。高概率的类

所以你必须像这样修改预测代码

y_pred = model.predict(X_test)
inv = onehotencoder.inverse_transform(y_pred)
y_pred = labelencoder_Y.inverse_transform(inv)
y_pred = model.predict(X_test)
y_pred = np.argmax(y_pred, axis=1)
y_pred = labelencoder_Y.inverse_transform(y_pred)

invorg = np.argmax(y_test, axis=1)
invorg = labelencoder_Y.inverse_transform(invorg)

现在,您将在
invorg
中获得实际类标签,在
y\u pred

中获得预测类标签,因此您有100个类。然后你必须使用
categorical\u crossentropy
来计算损失。另外,在预测之后,您必须使用预测的
argmax
,这样您就有100个类。然后你必须使用
categorical\u crossentropy
来计算损失。另外,在预测之后,您必须使用预测的
argmax
,我想您可以使用
binary\u crossentropy
分类精度
是的,您可以。所讨论的代码的主要问题是预测。我正在使用的一个热编码呢?y=y.Reformate(-1,1)onehotencoder=onehotencoder(categories='auto')y=onehotencoder.fit_transform(y).toarray()我得到的数组的常量输出(['67012','67012','67012','67012','67012','67012'],dtype='你所说的输出是什么意思?
model.predict()
给你这个结果。我想你可以使用
二进制交叉熵
分类精度
是的,你可以。问题代码的主要问题是预测。我使用的一个热编码呢?y=y。重塑(-1,1)onehotencoder=onehotencoder(categories='auto')y=onehotencoder。拟合变换(y).toarray()我得到的数组(['67012','67012','67012','67012',…,'67012','67012','67012','67012'])的常量输出,dtype='你所说的输出是什么意思。
model.predict()
会给你这个结果吗。?