Kerasはすべての入力に対して常に同じクラスを予測します。現在、4つのクラスがあります。 ニュース、天気、スポーツ、経済。Kerasは常に同じ出力を予測します
トレーニングセットは、クラスがトピックと同じ、さまざまなテキストで構成されています。ニュースとスポーツに分類されるテキストは、天気と経済のテキストよりもはるかに多くあります。
- ニュース:12112のテキスト
- 天気:私はモデルがスポーツとニュースに偏っされると予想しているでしょう1282のテキスト
:1685のテキスト
ちょうど私の混乱に追加する:注釈者を訓練する間、95%から100%(ic!)の精度スコアに達するでしょう。私はここで本当に馬鹿なことをしていると思いますが、それは何か分かりません。
これは私の分類器をどのように呼び出すかです。それは、Windows PCで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 VM上で行われます。 私はすでに紛失とアクティベーションを変更しようとしましたが、何も起こりませんでした。 また、私は現在、より多くのエポックを使用しようとしていますが、それまではどちらも役に立たなかったのです。 @Danielメーラーがくれたことを、先端に
max_words = 10000
batch_size=32
epochs=15
rows = cursor.fetchall()
X = []
Y = []
# Einlesen der Rows
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')
#vektorisieren
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')
#klassenvektor zu binärer klassenmatrix
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
#model erstellen
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])
#write model to json
print("writing model to json")
model_json = model.to_json()
with open("model.json", 'w') as json_file:
json_file.write(model_json)
#save weights as hdf5
print("saving weights to hdf5")
model.save_weights("weights.h5")
あなたのモデルは本当にすべてのスポーツを予測している可能性が非常に高いです。 4つのクラスを正しい順序で解釈していますか?あなたは 'y_train'と' legende'の間を逆にするかもしれません。 –
これは可能です。しかし私が混乱させるのは、クラシファイアがほぼ100%の精度を持つことです。とにかく、まずデータを正規化して正規化します。試してみる価値があります。 – Junge
'y_train'の中のいくつの要素が' fit'の直前のどのクラスに属しているのかを調べることは興味深いかもしれません。 –