R Keras形状\u彩色图像的输入
我正在自学keras框架,并尝试使用R在faces数据集上训练神经网络。我使用python3.8、keras 2.4.3和tensor flow 2.3.1以及其他先决条件配置了python环境 我对IMDB和WIKI faces图像提供的“mat”文件进行了一系列预处理。我得到了一个较小的(玩具)样本,大约20K的图像,我想用它来训练一个简单的完全连接的神经网络来预测年龄。我知道CNN是这里的黄金标准,但我没有GPU 以下是一些示例数据:R Keras形状\u彩色图像的输入,r,tensorflow,machine-learning,keras,deep-learning,R,Tensorflow,Machine Learning,Keras,Deep Learning,我正在自学keras框架,并尝试使用R在faces数据集上训练神经网络。我使用python3.8、keras 2.4.3和tensor flow 2.3.1以及其他先决条件配置了python环境 我对IMDB和WIKI faces图像提供的“mat”文件进行了一系列预处理。我得到了一个较小的(玩具)样本,大约20K的图像,我想用它来训练一个简单的完全连接的神经网络来预测年龄。我知道CNN是这里的黄金标准,但我没有GPU 以下是一些示例数据: structure(list(n = 1:6, ful
structure(list(n = 1:6, full_path = c("nm1477924_rm1835773952_1995-12-3_2005.jpg",
"nm1628077_rm1138526464_1999-4-27_2009.jpg", "nm0106844_rm841063168_1963-5-29_1973.jpg",
"nm1415323_rm1815778816_1992-11-23_2002.jpg", "nm0272706_rm399017216_1994-10-9_2004.jpg",
"nm1216253_rm549034752_1989-2-15_1999.jpg"), gender = c(0L, 0L,
0L, 0L, 0L, 0L), age = c("10", "10", "10", "10", "10", "10")), row.names = c(NA,
6L), class = "data.frame")
我使用dplyr的group_by、sample_frac和anti_join创建培训、验证和测试图像子集,以解决类别不平衡问题。事实上,在我的预处理过程中,我故意删除了许多对于给定年龄/性别组没有足够表现力的图像
然后,我创建三个标签向量(训练、验证和测试),其中我将年龄映射到从0开始到最大年龄的列表;这在三个子集(keras要求)中是一致的
接下来,我将图像加载到三个子集,将它们转换为数组,调整大小并重新缩放-这是我这一步的代码:
image = keras::image_load(image_paths[1], target_size = c(28,28))
image = keras::image_to_array(image)
image = image/255
因此,我最终得到了每个维度(1:28,1:18,3)的图像。现在,我正在努力为密集层提供输入形状。在此之前,我按如下方式预分配一个数组:
dim = c(length(image_list), 28, 28, 3)
并用for循环中的所有图像填充它
但是,我不理解layer_dense的文档,其中说明:
input_shape-输入的维度(整数)不包括样本轴。将此图层用作模型中的第一个图层时,此参数是必需的
然后,文档添加了:
输入形状:带形状的nD张量:(批量大小,…,输入尺寸)。最常见的情况是带有形状的2D输入(批量大小、输入尺寸)
所以我尝试了28283,但我得到了一个错误
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: in user code:
/~/Documents/IMDBWIKI/image_class_env_3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:806 train_function *
return step_function(self, iterator)
/~/Documents/IMDBWIKI/image_class_env_3.8/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py:796 step_function **
outputs = model.distribute_strategy.run(run_step, args=(data,))
/~/Documents/IMDBWIKI/image_class_env_3.8/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
/~/Documents/IMDBWIKI/image_class_env_3.8/lib/python3.8/site-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
return self._call_for_each_replica(fn, args, kwargs)
/~/Documents/
然后,我引入了一个带有输入形状c(28,28,3)的扁平层,但我的精度和验证精度太低,这让我产生了疑问
(1) 我的输入层应该是什么样子
(2) 我应该使用layer_flatte()来展平输入吗
这是我的代码(我玩过不同的单位数量、批量大小和年代):
my_model%
层展平(输入形状=c(28,28,3))%>%
层密度(单位=512,activation=“relu”)%>%
层密度(单位=256,activation=“relu”)%>%
层密度(单位=n类,激活=“softmax”)
我的\u模型%>%编译(
optimizer=“adam”,
loss=“稀疏\分类\交叉熵”,
度量=c(“准确度”),
)
历史%fit(
我的火车照片,
训练有素的,
纪元=100,
批次大小=32,
验证数据=列表(我的有效图片,有效)
)
我的结果很差-30%的准确率,但是0.023的验证准确率。所以我不知道该怎么想
谢谢你的帮助
my_model <- keras_model_sequential() %>%
layer_flatten(input_shape = c(28,28,3)) %>%
layer_dense(units =512, activation = "relu") %>%
layer_dense(units =256, activation = "relu") %>%
layer_dense(units = n_classes, activation = "softmax")
my_model %>% compile(
optimizer ="adam",
loss="sparse_categorical_crossentropy",
metrics=c("accuracy"),
)
history <- my_model %>% fit(
my_train_pics,
trainy,
epochs = 100,
batch_size = 32,
validation_data = list(my_valid_pics, validy)
)