首页 > 解决方案 > 构建一个专门训练用于预测 R 中的数值的 CNN

问题描述

我正在尝试运行一个 cnn 模型,以仅根据一个人的图像作为输入来预测面部吸引力(数字输出)。我有包含图像的文件夹和每张脸的评级数据库(1-7)。数据库是芝加哥人脸数据库和替代的 10k 美国成人人脸数据库。然而,我正在努力运行它,我发现关于 cnns 的所有内容都是针对分类问题(预测具有已标记数据集的猫或狗)。此外,我在读取图像时遇到问题,因为 CFD 图像为 2444*1718,并且出现错误“无法分配大小为 96.1 Mb 的矢量”。我有 4gb RAM 并使用 64gui R 并做了 memory.limit(size=56000),甚至 memory.limit(size=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.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 mb 的向量

test_cnn <- lapply(test_files[1:31], readImage)
str(train_cnn)

102 $ 列表:正式类 'Image' [package "EBImage"] 有 2 个插槽 .. ..@ .Data : num [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 ... .. ..@ colormode: int 2 $ :Formal class 'Image' [package "EBImage"] with 2 slots .. ..@ .Data : num [1:2444, 1:1718, 1:3 ] 1 1 1 1 1 1 1 1 1 1 ... .. ..@ colormode: int 2 $ :Formal class 'Image' [package "EBImage"] 有 2 个插槽 .. ..@ .Data : num [1 :2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 ... .. ..@ colormode: int 2 $ :Formal class 'Image' [package "EBImage"] with 2 slots 。 . ..@ .Data : 数字 [1:2444, 1:1718, 1:3] 1 1 1 1 1 1 1 1 1 1 ... .. ..@ colormode: 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] 不适用

从我读到的应该是 2444 宽度、1718 高度、1 深度和 3 光谱,但我不知道为什么会这样……可能是因为 typeof(train_cnn[[1]]) 是双精度而不是整数?

标签: rtensorflowkerasregressionconv-neural-network

解决方案


深度学习通常用于分类类型的问题,而不是回归。但是这种能力是存在的(例如用于物体检测)。

您所要做的就是使您的最终输出成为 sigmoid。这将产生一个 0,1 输出,独占。然后将其缩放到范围 (-0.5, 6.5) (***),然后使用 MSE 损失。最终预测可以是标准的舍入操作。

(***) 范围很重要。在其他设置中,您可能会将您的预测编码为 0,1,2,...,6,因此将 sigmoid 缩放到范围 (0.0, 6.0)。但是如果你这样做,你会让模型更难(实际上不可能)预测第 6 类(你的第 7 类)。

您的内存问题很常见 - 可能不是导致问题的特定分配,问题是以前的内存分配太大,可能是由于广播。只需打印出模型和张量的大小,直到找到有问题的张量。这可能是一次意外广播,因为您的形状发生了变化。


推荐阅读