检查输入时出错:预期 dense_1_input 具有形状 (3773,) 但得到形状为 (111,) 的数组
Error when checking input: expected dense_1_input to have shape (3773,) but got array with shape (111,)
我想用 keras 对电子邮件进行分类,我已经有了包含电子邮件的文件夹,所以我希望 keras 识别一个模型,根据我已经分类的内容预测将非分类电子邮件放在哪里。
所以我阅读了所有邮件并用熊猫创建了一个包含两列的数据框,一列是邮件中所有单词的列表,另一列是它所属的文件夹。
之后我创建了 x_train
、y_train
、x_test
和 y_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)
Results of the trainings: 3018/3018 [==============================] -
0s 64us/step - loss: 0.0215 - acc: 0.9949 - val_loss: 0.0217 -
val_acc: 0.9950
ValueError: Error when checking input: expected dense_1_input to have
shape (3773,) but got array with shape (111,)
我总共用了 3773 个词,我分成 x_train 和 x_test 训练长度是 3773 的 80% 所以 3018 剩下的 (775) 去测试
traning_time (fit)
3018/3018 [==============================] - 0s 67us/step - loss: 0.0225 - acc: 0.9950 - val_loss: 0.0221 - val_acc: 0.9950
test_time (evaluate)
755/755 [==============================] - 0s 25us/step
result of evaluate
Test score: 0.022089334732748024
Test accuracy: 0.9950132541309129
我忘了说 read_files 调用只是我创建的一个函数,它读取文件和 return 邮件中所有单词的列表
我测试通过添加尽可能多的列(全为零)来匹配长度为 3773 的长度来完成长度为 111 的矩阵,这确实有效,但矩阵肯定是假的,这给我带来了非常糟糕的结果,而我具有很高的“准确性”和“val_accuracy”
如果你知道如何解决,请说出你的想法
我解决了两个矩阵之间的 lengtg 问题,因为我在标记非分类邮件和其他邮件时没有使用相同的字典。
所以如果有人遇到这个问题,你需要在整个程序中使用相同的分词器。
我想用 keras 对电子邮件进行分类,我已经有了包含电子邮件的文件夹,所以我希望 keras 识别一个模型,根据我已经分类的内容预测将非分类电子邮件放在哪里。
所以我阅读了所有邮件并用熊猫创建了一个包含两列的数据框,一列是邮件中所有单词的列表,另一列是它所属的文件夹。
之后我创建了 x_train
、y_train
、x_test
和 y_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)
Results of the trainings: 3018/3018 [==============================] - 0s 64us/step - loss: 0.0215 - acc: 0.9949 - val_loss: 0.0217 - val_acc: 0.9950
ValueError: Error when checking input: expected dense_1_input to have shape (3773,) but got array with shape (111,)
我总共用了 3773 个词,我分成 x_train 和 x_test 训练长度是 3773 的 80% 所以 3018 剩下的 (775) 去测试
traning_time (fit)
3018/3018 [==============================] - 0s 67us/step - loss: 0.0225 - acc: 0.9950 - val_loss: 0.0221 - val_acc: 0.9950
test_time (evaluate)
755/755 [==============================] - 0s 25us/step
result of evaluate
Test score: 0.022089334732748024 Test accuracy: 0.9950132541309129
我忘了说 read_files 调用只是我创建的一个函数,它读取文件和 return 邮件中所有单词的列表
我测试通过添加尽可能多的列(全为零)来匹配长度为 3773 的长度来完成长度为 111 的矩阵,这确实有效,但矩阵肯定是假的,这给我带来了非常糟糕的结果,而我具有很高的“准确性”和“val_accuracy”
如果你知道如何解决,请说出你的想法
我解决了两个矩阵之间的 lengtg 问题,因为我在标记非分类邮件和其他邮件时没有使用相同的字典。
所以如果有人遇到这个问题,你需要在整个程序中使用相同的分词器。