Как преобразовать векторы пикселей в массив numpy изображения - PullRequest
0 голосов
/ 20 июня 2020

Например, background-Mnist, который я загрузил из файла mat, дает 50 000x784 для обучающего набора.

Должно быть 50000 изображений 28x28

Я изменил все это, используя

    f_train = scio.loadmat('mnist_background_images/mnist_background_images_train.mat')
    f_test = scio.loadmat('mnist_background_images/mnist_background_images_test.mat')
    data_train = f_train['mnist_background_images_train']
    data_test = f_test['mnist_background_images_test'] #this gives 50,000x785 where last column is y
    x_train = data_train[:, :-1]
    x_test= data_test[:, :-1] #now it's 50,000x784
    x_train = np.reshape(x_train, newshape=(-1, 28, 28 )) #new shape 50,000x28x28
    x_test = np.reshape(x_test, newshape=(-1, 28, 28))

, что дает правильный размер.

Однако, когда я пытался показать каждое изображение с помощью

img = x_train[2]
out = Image.fromarray(img, mode = 'L')
print(x_train.shape) 

, дает (50000, 784)

Изображение получилось совсем не похожим на данные MNIST. Пиксели были перепутаны и повсюду как будто все перемешалось. Я где-то сделал глупую ошибку?

1 Ответ

0 голосов
/ 22 июня 2020

Лог c в вашем коде Python правильный. Похоже, ваш файл .mat поврежден или, по крайней мере, не содержит того, что, по вашему мнению, он должен содержать. (У меня лично были бесконечные головные боли с обменом данными Python / Matlab.) Это маловероятно, но вы можете попробовать

data_train = data_train.T.reshape(50000, 785)

на всякий случай, если действие изменения формы в Matlab было выполнено неправильно.

Если вы загружаете исходные данные , они предоставляются в виде текстовых файлов с суффиксом имени файла .amat.

import numpy as np
data = np.loadtxt('mnist_background_images_test.amat', dtype=np.float32) # shape (50000, 785)
scale = 255 / data.max() 
data8 = np.array(data * scale, dtype=np.uint8) # 8-bit image data

y = data[:, -1].astype(int)
x = data8[:, :-1].reshape(-1, 28, 28)

import matplotlib.pyplot as plt
plt.close('all')
plt.imshow(x[2], cmap='Greys')
plt.show()

Одно изображение из набора MNIST

...