2017-12-11 36 views
0

Kerasはすべての入力に対して常に同じクラスを予測します。現在、4つのクラスがあります。 ニュース、天気、スポーツ、経済。Kerasは常に同じ出力を予測します

トレーニングセットは、クラスがトピックと同じ、さまざまなテキストで構成されています。ニュースとスポーツに分類されるテキストは、天気と経済のテキストよりもはるかに多くあります。

  • ニュース:12112のテキスト
  • 天気:私はモデルがスポーツとニュースに偏っされると予想しているでしょう1282のテキスト

:1685のテキスト

  • スポーツ:13669のテキスト
  • 経済代わりに、少なくとも80%の自信を持って天気に分類されるすべての入力ビーイングが天候に完全に偏っています。

    ちょうど私の混乱に追加する:注釈者を訓練する間、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") 
    
  • +0

    あなたのモデルは本当にすべてのスポーツを予測している可能性が非常に高いです。 4つのクラスを正しい順序で解釈していますか?あなたは 'y_train'と' legende'の間を逆にするかもしれません。 –

    +0

    これは可能です。しかし私が混乱させるのは、クラシファイアがほぼ100%の精度を持つことです。とにかく、まずデータを正規化して正規化します。試してみる価値があります。 – Junge

    +0

    'y_train'の中のいくつの要素が' fit'の直前のどのクラスに属しているのかを調べることは興味深いかもしれません。 –

    答えて

    0

    おかげで私はこの問題は何であったかが分かりました。彼のヒントは、各クラスのインスタンスがトレーニングセットにいくつ含まれているかを調べることでした。

    私の場合、One_Hotでクラスをハッシュするのはスマートではないことがわかりました。同じ番号の複数のクラスをエンコードすることがあるためです。私のためにOne_Hotはほぼすべてを1としてエンコードしました。このようにKerasは1を予測することしか学びませんでした。

    関連する問題