检查输入时出错:预期density_1_input具有形状(3773),但数组的形状为(111,)

时间:2019-08-06 10:37:38

标签: python numpy tensorflow keras prediction

我想用keras对电子邮件进行分类,我已经有了包含电子邮件的文件夹,因此我希望keras可以根据我已经分类的内容来确定一个模型,该模型可以预测将未分类的电子邮件放在何处。

因此,我阅读了所有邮件,并使用panda创建了两列的数据框,一个是邮件中所有单词的列表,另一个是邮件所属的文件夹。

此后,我创建了x_trainy_trainx_testy_test来训练和评估我的代码。 这给了我很好的结果,所以我想通过相同的方法对未分类的电子邮件进行分类,读取邮件将其标记化,然后使用pd.get_dummies,然后将其转换为numpy数组。

因为看起来预测调用只能处理numpy列表或numpy数组。

这是问题所在,由于未分类邮件中的单词数不同,并且我的数据集的单词数不同,因此矩阵也不同,这导致形状不同,因此出现错误,我想知道如何解决。

我尝试使用OneHotEncoder,但我不知道这是否是我使用的方式,但失败了

#lst = each row contains all the word of the folder in the list2
#lst2 = each row contains the path to a folder

data = pd.DataFrame(list(zip(lst, lst2)), columns=['text', 'folder'])

train_size = int(len(data) * .8)
train_posts = data['text'][:train_size]
train_tags = data['folder'][:train_size]

test_posts = data['text'][train_size:]
test_tags = data['folder'][train_size:]

model = Sequential()
model.add(Dense(16, input_shape=(vocab_size,)))
model.add(Activation('elu'))
model.add(Dropout(0.2))
model.add(Dense(32))
model.add(Activation('elu'))
model.add(Dropout(0.2))
model.add(Dense(16))
model.add(Activation('elu'))
model.add(Dropout(0.2))
model.add(Dense(num_labels))
model.add(Activation('sigmoid'))
model.summary()

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
history = model.fit(x_train, y_train, batch_size=batch_size, epochs=100, verbose=1, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, batch_size=batch_size, verbose=1)

#read the non-classified mails

sentences = read_files("mail.eml")
sentences = ' '.join(sentences)
sentences = sentences.lower()
salut = unidecode.unidecode(sentences)
salut = text_to_word_sequence(salut)
salut = np.array(pd.get_dummies(salut).values)

pred = model.predict_classes(salut, batch_size=batch_size, verbose=1)
  

培训结果:3018/3018 [==============================]-   0s 64us / step-损耗:0.0215-acc:0.9949-val_loss:0.0217-   val_acc:0.9950

     

ValueError:检查输入时出错:预期density_1_input具有   形状(3773,),但数组的形状为(111,)

我总共使用3773个单词,我将其分为x_train和x_test,训练长度为3773的80%,因此3018,其余(775)进行测试

  

traning_time(适合)

     

3018/3018 [==============================]-0s 67us / step-损耗:0.0225-acc: 0.9950-val_loss:0.0221-val_acc:0.9950

     

test_time(评估)

     

755/755 [==============================]-0s 25us / step

     

评估结果

     

测试成绩:0.022089334732748024   测试准确度:0.9950132541309129

我忘了说read_files调用只是我读取文件并返回邮件中所有单词的列表的功能

我测试了通过添加尽可能多的列(全为零)以匹配3773长度来完成长度111矩阵的方法,此方法确实有效,但是矩阵肯定是假的,这给了我非常差的结果,而我有一个较高的“准确性”和“ val_accuracy”

如果您知道如何解决,请说出您的想法

1 个答案:

答案 0 :(得分:0)

我解决了两个矩阵之间的lengtg问题,这是因为在对未分类的邮件和其他邮件进行标记时,我没有使用相同的字典。

因此,如果有人遇到此问题,则需要在所有程序中使用相同的令牌生成器。