Seite 1 von 1

InvalidArgumentError: Graph execution error

Verfasst: Dienstag 31. Mai 2022, 15:32
von nichtSoGuter
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)

Re: InvalidArgumentError: Graph execution error

Verfasst: Dienstag 31. Mai 2022, 15:45
von nichtSoGuter
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

Re: InvalidArgumentError: Graph execution error

Verfasst: Dienstag 31. Mai 2022, 17:24
von nichtSoGuter
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