r - 构建一个专门训练用于预测 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]]) 是双精度而不是整数?
解决方案
深度学习通常用于分类类型的问题,而不是回归。但是这种能力是存在的(例如用于物体检测)。
您所要做的就是使您的最终输出成为 sigmoid。这将产生一个 0,1 输出,独占。然后将其缩放到范围 (-0.5, 6.5) (***),然后使用 MSE 损失。最终预测可以是标准的舍入操作。
(***) 范围很重要。在其他设置中,您可能会将您的预测编码为 0,1,2,...,6,因此将 sigmoid 缩放到范围 (0.0, 6.0)。但是如果你这样做,你会让模型更难(实际上不可能)预测第 6 类(你的第 7 类)。
您的内存问题很常见 - 可能不是导致问题的特定分配,问题是以前的内存分配太大,可能是由于广播。只需打印出模型和张量的大小,直到找到有问题的张量。这可能是一次意外广播,因为您的形状发生了变化。
推荐阅读
- javascript - 使用 _id 字符串的 GraphQL 查询,对象 ID 存储在 MongoDB 中
- python - 生成器函数产生最大的可迭代值
- python - 从安装有毒物的车轮记录覆盖范围
- process - 发出“SIGUSR1”信号时发送退出代码
- html - 如何编辑svg图像中的文本
- asp.net - 性能计数器 - ASP.NET v4.0.30319 - 系统级 ASP.NET 的空白/缺少计数器对象,但不是应用程序级 ASP.NET
- f# - 有没有办法让 F# 保持参数的类型通用?
- struct - 检测 getHTTPRequestData 中的引用者并创建多个结构
- python - 在字符串列表的每个项目中查找特定模式(正则表达式)(Python)
- python - 无法使用 Python 和 SQL Server 执行参数化 SQL