python: AttributeError: l'objet 'str' n'a pas d'attribut 'keys'

Sep 29 2020

J'essaye de résoudre le problème de classification. Je ne sais pas pourquoi j'obtiens cette erreur:

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

Voici le code principal :

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])

où la generate_arrays_for_trainingfonction retourne xet y. xest un tableau 2D de nombres flottants et yvaut [0,1].

Erreur :

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'

Réponses

2 PoeDator Sep 29 2020 at 19:32

votre problème est causé par le class_weight="balanced"paramètre que vous passez àmodel.fit()

selon la référence model.fit () , ce paramètre doit être un dict: dictionnaire facultatif mappant les indices de classe (entiers) à une valeur de poids (flottant), utilisé pour pondérer la fonction de perte (pendant l'entraînement uniquement). Cela peut être utile pour indiquer au modèle de "prêter plus d'attention" aux échantillons d'une classe sous-représentée.

essayez class_weight=Nonede tester, cela devrait éliminer l'erreur d'origine. Plus tard, fournissez un avis approprié class_weightpour résoudre le problème de jeu de données déséquilibré.