Мой код создал массив numpy внутри другого массива numpy для одного списка, но не для другого списка, который проходит точно такой же процесс - PullRequest
0 голосов
/ 24 января 2020

Я разрабатываю простой Искусственный интеллект для проекта колледжа, и пока он работал, пока он не начал случайным образом создавать массив numpy внутри другого массива numpy. Один из конвертируемых списков - это набор данных, который я создал сам, который затем перебирается, и каждое изображение читается cv2 и добавляется в новый список. Этот новый список затем преобразуется в массив numpy (именно он вызывает проблему). Второй, меньший список (тестовые изображения) проходит тот же процесс и дает желаемый результат.

Это код набора данных, каждая строка является именем файла.

images = ['Dana C zero 1.png','Dana C zero 2.png','Dana C zero 3.png','Dana C zero 4.png','Dana C zero 5.png',
          'Dana C zero 6.png','Dana C zero 7.png','Dana C zero 8.png','Dana C zero 9.png',
          'Dana C zero 10.png','Dana C zero 11.png','Dana C zero 12.png','Dana C zero 13.png','Dana C zero 14.png',
          'Dana C zero 15.png','Dana C zero 16.png','Dana C zero 17.png','Dana C zero 18.png','Dana C zero 19.png',
          'Dana C one 1.png','Dana C one 2.png','Dana C one 3.png','Dana C one 4.png','Dana C one 5.png',
          'Dana C one 6.png','Dana C one 7.png','Dana C one 8.png','Dana C one 9.png',
          'Dana C one 10.png','Dana C one 11.png','Dana C one 12.png','Dana C one 13.png',
          'Dana C one 14.png','Dana C one 15.png','Dana C one 16.png','Dana C one 17.png',
          'Dana C one 18.png','Dana C one 19.png','Dana C two 1.png','Dana C two 2.png','Dana C two 3.png',
          'Dana C two 4.png','Dana C two 5.png','Dana C two 6.png','Dana C two 7.png','Dana C two 8.png',
          'Dana C two 9.png','Dana C two 10.png','Dana C two 11.png','Dana C two 12.png','Dana C two 13.png',
          'Dana C two 14.png','Dana C two 15.png','Dana C two 16.png','Dana C two 17.png','Dana C two 19.png',
          'Dana C two 20.png','Dana C three 1.png','Dana C three 2.png','Dana C three 3.png',
          'Dana C three 4.png','Dana C three 5.png','Dana C three 6.png','Dana C three 7.png','Dana C three 8.png',
          'Dana C three 9.png','Dana C three 10.png','Dana C three 11.png','Dana C three 12.png',
          'Dana C three 13.png','Dana C three 14.png','Dana C three 15.png','Dana C three 16.png',
          'Dana C three 17.png','Dana C three 18.png','Dana C three 19.png',
          'Dana C four 1.png','Dana C four 2.png','Dana C four 3.png','Dana C four 4.png','Dana C four 5.png','Dana C four 6.png','Dana C four 7.png',
          'Dana C four 8.png','Dana C four 9.png','Dana C four 10.png','Dana C four 11.png','Dana C four 12.png','Dana C four 13.png','Dana C four 14.png',
          'Dana C four 15.png','Dana C four 16.png','Dana C four 17.png','Dana C four 18.png','Dana C four 19.png',
          'Dana C five 1.png','Dana C five 2.png','Dana C five 3.png','Dana C five 4.png','Dana C five 5.png','Dana C five 6.png','Dana C five 7.png',
          'Dana C five 8.png','Dana C five 9.png','Dana C five 10.png','Dana C five 11.png','Dana C five 12.png','Dana C five 13.png','Dana C five 14.png','Dana C five 15.png',
          'Dana C five 16.png','Dana C five 17.png','Dana C five 18.png','Dana C five 19.png',
          'Dana C six 1.png','Dana C six 2.png','Dana C six 3.png','Dana C six 4.png','Dana C six 5.png','Dana C six 6.png','Dana C six 7.png',
          'Dana C six 8.png','Dana C six 9.png','Dana C six 10.png','Dana C six 11.png','Dana C six 12.png','Dana C six 13.png',
          'Dana C six 14.png','Dana C six 15.png','Dana C six 16.png','Dana C six 17.png','Dana C six 18.png','Dana C six 19.png',
          'Dana C seven 1.png','Dana C seven 2.png','Dana C seven 3.png','Dana C seven 4.png','Dana C seven 5.png','Dana C seven 6.png',
          'Dana C seven 7.png','Dana C seven 8.png','Dana C seven 9.png','Dana C seven 10.png','Dana C seven 11.png','Dana C seven 12.png',
          'Dana C seven 13.png','Dana C seven 14.png','Dana C seven 15.png','Dana C seven 16.png','Dana C seven 17.png','Dana C seven 18.png','Dana C seven 19.png',
          'Dana C eight 1.png','Dana C eight 2.png','Dana C eight 3.png','Dana C eight 4.png','Dana C eight 5.png','Dana C eight 6.png',
          'Dana C eight 7.png','Dana C eight 8.png','Dana C eight 9.png','Dan C eight 10.png','Dana C eight 11.png','Dana C eight 12.png',
          'Dana C eight 13.png','Dana C eight 14.png','Dana C eight 15.png','Dana C eight 16.png','Dana C eight 17.png','Dana C eight 18.png','Dana C eight 19.png']
readyImages = []
readyLabels = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                        2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
                        3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                        4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                        5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
                        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
                        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
                        8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8])
testImages = ['Dana C zero 20.png','Dana C one 20.png','Dana C two 18.png','Dana C three 20.png','Dana C four 20.png','Dana C five 20.png',
              'Dana C six 20.png','Dana C seven 20.png','Dana C eight 20.png']
readyTestImages = []
testLabels = [0,1,2,3,4,5,6,7,8]

Код ниже - это два цикла for, используемые для создания списка «подготовленных изображений»

for i in range (0, len(images)):
  img = cv2.imread(images[i])
  readyImages.append(img)
for i in range (0, len(testImages)):
  img = cv2.imread(testImages[i])
  readyTestImages.append(img)

Эти два «готовых» списка затем превращаются в numpy массивы со следующим кодом:

readyImages = np.array(readyImages)
readyTestImages = np.array(readyTestImages) 

После этого массив 'readyImages' выглядит следующим образом:

array([array([[[179, 179, 179],
        [185, 185, 185],
        [204, 204, 204],
        ...,
        [181, 181, 181],
        [182, 182, 182],
        [179, 179, 179]],

       [[218, 218, 218],
        [229, 229, 229],
        [237, 237, 237],
        ...,
        [228, 228, 228],
        [229, 229, 229],
        [229, 229, 229]],

       [[240, 240, 240],
        [252, 252, 252],
        [253, 253, 253],
        ...,
        [252, 252, 252],
        [252, 252, 252],
        [254, 254, 254]],

       ...,

(остальная часть массива не включена, так как он массивный) Массив 'readyTestImages' выглядит следующим образом это (в норме):

array([[[[255, 255, 255],
         [255, 255, 255],
         [255, 255, 255],
         ...,
         [255, 255, 255],
         [255, 255, 255],
         [255, 255, 255]],

        [[255, 255, 255],
         [255, 255, 255],
         [255, 255, 255],
         ...,
         [255, 255, 255],
         [255, 255, 255],
         [255, 255, 255]],

        [[255, 255, 255],
         [255, 255, 255],
         [255, 255, 255],
         ...,
         [255, 255, 255],
         [255, 255, 255],
         [255, 255, 255]],

        ...,

Все изображения, тестирование и обучение, имеют размер 28x28, поэтому это не является причиной проблемы (поскольку она уже вызвала проблемы, которые до этого были решены). Я знаю, что вызывает эту проблему, но она не позволяет моей программе работать. Incase его полезно, пока данные данные пытаются пройти через нейронную модель (код ниже):

train_images = readyImages
train_labels = readyLabels
test_images = testImages
train_images = train_images / 255.0


model = keras.Sequential([
                          keras.layers.Flatten(input_shape=(28,28, 3)),
                          keras.layers.Dense(784, activation = 'relu'),
                          keras.layers.Dense(128, activation = 'relu'),
                          keras.layers.Dense(10, activation = 'softmax')
])

model.compile(optimizer = 'adam',
              loss = 'sparse_categorical_crossentropy',
              metrics = ['accuracy'])

Я получаю эту ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-93cf1c129e74> in <module>()
      2 train_labels = readyLabels
      3 test_images = testImages
----> 4 train_images = train_images / 255.0
      5 
      6 

TypeError: unsupported operand type(s) for /: 'NoneType' and 'float'

Если кто-то может помочь, я бы очень ценю это, и я могу отправить или добавить любую необходимую информацию.

1 Ответ

2 голосов
/ 24 января 2020

Проблема в

for i in range (0, len(images)):
  img = cv2.imread(images[i])
  readyImages.append(img)

cv2.imread может произойти сбой (например, если файл изображения обрезается), в этом случае img будет None. При преобразовании списка с массивом None в numpy некоторые элементы в массиве также будут None, поэтому при попытке нормализовать изображения, разделив их на 255, вы получите сообщение об ошибке.

Добавьте флажок img, чтобы убедиться, что изображение загружено правильно, а затем отмените соответствующие метки для изображений, которые не загружаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...