Eine kleine Zusammenfassung von Klassifizierungsproblemen beim Ausführen von Deep-Learning-Modellen mit Keras.
Was ich bekam, war ein 2-Kategorie-Modell, das in 5 Kategorien geändert werden muss. Zuerst hatte ich keine Ahnung, also habe ich mich umgesehen, das Problem gelöst und es für die spätere Betrachtung zusammengefasst.
Das obige ist der Beitrag, den ich gefunden habe und der mein Problem lösen kann.
Ich bin neu beim maschinellen Lernen und dachte, ich fange mit Keras an. Hier klassifiziere ich Filmkritiken mithilfe der binären Kreuzentropie in drei Klassen (positiv als 1, neutral als 0 und negativ als -1). Wenn ich also versuche, mein Keras-Modell mit dem Tensorflow-Schätzer zu umschließen, erhalte ich den Fehler.
Der Code lautet wie folgt:
Dies bedeutet wahrscheinlich, dass er ein Modell mit drei Kategorien ausführen möchte, und wenn er das Modell zum Ausführen in die Hand bekommt, wird ein Fehler gemeldet. Der Code lautet wie folgt:
import tensorflow as tf
import numpy as np
import pandas as pd
import numpy as K
csvfilename_train = 'train(cleaned).csv'
csvfilename_test = 'test(cleaned).csv'
# Read .csv files as pandas dataframes
df_train = pd.read_csv(csvfilename_train)
df_test = pd.read_csv(csvfilename_test)
train_sentences = df_train['Comment'].values
test_sentences = df_test['Comment'].values
# Extract labels from dataframes
train_labels = df_train['Sentiment'].values
test_labels = df_test['Sentiment'].values
vocab_size = 10000
embedding_dim = 16
max_length = 30
trunc_type = 'post'
oov_tok = '<OOV>'
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer(num_words = vocab_size, oov_token = oov_tok)
tokenizer.fit_on_texts(train_sentences)
word_index = tokenizer.word_index
sequences = tokenizer.texts_to_sequences(train_sentences)
padded = pad_sequences(sequences, maxlen = max_length, truncating = trunc_type)
test_sequences = tokenizer.texts_to_sequences(test_sentences)
test_padded = pad_sequences(test_sequences, maxlen = max_length)
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(6, activation = 'relu'),
tf.keras.layers.Dense(2, activation = 'sigmoid'),
])
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
num_epochs = 10
model.fit(padded, train_labels, epochs = num_epochs, validation_data = (test_padded, test_labels))
Fehlermeldung:
ValueError: logits and labels must have the same shape ((None, 2) vs (None, 1))
Hier meine begeisterte Antwort:
Es wies sofort auf das Problem hin: Zum einen sollte die binäre Verlustklassifizierung in eine Mehrfachklassifizierung geändert werden, und zum anderen sollte die endgültige Dense-Schicht in 3 geändert und das Etikett in One-Hot umgewandelt werden.
Ändern Sie "binary_crossentropy" in "loss" in "categorical_crossentropy".
model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
Dann wird die Anzahl der Layer des letzten Dense-Layers auf 3 geändert
tf.keras.layers.Dense(3, activation = 'sigmoid'),
Es gibt auch einen Artikel von einem älteren Bruder, der ebenfalls von großem Referenzwert ist, also habe ich ihn unten gepostet.
Die Rolle der dichten Schicht
In Keras entspricht es einer vollständig verbundenen Schicht, die die Ausgabe des vorherigen Dense als Eingabe des nächsten Dense empfängt und das letzte Dense für die Ausgabe verantwortlich ist.
das ist alles.