Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R Keras形状\u彩色图像的输入_R_Tensorflow_Machine Learning_Keras_Deep Learning - Fatal编程技术网

R Keras形状\u彩色图像的输入

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

我正在自学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, 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)
)