#r #tensorflow #keras #regression #conv-neural-network
Вопрос:
я пытаюсь запустить модель cnn для прогнозирования привлекательности лица (числовой вывод) на основе исключительно изображения человека в качестве входных данных. У меня есть папка с изображениями и база данных оценок (1-7) каждого лица. База данных-это база данных лиц Чикаго и альтернативная база данных лиц взрослых в США на 10 тысяч человек. Однако я изо всех сил пытаюсь запустить его, и все, что я нахожу в cnns, касается проблем классификации (предсказание кошек или собак с уже помеченным набором данных). Также у меня возникли проблемы с чтением изображений, так как изображения CFD имеют размер 2444*1718, и я получаю ошибку «не удается выделить вектор размером 96,1 Мб». У меня 4 ГБ оперативной памяти, я использую 64gui R и сделал memory.limit(размер=56000), даже memory.limit(размер = 560000). При втором размере мне удалось прочитать 130 изображений (100 обучающих, 30 тестовых). Заранее спасибо.
Редактировать: увидев ответ Яошяна, я уточняю,что оценки не только 1,2,…, 7, но поскольку это средний балл 12 человек, они являются десятичными:
memory.limit() ## Checking the set limit
[1] 4055
memory.limit(size=560000)
summary(CFDNEW_all_males$Attractive)
Мин. 1-й Квартал. Среднее Медианное Значение 3-й Кв. Макс.
1.520 2.699 3.160 3.218 3.735 5.071
train_image_files_path <- "/Users/e-mashine/Documents/block 5/pictures cfd/training"
test_image_files_path <- "/Users/e-mashine/Documents/block 5/pictures cfd/testing"
train_files <- list.files(path = train_image_files_path, pattern = "*.jpg", full.names=TRUE)
test_files <- list.files(path = test_image_files_path, pattern = "*.jpg", full.names=TRUE)
train_cnn <- lapply(train_files[1:102], readImage) # if i try the whole train and test sets (305 and 102 images respectively) i get this error :
ошибка: не удается выделить вектор размером 96,1 Мб
test_cnn <- lapply(test_files[1:31], readImage)
str(train_cnn)
Список из 102
$ :Формальный класс «Изображение» [пакет «EBImage»] с 2 слотами
.. ..@ .Данные : число [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 …
.. ..@ цветовой режим: int 2
$ :Формальный класс «Изображение» [пакет «EBImage»] с 2 слотами
.. ..@ .Данные : число [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 …
.. ..@ цветовой режим: int 2
$ :Формальный класс «Изображение» [пакет «EBImage»] с 2 слотами
.. ..@ .Данные : число [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 …
.. ..@ цветовой режим: int 2
$ :Формальный класс «Изображение» [пакет «EBImage»] с 2 слотами
.. ..@ .Данные : число [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 …
.. ..@ цветовой режим: int 2
foreach(i=1:102) %do% {train_cnn[[i]] <- resize(train_cnn[[i]],150,150)}
Ошибка в { : не удалось выполнить задачу 1 — «Ожидание четырехмерного массива»
dim(train_cnn[[1]])
[1] 2444 1718 3
width(train_cnn[[1]])
[1] 2444
height(train_cnn[[1]])
[1] 1718
depth(train_cnn[[1]])
[1] 3
spectrum(train_cnn[[1]])
[1] NA
из того, что я прочитал, он должен иметь ширину 2444, высоту 1718, глубину 1 и спектр 3, но я не знаю, почему это так… может быть, потому, что typeof(train_cnn[[1]]) является двойным, а не целым числом?
Комментарии:
1. Не могли бы вы поделиться каким — нибудь кодом ?
2. @Cristi я отредактировал сообщение
Ответ №1:
Глубокое обучение обычно используется для задач классификационного типа, а не для регрессии. Но такая возможность существует (и используется, например, при обнаружении объектов).
Все, что вам нужно сделать, это сделать ваш конечный результат сигмоидом. Это приведет к исключительному выходу 0,1. Затем масштабируйте его до диапазона (-0.5, 6.5) (***), затем используйте MSE loss. Окончательное предсказание может быть стандартной операцией округления.
(***) диапазон важен. В других настройках можно было бы закодировать ваши прогнозы как 0,1,2,…, 6 и,следовательно, масштабировать сигмоид до диапазона (0,0, 6,0). Но если вы сделаете это, вам будет сложнее (фактически невозможно) для модели предсказать 6-й класс (ваш седьмой класс).
Ваши проблемы с памятью распространены — скорее всего, проблема не в том, что конкретное выделение вызывает проблему, проблема в том, что предыдущее выделение памяти было слишком большим, вероятно, из-за широковещательной передачи. Просто распечатайте размеры вашей модели и тензоров, пока не найдете нарушающий тензор. Вероятно, это случайная трансляция, потому что вы изменили свои формы.