Python, Keras,Tensorflow

#python #dictionary

#python #словарь

Вопрос:

Я пытаюсь загрузить данные для школьного проекта на Tensorflow / Keras.

 import numpy as np
import matplotlib.pyplot as plt
import os
import cv2
import json

DATADIR = (r"C:UsersellioAnaconda Lessons amp; QuizzesCompetitionImages")
with open('categories.json') as json_file:  
    categories = json.load(json_file)

for category in categories:
    path=os.path.join(DATADIR,category)
    for img in os.listdir(path):
        img_array=cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
        plt.imshow(img_array,cmap='gray')
        plt.show()
        break
break

training_data = []

def create_training_data(): 
    for category in categories:
        path=os.path.join(DATADIR,category)
        class_num=categories.index(category)
        for img in os.listdir(path):
            try:
                img_array=cv2.imread(os.path.join(path,img),cv2.IMREAD_GRAYSCALE)
                new_array=cv2.resize(img_array,(IMG_SIZE,IMG_SIZE))
                training_data.append([new_array,class_num])
            except Exception as e:
                pass

create_training_data()
  

Когда я ввожу код, ошибка 'dict' object has no attribute 'index'

Я думаю, это как-то связано с моим файлом json в категориях. Ниже приведены категории из файла json. Это как-то связано с тем, что это словарь, а не список?

 {'Mobile': {'Others Mobile amp; Tablet': 35, 'Smartfren': 53, 'Infinix': 40, 'Brandcode': 39, 'Icherry': 52, 'Advan': 45, 'Iphone': 31, 'Realme': 51, 'Motorola': 49, 'Maxtron': 56, 'Nokia': 38, 'Xiaomi': 34, 'Mito': 46, 'Sony': 33, 'SPC': 57, 'Lenovo': 37, 'Alcatel': 55, 'Samsung': 32, 'Vivo': 42, 'Evercoss': 44, 'Strawberry': 50, 'Blackberry': 36, 'Asus': 43, 'Honor': 54, 'Oppo': 41, 'Huawei': 47, 'Sharp': 48}, 'Fashion': {'Wedding Dress': 23, 'Shirt': 27, 'Casual Dress': 18, 'Maxi Dress': 20, 'Big Size Dress': 24, 'Bodycon Dress': 22, 'Party Dress': 19, 'Blousexa0': 26, 'Tshirt': 25, 'Crop Top ': 29, 'Tanktop': 28, 'Others': 17, 'A Line Dress': 21, 'Big Size Top': 30}, 'Beauty': {'Foundation': 1, 'Face Palette': 0, 'Concealer': 7, 'Lip Gloss': 14, 'Blush On': 2, 'Highlighter': 8, 'BB amp; CC Cream': 5, 'Other Face Cosmetics': 4, 'Lip Tint': 13, 'Bronzer': 11, 'Lip Liner': 15, 'Powder': 3, 'Setting Spray': 10, 'Primer': 9, 'Contour': 6, 'Other Lip Cosmetics': 16, 'Lipstick': 12}}
  

Комментарии:

1. Вы пробовали изменить «index» на «get»?

Ответ №1:

Эй, прежде всего, я бы избегал наличия пробелов в каталогах.

 DATADIR = (r"C:UsersellioAnaconda Lessons amp; QuizzesCompetitionImages")
  

Кроме того, в python значение объекта dictionary основано на ключе, а не на индексе, поэтому оно должно быть:

 class_num=categories.get(category)
  

или

 class_num=categories[category]
  

проверьте здесь для получения дополнительной информации: https://docs.python.org/2/tutorial/datastructures.html#dictionaries

Ответ №2:

В вашем случае (вложенная структура json) без выравнивания вашего json вы бы не получили того, что хотите.

Сначала вам следует выровнять словарь, создав функцию:

 def flatten(d):
    if not isinstance(d, dict):
        return d
    flattened = dict()
    for k in d:
        if isinstance(d[k], dict):
            flattened = {**flattened, **flatten(d[k])}
        else:
            flattened[k] = d[k]
    return flattened
  

И добавьте эту строку после вашей json.load строки:

 categories = flatten(categories)
  

Наконец, вы получите свой class_num в вашем for цикле с помощью:

 class_num = categories[category]