Ошибка значения: не удалось передать входной массив из формы (50,50,3) в форму (50,50)

#python #jupyter-notebook #conv-neural-network

#python #jupyter-ноутбук #conv-нейронная сеть

Вопрос:

Пытаюсь загрузить данные из dataset в массив data[ ] , выдает ошибку трансляции.

код :

 path = os.path.join(cur_path , r'Pothole_Image_Data')
print(path)
images = os.listdir(path)
for i in images   :
  try   :
     image =  Image.open(path   '\'    i )
     image = image.resize((50,50))
     image = np.array(image)
     data.append(image)
  except : 
    print("Image not found")

data = np.array(data)
print(data.shape)
 

ошибка :

   ValueError  Traceback (most recent call last)

   11         print("Image not found")
   ---> 13 data = np.array(data)
   14 print(data.shape)

ValueError: could not broadcast input array from shape (50,50,3) into shape (50,50)
 

Ответ №1:

Изображения обычно загружаются в виде массивов X * Y * 3 (или 3 * X * Y), поскольку изображения хранят значения для красного, зеленого и синего значений пикселей. Так что либо преобразуйте их в массив 50,50,3 (создавая 4D N * 50 * 50 *3 ) массив или подумайте о том, как вы хотите объединить 3 цветовых канала.

Если вы хотите создать из него изображение в оттенках серого (которое можно сохранить в массиве 50×50), используйте, например, метод яркости: val = (0.3 * R) (0.59 * G) (0.11 * B).

Но это зависит от вашего приложения. Я предполагаю, что (учитывая способ построения массива изображений) он будет использоваться в нейронной сети? Тогда я бы просто использовал 3 канала. Tensorflow может справиться с этим, у Conv2d даже есть переменная для установки количества каналов.

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

1. Добавлена эта строка: image = np.ones((50,50,3,1)) print(data.shape) , дает это : (618, 50, 50, 3, 1) Хорошо ли это делать?

2. Ах, это создает другое измерение. Что вы также можете попробовать, так это numpy.squeeze() , который удаляет любое измерение размера 1. Это было бы более аккуратным решением, если бы вы спросили меня.