Как обучить модель сходства изображений на 20 миллионах изображений (общий размер 10 ГБ)? - PullRequest
0 голосов
/ 28 мая 2019

Моя система настроена с 16 ГБ ОЗУ. Я попытался обучить модель сходства изображений на 20 миллионах изображений (общий размер 10 ГБ), используя VGG19 и ближайшего соседа KNN. При попытке прочитать изображения я получаю ошибку памяти. Даже я пытался тренировать модель на 200000 (общий размер 770MB), но проблема та же. Как я могу прочитать миллионы изображений, чтобы тренировать модели ML.

Ubuntu 18.04.2 LTS, Core ™ i7, Intel® HD Graphics 5500 (Broadwell GT2), 64-разрядная, 16 ГБ ОЗУ

import os
import skimage.io
import tensorflow as tf
from skimage.transform import resize
import numpy as np
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
from sklearn import manifold
import pickle
skimage.io.use_plugin('matplotlib')

dirPath = 'train_data'
args = [os.path.join(dirPath, filename) for filename in os.listdir(dirPath)]

imgs_train = [skimage.io.imread(arg, as_gray=False) for arg in args]
shape_img = (130, 130, 3)

model = tf.keras.applications.VGG19(weights='imagenet', include_top=False,
                                        input_shape=shape_img)
model.summary()
shape_img_resize = tuple([int(x) for x in model.input.shape[1:]])
input_shape_model = tuple([int(x) for x in model.input.shape[1:]])
output_shape_model = tuple([int(x) for x in model.output.shape[1:]])
n_epochs = None

def resize_img(img, shape_resized):
    img_resized = resize(img, shape_resized,
                         anti_aliasing=True,
                         preserve_range=True)
    assert img_resized.shape == shape_resized
    return img_resized

def normalize_img(img):
    return img / 255.

def transform_img(img, shape_resize):
    img_transformed = resize_img(img, shape_resize)
    img_transformed = normalize_img(img_transformed)
    return img_transformed

def apply_transformer(imgs, shape_resize):
    imgs_transform = [transform_img(img, shape_resize) for img in imgs]
    return imgs_transform

imgs_train_transformed = apply_transformer(imgs_train, shape_img_resize)
X_train = np.array(imgs_train_transformed).reshape((-1,) + input_shape_model)
E_train = model.predict(X_train)
E_train_flatten = E_train.reshape((-1, np.prod(output_shape_model)))
knn = NearestNeighbors(n_neighbors=5, metric="cosine")
knn.fit(E_train_flatten)

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

Зная, что керас хорошо работает с генератором, вам следует рассмотреть возможность использования одного: учебник по питону , с использованием генератора с керасом (пример)

Это позволяетзагрузить изображение во время тренировки, партия за партиями.

0 голосов
/ 28 мая 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...