Jun*_*nge 5 python machine-learning prediction keras
Keras 总是会为我给出的每个输入预测相同的类。目前有四个类别。\n新闻、天气、体育和经济。
\n\n训练集由许多不同的文本组成,其中类别与其主题相同。分类为新闻和体育的文本比天气和经济的文本多得多。
\n\n我本以为该模型会偏向体育和新闻,但它完全偏向天气,每个输入都被分类为天气,置信度至少为 80%。
\n\n只是为了增加我的困惑:在训练注释器时,准确度分数将达到 95% 到 100%(原文如此!)。我想我在这里做了一些非常愚蠢的事情,但我不知道那是什么。
\n\n这就是我对分类器的称呼。它在 Windows 电脑上的 python 3 上运行。
\n\nwith open(\'model.json\') as json_data:\nmodel_JSON = json.load(json_data)\n\nmodel_JSON = json.dumps(model_JSON) \nmodel = model_from_json(model_JSON)\n\nmodel.load_weights(\'weights.h5\')\n\ntext = str(text.decode()) \nencoded = one_hot(text, max_words, split=" ")\n\ntokenizer = Tokenizer(num_words=max_words)\nmatrix = tokenizer.sequences_to_matrix([encoded], mode=\'binary\')\n\nresult = model.predict(matrix)\n\nlegende = ["News", "Wetter", "Sport", "Wirtschaft"]\nprint(str(legende))\nprint(str(result))\n\ncat = numpy.argmax(result) \nreturn str(legende[cat]).encode()\n
Run Code Online (Sandbox Code Playgroud)\n\n这就是我训练分类器的方法。我省略了从数据库获取数据的部分。这是在 Linux 虚拟机上完成的。\n我已经尝试更改丢失和激活,但没有任何反应。\n此外,我目前正在尝试使用更多纪元,但到目前为止这也没有帮助。
\n\nmax_words = 10000\nbatch_size=32\nepochs=15\n\nrows = cursor.fetchall()\n\nX = []\nY = []\n\n# Einlesen der Rows\nfor row in rows:\n X.append(row[5])\n Y.append(row[1])\n\nnum_classes = len(set(Y))\nY = one_hot("$".join(Y), num_classes, split="$")\n\n\nfor i in range(len(X)):\n X[i] = one_hot(str(X[i]), max_words, split=" ")\n\nsplit = round(len(X) * 0.2) \n\nx_test = np.asarray(X[0:int(split)])\ny_test = np.asarray(Y[0:int(split)])\n\nx_train = np.asarray(X[int(split):len(X)])\ny_train = np.asarray(Y[int(split):len(X)])\n\nprint(\'x_test shape\', x_test.shape)\nprint(\'y_test shape\', y_test.shape)\n\nprint(num_classes, \'classes\')\n\n#vektorisieren\ntokenizer = Tokenizer(num_words=max_words)\nx_train = tokenizer.sequences_to_matrix(x_train, mode=\'binary\')\nx_test = tokenizer.sequences_to_matrix(x_test, mode=\'binary\')\n\n#klassenvektor zu bin\xc3\xa4rer klassenmatrix\ny_train = keras.utils.to_categorical(y_train, num_classes)\ny_test = keras.utils.to_categorical(y_test, num_classes)\n\n#model erstellen\nmodel = Sequential()\n\nmodel.add(Dense(512, input_shape=(max_words,)))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(num_classes))\nmodel.add(Activation(\'softmax\'))\n\nmodel.compile(loss=\'categorical_crossentropy\',\n optimizer=\'adam\',\n metrics=[\'accuracy\'])\n\n\nhistory = model.fit(x_train, y_train,\n batch_size=batch_size,\n epochs=epochs,\n verbose=1,\n validation_split=0.1\n )\n\nscore = model.evaluate(x_test, y_test,\n batch_size=batch_size, \n verbose=1\n )\n\nprint(\'Test score\', score[0])\nprint(\'Test accuracy\', score[1])\n\n#write model to json\nprint("writing model to json")\nmodel_json = model.to_json()\nwith open("model.json", \'w\') as json_file:\n json_file.write(model_json)\n\n#save weights as hdf5\nprint("saving weights to hdf5")\nmodel.save_weights("weights.h5")\n
Run Code Online (Sandbox Code Playgroud)\n
感谢@Daniel M\xc3\xb6ller给我的提示,我发现了问题所在。他的建议是查看训练集中包含每个类的实例数。
\n\n就我而言,我发现使用 One_Hot 对类进行哈希处理并不明智,因为它有时会使用相同的数字对多个类进行编码。对我来说,One_Hot 将几乎所有内容都编码为 1。这样 Keras 就学会了只预测 1。
\n 归档时间: |
|
查看次数: |
6743 次 |
最近记录: |