r - 无法使用 unet 获得有效输出
问题描述
我正在尝试用 R 编程语言学习 keras、tensorflow 和 unet 的 CNN。我离优化还很远,我目前的目标是得到一个 output。我从教程中获取了代码。在教程中,他们使用了Caravana 数据集。因为我无法获得这个数据集,所以我无法按原样复制教程,所以我构建了自己的数据集,该数据集由数字地形模型中的 1250 条道路组成。
然后我修改了教程中的示例,暂时删除了数据增强,因为我不知道如何对图像和蒙版应用相同的修改。我还让它在改变输入形状的灰度图像上工作。最后,我尝试使用用于训练的相同图像进行预测。在这个阶段,这并不重要。我试图得到一个输出而不是什么。
library(unet)
library(keras)
library(tfdatasets)
library(tidyverse)
library(rsample)
library(reticulate)
create_dataset <- function(data, train, batch_size = 32L) {
dataset <- data %>%
tensor_slices_dataset() %>%
dataset_map(~.x %>% list_modify(
img = tf$image$decode_jpeg(tf$io$read_file(.x$img)),
mask = tf$image$decode_gif(tf$io$read_file(.x$mask))[1,,,][,,1,drop=FALSE]
)) %>%
dataset_map(~.x %>% list_modify(
img = tf$image$convert_image_dtype(.x$img, dtype = tf$float32),
mask = tf$image$convert_image_dtype(.x$mask, dtype = tf$float32)
)) %>%
dataset_map(~.x %>% list_modify(
img = tf$image$resize(.x$img, size = shape(128, 128)),
mask = tf$image$resize(.x$mask, size = shape(128, 128))
))
# train in batches; batch size might need to be adapted depending on
# available memory
dataset <- dataset %>% dataset_batch(batch_size)
# output needs to be unnamed
dataset %>% dataset_map(unname)
}
dice <- custom_metric("dice", function(y_true, y_pred, smooth = 1.0) {
y_true_f <- k_flatten(y_true)
y_pred_f <- k_flatten(y_pred)
intersection <- k_sum(y_true_f * y_pred_f)
(2 * intersection + smooth) / (k_sum(y_true_f) + k_sum(y_pred_f) + smooth)
})
model <- unet(input_shape = c(128, 128, 1))
model %>% compile(
optimizer = optimizer_rmsprop(lr = 1e-5),
loss = "binary_crossentropy",
metrics = list(dice, metric_binary_accuracy)
)
images_dir <- "data/images/"
masks_dir <- "/data/masks/"
data <- tibble(
img = list.files(images_dir, full.names = TRUE),
mask = list.files(masks_dir, full.names = TRUE)
)
training_dataset <- create_dataset(data, train = TRUE, batch_size = 32L)
validation_dataset <- create_dataset(data, train = FALSE, batch_size = 32L)
model %>% fit(training_dataset, epochs = 10)
predicted_mask <- predict(model, validation_dataset)
u = validation_dataset %>% as_iterator() %>% iter_next()
u1 = u[[1]] %>% array_branch(1)
u2 = u[[2]] %>% array_branch(1)
image(u1[[1]][,,1], asp = 1, col = gray.colors(50,0,1))
image(u2[[1]][,,1], asp = 1, col = gray.colors(50,0,1))
image(predicted_mask[1,,,1], asp = 1, col = gray.colors(50,0,1))
无论有多少 epoch 或多少训练图像,我使用的最佳输出都是这样的:
我的代码和流程有什么问题?我并不期待第一次尝试的出色结果,而只是一个非随机输出,可以帮助我从工作代码开始。
解决方案
推荐阅读
- gcc - 如何使 GCC 警告转到标准输出而不是标准错误?
- javascript - Determine an array index by clicking on element
- graphql - Apollo GraphQL 客户端 - 从 JS 修改数据(React)
- python - tkinter 中的字体大小与 Tkinter 中的窗口大小/像素密度因子/原始屏幕分辨率之间的关系是什么
- algorithm - 用算法而不是组合学解决无色拼图?
- html - SQL Server sp_send_dbmail 阻止正文中的 html 编码
- c# - 如何以编程方式检查组的“将组对话和事件的副本发送给组成员”选项?
- php - 如何不更新更新函数的值?
- powershell - Resolve-PnPFolder 的权限
- c++ - 使用 constinit const 时 static_assert 失败。混淆 constinit、constinit const、constexpr、const、非常量变量