首页 > 解决方案 > 如何使用 R 中 tfdatasets 的输入管道将包括图像在内的混合数据输入深度学习模型

问题描述

这是我在 stackoverflow 中的第一篇文章,可能很容易回答。但是,由于缺乏关于 R 中这个特定问题的教程,我认为这对于尝试实现包括图像在内的混合数据的 R 用户来说是一个很好的参考。

具体来说,我的任务是拟合具有多个输入的深度学习模型,包括用于回归任务的 R 中的图像数据。我使用 tfdatasets 从包含图像路径和其他数据的文本文件中生成 PrefetchDataset(预处理管道类似于这个(https://blogs.rstudio.com/ai/posts/2019-08-23-unet/) ,除了只有一个图像变量)看起来像这样:

training_dataset('validation_dataset' 看起来很相似)

<PrefetchDataset 形状:((20, 512, 512, 3), (20, 2), (20,)),类型:(tf.float32, tf.float64, tf.float32)>

第一个张量是图像数据(批量大小、宽度、高度、通道),然后是附加数值数据(批量大小,两列),最后是目标(批量大小,一列)。我确保输入层完全采用这些尺寸,并且编译模型工作正常。这是用于实例化模型的代码片段:

 model <- keras_model(
    inputs = c(input_cnn, input_dense),
    outputs = c(main_output)
  )

基本上,我的问题是关于如何将数据集提供给 fit 函数。我以前的任务是只使用图像数据,我这样做了:

history <- model %>% fit(x = training_dataset,
                         epochs = 100,
                         steps_per_epoch = dataset_size/batch_size,
                         validation_data = validation_dataset)

显然,不需要指定 fit() 中的 y 参数。使用新数据集时,我会遇到各种错误,主要是以下错误:

py_call_impl(callable, dots$args, dots$keywords) 中的错误:AssertionError: in user code: ...

到目前为止,我已经尝试使用三个单独的 PrefetchDatasets(图像、附加信息、目标)并像这样适应它,fit(x = list(training_dataset_images, training_dataset_additional), y = training_dataset_targets...)但没有这样的工作。另外,我认为必须有一种优雅的方式来做到这一点。

软件:Keras 2.3.0.0、tfdatasets 2.0.0、tensorflow 2.2.0、R 3.6.3。

对问题的提示以及如何改进我的帖子表示赞赏:-)

编辑

我只想提一下,我认为我找到了解决方案,或者至少找到了适合我的解决方法。我会在这里分享它,因为它可能会帮助其他人。我所做的是dataset_prepare在 tfdatasets 输入管道中插入函数,因此生成的数据集如下所示:

<PrefetchDataset 形状:{x: {img: (20, 512, 512, 3), aux: (20, 2)}, y: (20,)},类型:{x: {img: tf.float32, aux : tf.float64}, y: tf.float32}>

然后我使用以下代码从数据集中绘制一个批次(验证和测试数据集相同),我可以遍历它:

iter_train <- make_iterator_one_shot(training_dataset)
next_batch_train <- iterator_get_next(iter_train)

这样,我就可以调用,例如,使用next_batch_train$y.

最后,我用于train_on_batch训练、test_on_batch验证和测试,使用一个简单的 for 循环遍历每个 epoch 的所有批次,直到数据集“运行为空”。对于下一个时代,我make_iterator_one_shot再次使用,依此类推。我最终自己编写了部分 Kerasfit函数的原始版本,这样我就可以在训练和验证期间对指标有所了解。

更简单的解决方案表示赞赏:-)

标签: rtensorflowkeras

解决方案


推荐阅读