ValueError: все входные массивы должны иметь одинаковую форму (машинное обучение) - PullRequest
0 голосов
/ 17 октября 2018

У меня проблема с одним из домашних заданий по машинному обучению.Нас просят использовать машинное обучение, чтобы оценить возраст человека по данному изображению.Нам дан набор данных из 28360 изображений поездов и 7090 тестовых изображений.

У меня проблема во фрагменте №3 моего кода, который можно найти ЗДЕСЬ:) В частности, я получаю ValueError: all input arrays must have the same shape.Как я уже упоминал выше, мой набор данных поезда имеет размер 28360. После запуска программы из temp.append(img) я могу получить место print(len(temp)), что снова дает мне 28360. Возможно, у меня нет полного понимания того, что именноnp.stack(temp) работает или как это работает, но размеры моего начального и конечного массива кажутся одинаковыми, так почему проблема .?

Обсуждается, и мне говорят, что проблема не обязательно связана сдлина моего temp списка, а скорее, что я могу столкнуться с изображением, которое не имеет такой же размер, как другие.Это одно или несколько из содержащихся изображений с измененным размером (которые являются массивами) имеют другую форму, возможно, из-за сбоя изменения размера или отсутствия изображения или чего-то еще.Если это так, то как бы найти то, что отличается и почему в наборе данных из 28360 изображений, чтобы я мог их исправить или отбросить?Это действительно проблема, или это может быть что-то еще.? * 10101

Кто-нибудь, пожалуйста, помогите.Что я делаю неправильно?Любые комментарии / предложения будут с благодарностью.Заранее спасибо.Ура и хорошего дня.!: D

1 Ответ

0 голосов
/ 17 октября 2018

Вы знаете проблему, некоторые изображения доставляют боль, вам придется отлаживать, я думаю.Попробуйте каждый раз преформовать 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)
...