Как создать набор данных, аналогичный cifar-10

Я хочу создать набор данных, который имеет тот же формат, что и набор данных cifar-10 для использования с Tensorflow. У него должны быть изображения и метки. В принципе, я хотел бы получить код cifar-10, но разные изображения и метки, и запустить этот код. Я не нашел никакой информации о том, как сделать это в Интернете, и совершенно не знаком с машинным обучением.

Ответы

Ответ 1

Я успешно запускаю код CIFAR10 на нескольких моих собственных наборах данных. Я верю, что смогу дать вам хороший ответ.

Прежде чем мы это сделаем, нам нужно понять формат, в котором находится набор данных CIFAR10. Если мы ссылаемся на https://www.cs.toronto.edu/~kriz/cifar.html и, раздел "Двоичная версия", мы видим следующее:

Другими словами, первый байт является меткой первого изображения, которое - это число в диапазоне 0-9. Следующие 3072 байта являются значениями пиксели изображения. Первые 1024 байта - красный канал значения, следующий 1024 - зеленый, а последний 1024 - синий. значения хранятся в строчном порядке, поэтому первые 32 байта являются красные значения канала для первой строки изображения.

Интуитивно, нам нужно сохранить данные в этом формате. Сначала вы можете сделать как базовый эксперимент, чтобы получить изображения, которые имеют одинаковый размер и одинаковое количество классов, таких как CIFAR10, и помещать их в этот формат. Это означает, что ваши изображения должны иметь размер 32x32x3 и иметь 10 классов. Если вы можете успешно запустить это, вы можете перейти дальше, чтобы учитывать такие случаи, как одиночные каналы, разные входы по размеру и разные классы. Это означает, что вы должны изменить многие переменные в других частях кода. Вы должны медленно прокладывать себе путь.

Я занимаюсь разработкой общего модуля. Мой код для этого находится в https://github.com/jkschin/svhn. Если вы ссылаетесь на код svhn_flags.py, вы увидите там много флагов, которые могут быть изменены в соответствии с вашими потребностями. Я признаю это загадочным сейчас, так как я его не очистил, так что он читаем, но он работает. Если вы готовы потратить некоторое время на грубый взгляд, вы увидите что-то.

Это, вероятно, простой способ запускать собственный набор данных на CIFAR10. Вы могли бы, конечно, просто скопировать определение нейронной сети и реализовать свой собственный читатель, формат ввода, пакетную обработку и т.д., Но если вы хотите, чтобы он работал быстро и просто, настройте свои входы для соответствия CIFAR10.

Надеюсь, это поможет.

EDIT:

Какой-то действительно действительно базовый код, который, я надеюсь, поможет.

from PIL import Image
import numpy as np

im = Image.open('images.jpeg')
im = (np.array(im))

r = im[:,:,0].flatten()
g = im[:,:,1].flatten()
b = im[:,:,2].flatten()
label = [1]

out = np.array(list(label) + list(r) + list(g) + list(b),np.uint8)
out.tofile("out.bin")

Это преобразует изображение в файл байта, который готов к использованию в CIFAR10. Для нескольких изображений просто продолжайте конкатенировать массивы, как указано в формате выше. Чтобы проверить правильность формата, в частности, для варианта использования Asker, вы должны получить размер файла 427 * 427 * 3 + 1 = 546988 байт. Предполагая, что ваши снимки имеют RGB, а значения находятся в диапазоне от 0 до 255. После того, как вы подтвердите это, вы все настроитесь на запуск в TensorFlow. Используйте TensorBoard, чтобы визуализировать одно изображение, чтобы гарантировать правильность.

ИЗМЕНИТЬ 2:

В соответствии с вопросом Asker в комментариях

if not eval_data:
    filenames = [os.path.join(data_dir, 'data_batch_%d.bin' % i)
                 for i in xrange(1, 6)]

Если вы действительно хотите, чтобы это работало, вам нужно изучить вызовы функций кода CIFAR10. В cifar10_input пакеты жестко запрограммированы. Поэтому вам нужно отредактировать эту строку кода, чтобы она соответствовала имени файла bin. Или просто распределите изображения в 6 файлов bin равномерно.

Ответ 2

Я не нашел ни одного ответа, чтобы сделать то, что хотел, чтобы я сделал свое собственное решение. Его можно найти на моем github здесь: https://github.com/jdeepee/machine_learning/tree/master

Этот script преобразует и количество изображений в учебные и тестовые данные, где массивы имеют ту же форму, что и набор данных cifar10.

Код прокомментирован, поэтому его следует легко проследить. Я должен отметить, что он повторяется через главный каталог, содержащий несколько папок, содержащих изображения.

Ответ 3

для набора данных SVHN Вы можете попробовать это для нескольких входных изображений:

import numpy as np
import scipy.io 

mat = scipy.io.loadmat('train_32x32.mat')
data = mat['X']
label = mat['y']

R_data = data[:,:,0,:]
G_data = data[:,:,1,:]
B_data = data[:,:,2,:]

R_data = np.transpose(R_data, (2,0,1))
G_data = np.transpose(G_data, (2,0,1))
B_data = np.transpose(B_data, (2,0,1))

R_data = np.reshape(R_data,(73257,32*32))
G_data = np.reshape(G_data,(73257,32*32))
B_data = np.reshape(B_data,(73257,32*32))

outdata = np.concatenate((label,R_data,G_data,B_data), axis = 1)
step = 10000
for i in range(1,6):
    temp = outdata[i*step:(i+1)*step,:]
    temp.tofile('SVHN_train_data_batch%d.bin' % i)
    print('save data %d' % i)