Невозможно преобразовать массив размера в форму - PullRequest
0 голосов
/ 02 февраля 2020

Я слежу за видео по машинному обучению на YouTube по адресу https://www.youtube.com/watch?v=lbFEZAXzk0g. Учебник находится в python2, поэтому мне нужно преобразовать его в python3. Вот часть кода, с которой у меня возникает ошибка:

def load_mnist_images(filename):
    if not os.path.exists(filename):
        download(filename)
    with gzip.open(filename,'rb') as file:
        data = numpy.frombuffer(file.read(),numpy.uint8, offset=16)
        data = data.reshape(-1,1,28,28)
        return data/numpy.float32(256)

Я получаю эту ошибку: ValueError: cannot reshape array of size 9992 into shape (1,28,28). Как это исправить? В учебнике это работало. Кроме того, если у меня есть какие-либо другие ошибки, пожалуйста, сообщите мне.

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

изменение формы имеет следующий синтаксис

data.reshape(shape)

формы передаются в виде кортежей (a, b). так что попробуйте,

data.reshape((-1, 1, 28, 28))
0 голосов
/ 03 февраля 2020

Ваш вход не имеет такое же количество элементов, как ваш выходной массив. Ваш ввод - размер 9992. Ваш вывод - размер [? x 1 x 28 x 28], поскольку -1 указывает, что команда изменения формы должна определить, сколько индексов по этому измерению необходимо для размещения вашего массива. 28x28x1 - 784, поэтому любой ввод, который вы хотите изменить в этот размер, должен быть аккуратно делим на 784, чтобы он соответствовал форме вывода. 9992 не делится на 784, поэтому он генерирует ошибку ValueError. Вот минимальный пример, чтобы проиллюстрировать:

import numpy as np

data = np.zeros(2352) # 2352 is 784 x 3
out = data.reshape((-1,1,28,28)) # executes correctly -  out is size [3,1,28,28]

data = np.zeros(9992) # 9992 is 784 x 12.745 ... not integer divisible
out = data.reshape((-1,1,28,28)) # throws ValueError: cannot reshape array of size 9992 into shape (1,28,28)

Итак, если вы не хотите, чтобы ValueError, вам нужно преобразовать входные данные в массив другого размера, где он будет соответствовать правильно.

...