InvalidArgumentError: Graph execution error

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

Ich habe folgedendes Model geschrieben.

Code: Alles auswählen

# training model A um bilder außer (shirt und sandal zu klassifizieren)

model_a = Sequential([
    Flatten(input_shape =[28,28]),
    
    Dense(300, kernel_initializer = "lecun_normal"),
    BatchNormalization(),
    Activation("selu"),
    
    Dense(100, kernel_initializer = "lecun_normal", use_bias=False),
    BatchNormalization(),
    Activation("selu"),
    
    Dense(50, kernel_initializer = "lecun_normal", use_bias=False),
    BatchNormalization(),
    Activation("selu"),
    
    Dense(50, kernel_initializer = "lecun_normal", use_bias=False),
    BatchNormalization(),
    Activation("selu"),
    
    Dense(50, kernel_initializer = "lecun_normal", use_bias=False),
    BatchNormalization(),
    Activation("selu"),
    
    Dense(8, activation = "softmax")
])

model_a.compile(optimizer="adam", loss ="sparse_categorical_crossentropy", metrics = ["accuracy"])

history = model_a.fit(X_train_a, y_train_a, epochs = 5, validation_data = (X_val_a, y_val_a))
Dabei übergebe ich dem Model beim fitten die Trainingsdaten X_train_a und y_train_a. Die trainingsdaten ist das MNIST Fashion dataset OHNE die Bilder mit den Label 6 und 5 (also ohne die Bilder von Sandalen und Tshirts). Die anzahl der verschiednen Lables sind also 8 (0,1,2,3,4,7,8,9).

Wenn ich bei dem letzten Dense Layer 10 units mache scheint alles zu funktionieren. Wenn ich 8 units mache (was eigentlich richtig sein sollte, da ich ja nur acht klassen habe), erhalte ich die Fehlermeldung:

InvalidArgumentError: Graph execution error:
[....]
Node: 'sparse_categorical_crossentropy/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits'
Received a label value of 9 which is outside the valid range of [0, 8). Label values: 1 9 8 9 8 9 1 1 9 9 2 1 2 7 8 0 4 8 8 9 0 4 4 9 4 4 8 8 4 0 7 2

Was verursacht den Fehler?

Das MNIST Fashion dataset habe ich folgendermaßen gesplittet

Code: Alles auswählen

# funktion, welche übergeben X und y aufteilt
def split_dataset(X,y):
    # liste von X und y wobei label mit sandal&shirt=true/ rest=false
    y_sandal_shirts_ture = (y == 6) | (y == 5)
    
    # sandal/ shirt ist ture
    X_sandal_shirt = X[y_sandal_shirts_ture == True]
    y_sandal_shirt = y[y_sandal_shirts_ture == True]
    
    # rest ist false
    X_rest = X[y_sandal_shirts_ture == False]
    y_rest = y[y_sandal_shirts_ture == False]
    
    return X_sandal_shirt, X_rest, y_sandal_shirt, y_rest

# laden von MNIST Fashion
(X_train_full, y_train_full), (X_test, y_test) = keras.datasets.fashion_mnist.load_data()

# Aufteilung der daten in validation und training set
X_val = X_train_full[:5000]
X_train = X_train_full[5000:]
y_val = y_train_full[:5000]
y_train = y_train_full[5000:]

# Aufteilung Daten in ein Dataset mit NUR tshirt und sandal label / und einem Dataset OHNE tshirt und sandal label 
X_train_b, X_train_a, y_train_b, y_train_a = split_dataset(X_train,y_train)
X_val_b, X_val_a, y_val_b , y_val_a = split_dataset(X_val, y_val)
X_test_b, X_test_a, y_test_b, y_test_a = split_dataset(X_test, y_test)
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

ich habe den fehler. Die label des datasets musste verschoben werden. Mit dem Code zum Splitten der Daten funktionierts:

Code: Alles auswählen

def split_dataset(X,y):
    # liste von X und y wobei label mit sandal&shirt=true/ rest=false
    y_sandal_shirts_ture = (y == 6) | (y == 5)
    
    # sandal/ shirt ist ture
    X_sandal_shirt = X[y_sandal_shirts_ture == True]
    y_sandal_shirt_nicht_verschoben= y[y_sandal_shirts_ture == True]
    
    # rest ist false
    X_rest = X[y_sandal_shirts_ture == False]
    y_rest_nicht_verschoben = y[y_sandal_shirts_ture == False]
    
    # label verschieben
    # bei sandal und shirt um 5
    y_sandal_shirt = y_sandal_shirt_nicht_verschoben-5
    
    # bei rest ab label 6 um 2 nach links verschieben
    y_rest= y_rest_nicht_verschoben[y_rest_nicht_verschoben>6]-2
    
    return X_sandal_shirt, X_rest, y_sandal_shirt, y_rest
nichtSoGuter
User
Beiträge: 92
Registriert: Mittwoch 13. April 2022, 17:40

ich habe noch einen Fehler gefunden. y_rest war nicht richtig verschoben. Richtig wäre

Code: Alles auswählen

def split_dataset(X,y):
    # liste von X und y wobei label mit sandal&shirt=true/ rest=false
    y_sandal_shirts_ture = (y == 6) | (y == 5)
    
    # sandal/ shirt ist ture
    X_sandal_shirt = X[y_sandal_shirts_ture == True]
    y_sandal_shirt= y[y_sandal_shirts_ture == True]
    
    # rest ist false
    X_rest = X[y_sandal_shirts_ture == False]
    y_rest = y[y_sandal_shirts_ture == False]
    
    # label verschieben
    # bei sandal und shirt um 5
    y_sandal_shirt-=5
    
    # bei rest ab label 6 um 2 nach links verschieben
    y_rest[y_rest>6]-=2
    
    return X_sandal_shirt, X_rest, y_sandal_shirt, y_rest

Antworten