У меня проблема классификации с несколькими метками.Я написал этот собственный генератор.Он считывает изображения и выходные метки с диска и возвращает их партиями размером 32.
def get_input(img_name):
path = os.path.join("images", img_name)
img = image.load_img(path, target_size=(224, 224))
return img
def get_output(img_name, file_path):
data = pd.read_csv(file_path, delim_whitespace=True, header=None)
img_id = img_name.split(".")[0]
img_id = img_id.lstrip("0")
img_id = int(img_id)
labels = data.loc[img_id - 1].values
labels = labels[1:]
labels = list(labels)
label_arrays = []
for i in range(20):
val = np.zeros((1))
val[0] = labels[i]
label_arrays.append(val)
return label_arrays
def preprocess_input(img_name):
img = get_input(img_name)
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
return x
def train_generator(batch_size):
file_path = "train.txt"
data = pd.read_csv(file_path, delim_whitespace=True, header=None)
while True:
for i in range(math.floor(8000/batch_size)):
x_batch = np.zeros(shape=(32, 224, 224, 3))
y_batch = np.zeros(shape=(32, 20))
for j in range(batch_size):
img_name = data.loc[i * batch_size + j].values
img_name = img_name[0]
x = preprocess_input(img_name)
y = get_output(img_name, file_path)
x_batch[j, :, :, :] = x
y_batch[j] = y
ys = []
for i in range(20):
ys.append(y_batch[:,i])
yield(x_batch, ys)
Была небольшая проблема с метками, возвращенными в модель, и она была решена в этом вопросе: обучение модели с несколькими выходами keras
Я проверил этот генератор на одной проблеме выхода.Этот пользовательский генератор работает очень медленно.ETA для одной эпохи с использованием этого пользовательского генератора составляет около 27 часов, в то время как встроенный генератор (с помощью flow_from_directory) занимает 25 минут для одной эпохи.Что я делаю неправильно?
Процесс обучения для обоих тестов идентичен, за исключением используемого генератора.Валидационный генератор похож на тренировочный генератор.Я знаю, что не достигну эффективности встроенного генератора Keras, но эта разница в скорости слишком велика.
РЕДАКТИРОВАТЬ
Некоторые руководства, которые я прочитал для создания пользовательскихгенераторы.
Написание пользовательских генераторов Keras
пользовательский генератор для fit_generator (), который выдает несколько входов с различными формами