Keras总是预测相同的输出

Keras总是对我输入的所有数据预测同一个类别。目前有四个类别:新闻、天气、体育和经济。

训练集包含许多不同文本,其类别与主题相同。分类为新闻和体育的文本数量远多于天气和经济的文本数量。

  • 新闻:12112篇文本
  • 天气:1685篇文本
  • 体育:13669篇文本
  • 经济:1282篇文本

我原本预期模型会偏向于体育和新闻,但实际上它完全偏向于天气,每个输入都被分类为天气,且置信度至少为80%。

更让我困惑的是:在训练过程中,注释器的准确率可以达到95%到100%(原文如此!)。我猜我在这里犯了非常愚蠢的错误,但我不知道是什么错误。

这是我调用分类器的方式。它在Windows电脑上的Python 3环境中运行。

with open('model.json') as json_data:model_JSON = json.load(json_data)model_JSON = json.dumps(model_JSON) model = model_from_json(model_JSON)model.load_weights('weights.h5')text = str(text.decode())   encoded = one_hot(text, max_words, split=" ")tokenizer = Tokenizer(num_words=max_words)matrix = tokenizer.sequences_to_matrix([encoded], mode='binary')result = model.predict(matrix)legende = ["News", "Wetter", "Sport", "Wirtschaft"]print(str(legende))print(str(result))cat = numpy.argmax(result)  return str(legende[cat]).encode()

这是我训练分类器的方式。我省略了从数据库获取数据的部分。这是在Linux虚拟机上完成的。我已经尝试过更改损失函数和激活函数,但没有任何效果。我目前也在尝试使用更多的训练轮次,但到目前为止也没有帮助。

max_words = 10000batch_size=32epochs=15rows = cursor.fetchall()X = []Y = []# 读取行数据for row in rows:    X.append(row[5])    Y.append(row[1])num_classes = len(set(Y))Y = one_hot("$".join(Y), num_classes, split="$")for i in range(len(X)):    X[i] = one_hot(str(X[i]), max_words, split=" ")split = round(len(X) * 0.2)     x_test = np.asarray(X[0:int(split)])y_test = np.asarray(Y[0:int(split)])x_train = np.asarray(X[int(split):len(X)])y_train = np.asarray(Y[int(split):len(X)])print('x_test shape', x_test.shape)print('y_test shape', y_test.shape)print(num_classes, 'classes')# 向量化tokenizer = Tokenizer(num_words=max_words)x_train = tokenizer.sequences_to_matrix(x_train, mode='binary')x_test = tokenizer.sequences_to_matrix(x_test, mode='binary')# 将类别向量转换为二进制类别矩阵y_train = keras.utils.to_categorical(y_train, num_classes)y_test = keras.utils.to_categorical(y_test, num_classes)# 创建模型model = Sequential()model.add(Dense(512, input_shape=(max_words,)))model.add(Dropout(0.5))model.add(Dense(num_classes))model.add(Activation('softmax'))model.compile(loss='categorical_crossentropy',    optimizer='adam',    metrics=['accuracy'])history = model.fit(x_train, y_train,    batch_size=batch_size,    epochs=epochs,    verbose=1,    validation_split=0.1    )score = model.evaluate(x_test, y_test,    batch_size=batch_size,     verbose=1    )print('Test score', score[0])print('Test accuracy', score[1])# 将模型写入JSONprint("writing model to json")model_json = model.to_json()with open("model.json", 'w') as json_file:    json_file.write(model_json)# 保存权重为HDF5print("saving weights to hdf5")model.save_weights("weights.h5")

回答:

感谢@***给我的提示,我发现了问题所在。他的建议是查看训练集中每个类别的实例数量。

在我的情况下,我发现使用One_Hot对类别进行哈希处理并不明智,因为它有时会将多个类别编码为相同的数字。对于我来说,One_Hot几乎将所有东西都编码为1。这样,Keras学会了只预测1。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注