#keras #deep-learning #dataset #conv-neural-network
#keras #глубокое обучение #набор данных #conv-нейронная сеть
Вопрос:
У меня есть локальный набор данных, разработанный для папок TrainingSet и testSet, и каждый из них содержит 3 класса, например:
-Training_Set
--Class1
--img1.jpg
--img2.jpg
..
--Class2
--img101.jpg
--img102.jpg
..
--Class3
--img201.jpg
--img202.jpg
-Test_Set
--Class1
--img10.jpg
--img11.jpg
..
--Class2
--img150.jpg
--img140.jpg
..
--Class3
--img210.jpg
--img220.jpg
и я хочу загрузить его так, как мы загружаем набор данных Cifar:
(trainX, trainY), (testX, testY) = cifar10.load_data()
Ответ №1:
Вы можете попробовать это (хотя и не уверены, почему вы хотите, чтобы это было точно так же, как cifar):
import cv2 # pip install opencv-python
import numpy as np
import os
class ImageLoader:
"""Load images in arrays without batches."""
def __init__(self, train_dir, test_dir):
"""Create class."""
self.train_dir = train_dir
self.test_dir = test_dir
def load_data(self):
"""Load the data."""
features, labels = [], []
for source in [self.train_dir, self.test_dir]:
input, output = [], []
for class_name in os.listdir(source):
if os.path.isdir(class_name):
for img_name in os.listdir(class_name):
img = cv2.imread(os.path.join(self.train_dir, class_name, img_name))
# ...
# Modify your image array here.
# ...
input.append(img)
output.append(class_name) # or other method to convert label
# Shuffle labels.
combine = list(zip(input, output)) # zip as list for Python 3
np.random.shuffle(combine)
input, output = zip(*combine)
features.append(input)
labels.append(output)
return [[np.array(features[0], dtype=np.float32),
np.array(labels[0], dtype=np.float32)],
[np.array(features[1], dtype=np.float32),
np.array(labels[1], dtype=np.float32)]]
cifar10 = ImageLoader('path-to-training', 'path-to-testing')
(trainX, trainY), (testX, testY) = cifar10.load_data()
Комментарии:
1. мне это нужно, как Cifar, потому что я хочу применить код, который я нашел на github: github.com/titu1994/DenseNet/blob/master/cifar10.py
2. Код не работает для Python3, а для Python2.7 я получаю эту ошибку: ошибка значения: для распаковки требуется более 0 значений
3. Что значит «не работает для Python3»? И в какой строке вы получаете ValueError?
4. Для Python3 я получил ошибку в функции zip, для ошибки te я получил ее в этой строке: ввод, вывод = zip (* объединить)
5. Я добавил этот бит (
combine = list(zip(input, output))
) для Python 3, и это сработает для вас. Пожалуйста, посмотрите мой обновленный ответ.
Ответ №2:
Вы можете использовать image-dataset-loader
для загрузки своего набора данных:
pip install image-dataset-loader
from image_dataset_loader import load
(x_train, y_train), (x_test, y_test) = load('/path/to/your/dataset', ['Training_Set', 'Test_Set'])
Кроме того, вы можете использовать Keras ImageDataGenerator
и flow_from_directory
вместо этого. Смотрите Этот пример и документы.
Комментарии:
1. я знаю этот метод, но есть две проблемы: он использует пакет, а X, y смешаны. и я хочу загрузить его так, как мы загружаем набор данных Cifar: « (trainX, trainY), (TestX, testY) = cifar10.load_data() «
2. @Adelov Я опубликовал небольшую служебную функцию на GitHub, которая делает то, что вам нужно. Обновлен ответ ссылкой на репозиторий и примером. Более подробную информацию см. в репозитории.