python: AttributeError: obiekt „str” nie ma atrybutu „klucze”

Sep 29 2020

Próbuję rozwiązać problem klasyfikacji. Nie wiem, dlaczego otrzymuję ten błąd:

AttributeError: 'str' object has no attribute 'keys'

Oto główny kod :

def generate_arrays_for_training(indexPat, paths, start=0, end=100):       
    while True:
        from_=int(len(paths)/100*start)
        to_=int(len(paths)/100*end)
        for i in range(from_, int(to_)):
            f=paths[i]
            x = np.load(PathSpectogramFolder+f)
     if('P' in f):
                y = np.repeat([[0,1]],x.shape[0], axis=0)
            else:
                y =np.repeat([[1,0]],x.shape[0], axis=0) 
            yield(x,y)
history=model.fit_generator(generate_arrays_for_training(indexPat, filesPath, end=75) ## problem here
                   steps_per_epoch=int((len(filesPath)-int(len(filesPath)/100*25))), 
                   validation_steps=int((len(filesPath)-int(len(filesPath)/100*75))),
                   verbose=2,class_weight="balanced",
                  epochs=15, max_queue_size=2, shuffle=True, callbacks=[callback])

gdzie generate_arrays_for_trainingfunkcja zwraca xi y. xjest dwuwymiarową tablicą liczb zmiennoprzecinkowych i ywynosi [0,1].

Błąd :

Traceback (most recent call last):
  File "/home/user1/thesis2/CNN_dwt2.py", line 437, in <module>
    main()
  File "/home/user1/thesis2/CNN_dwt2.py", line 316, in main
    history=model.fit_generator(generate_arrays_for_training(indexPat, filesPath, end=75), 
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/util/deprecation.py", line 324, in new_func
    return func(*args, **kwargs)
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1815, in fit_generator
    return self.fit(
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 108, in _method_wrapper
    return method(self, *args, **kwargs)
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py", line 1049, in fit
    data_handler = data_adapter.DataHandler(
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1122, in __init__
    dataset = dataset.map(_make_class_weight_map_fn(class_weight))
  File "/home/user1/.local/lib/python3.8/site-packages/tensorflow/python/keras/engine/data_adapter.py", line 1295, in _make_class_weight_map_fn
    class_ids = list(sorted(class_weight.keys()))

AttributeError: 'str' object has no attribute 'keys'

Odpowiedzi

2 PoeDator Sep 29 2020 at 19:32

Twój problem jest spowodowany class_weight="balanced"przekazanym parametremmodel.fit()

zgodnie z odniesieniem model.fit () parametr ten powinien być dict: Opcjonalny słownik odwzorowujący indeksy klas (liczby całkowite) na wartość wagi (liczba zmiennoprzecinkowa), używany do ważenia funkcji straty (tylko podczas treningu). Może to być przydatne, aby powiedzieć modelowi, aby „zwracał większą uwagę” na próbki z niedostatecznie reprezentowanej klasy.

spróbuj class_weight=Noneprzetestować, powinien pozbyć się pierwotnego błędu. Później podaj odpowiednią wskazówkę, jak class_weightrozwiązać problem z niezrównoważonym zestawem danych.