empfangen ((Keine, 2) vs (Keine, 5))

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.

python – Tensorflow ValueError: Logits und Labels müssen die gleiche Form haben ((None, 2) vs (None, 1)) germanylandofinnovation.com

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.

tensorflow2.0 verwendet seine eigenen Funktionen, um Genauigkeit und Rückruf zu finden (solve Shapes (None, 10) und (None, 1) sind inkompatibel)

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.

Supongo que te gusta

Origin blog.csdn.net/qq_40016005/article/details/121815164
Recomendado
Clasificación