Вы знаете проблему, некоторые изображения доставляют боль, вам придется отлаживать, я думаю.Попробуйте каждый раз преформовать np.stack () и поймать, где он идет не так.Форма всех изображений будет напечатана, когда стек больше не работает, это может дать вам представление о том, что происходит не так.Не могу помочь дальше, так как я не могу воспроизвести это.np.stack объединяет все изображения поверх друг друга, но, следовательно, каждое изображение должно быть одинаковым.
for image_name in train.Id:
img_path = os.path.join(data_dir, 'train', img_name)
img = imageio.imread(img_path)
img = skimage.transform.resize(img, (32, 32), mode='constant')
img = img.astype('float32') # this will help us in later stage
temp.append(img)
try:
train_x = np.stack(temp)
except ValueError:
[print(im.shape) for im in temp]
break
Чтобы почувствовать себя лучше с помощью np.stack, рассмотрите следующий код:
tmp = [np.zeros((400,400,3)), np.zeros((400,400,3))]
print(np.stack(tmp).shape)
>>> (2, 400, 400, 3)
tmp = [np.zeros((400,400,3)), np.zeros((400,400))]
print(np.stack(tmp).shape)
>>> ValueError: all input arrays must have the same shape
В первом примере у меня есть список с двумя трехмерными массивами, точно стакой же формыNumpy складывает их вместе и создает новое измерение, часто называемое размером партии.Во втором у меня есть 3D и 2D массив в списке, и когда вы пытаетесь сложить два массива с различной формой (400, 400, 3) против (400, 400), вы получите ошибку ValueError, которую вы упомянули.
Я также взял на себя смелость взглянуть на документацию по скимджу справа здесь
На обратном пути вы увидите следующее:
img_array: ndarray Другой цветполосы / каналы хранятся в третьем измерении, так что серым изображением является MxN, RGB-изображением MxNx3 и RGBA-изображением MxNx4.
У меня такое ощущение, что некоторые из ваших изображенийчитать как массив MxNx4 вместо MxNx3
Надеюсь, я немного помог, не стесняйтесь спрашивать меня больше.
РЕДАКТИРОВАТЬ
for image_name in train.Id:
img_path = os.path.join(data_dir, 'train', img_name)
img = imageio.imread(img_path)
img = skimage.transform.resize(img, (32, 32), mode='constant')
img = img.astype('float32') # this will help us in later stage
if len(img.shape) == 3 and img.shape[-1] == 3 # only append if 3D and last dimension is a 3, standing for RGB
temp.append(img)
train_x = np.stack(temp)