【发布时间】:2018-01-24 20:23:08
【问题描述】:
上下文: 我有数百个光栅堆栈,每个堆栈的层数相同。每个堆栈覆盖更大研究区域的不同方形地理图块。每个堆栈可以有一层或多层;这些我等同于图像通道。因此,每个堆栈都可以看作是 (x,y,c) 的 3D 数组。我想采用 z 数量的光栅堆栈并将它们转换为 (z,x,y,c) 的 4D 数组。其目的是格式化这些数据,以便在 Keras 中训练一个需要“通道最后”(z,x,y,c)数组的网络。
问题: 如何将光栅堆栈表示为多通道图像并转换为形状为 (z,x,y,c) 的 4D 数组?
代表:
library(raster)
## three layers/channels for tile #1
x1_1 <- raster(ncol=2,nrow=2)
x1_1[] <- c(11:14)
x1_2 <- raster(ncol=2,nrow=2)
x1_2[] <- c(15:18)
x1_3 <- raster(ncol=2,nrow=2)
x1_3[] <- c(19:22)
# three layers/channels for tile #2
x2_1 <- raster(ncol=2,nrow=2)
x2_1[] <- c(21:24)
x2_2 <- raster(ncol=2,nrow=2)
x2_2[] <- c(25:28)
x2_3 <- raster(ncol=2,nrow=2)
x2_3[] <- c(29:32)
# stack channels from each tile
x1 <- stack(x1_1,x1_2,x1_3)
x2 <- stack(x2_1,x2_2,x2_3)
dim(x1) # (2,2,3)
# cast vectors of each
array(c(as.vector(x1),as.vector(x2)),c(2,2,2,3))
这会将堆栈转换为 4D 数组,但顺序不正确。
, , 1, 1
[,1] [,2]
[1,] 11 13
[2,] 12 14
, , 2, 1
[,1] [,2]
[1,] 15 17
[2,] 16 18
, , 1, 2
[,1] [,2]
[1,] 19 21
[2,] 20 22
...
x 和 y 被转置,顺序按每个堆栈的第 4(通道)维度排序。所需的顺序是将第一个维度作为栅格堆栈/图块的数量z,然后是 x、y,最后是每个栅格的通道(在本例中为 1 到 3)。 R 中的打印顺序将是 (z,x,y,c) 枚举为 (1,2,2,1);(1,2,2,2);(1,2,2,3);(2 ,2,2,1);(2,2,2,2);(2,2,2,3)
我意识到我没有很好地解释这个问题,因为我过去没有过多地处理多维数组。任何帮助,将不胜感激。
【问题讨论】:
-
您对“正确顺序”的理解是什么。
-
好问题;澄清添加到帖子的末尾。谢谢!
-
仍不清楚。该数组有 24 个元素,您只要求索引其中的 6 个。发布一个完整的答案,显示您认为所需的显示顺序和排列。
-
对不够清晰表示歉意。我的示例末尾的数组的暗淡是(2,2,2,3)作为(x,y,z,c),我想要(z,x,y,c)。不幸的是,由于我将示例限制为两个栅格堆栈,因此这也将是 dim == (2,2,2,3) 。如果那是 10 个栅格堆栈,它将是暗淡 == (10,2,2,3)。谢谢!
-
如果你碰巧有 R 的 keras 包,你可以从下面的例子中加载 cifar10 数据并查看所需的结果; dim(x_train) == (50000,32,32,3) 或(图像数量,x 像素,y 像素,RGB 通道)keras.rstudio.com/articles/examples/cifar10_cnn.html