создайте CNN, специально обученный для прогнозирования числового значения в R

#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-й класс (ваш седьмой класс).

Ваши проблемы с памятью распространены — скорее всего, проблема не в том, что конкретное выделение вызывает проблему, проблема в том, что предыдущее выделение памяти было слишком большим, вероятно, из-за широковещательной передачи. Просто распечатайте размеры вашей модели и тензоров, пока не найдете нарушающий тензор. Вероятно, это случайная трансляция, потому что вы изменили свои формы.