R преобразует матрицу в многомерный массив для использования при обучении сверточной нейронной сети - PullRequest
1 голос
/ 12 марта 2019

Я ужасно застрял при преобразовании матрицы в многомерный массив, который будет использоваться при обучении сверточной нейронной сети.

Вот пример матрицы 2x16 (фактическая матрица будет около 11000x1024)

two_samples <- structure(c(257, 17, 258, 18, 65795, 19, 65796, 20, 261, 21,
262, 22, 65799, 23, 65800, 24, 9, 25, 10, 26, 65547, 27, 65548, 
28, 13, 29, 14, 30, 65551, 31, 65552, 32), .Dim = c(2L, 16L))
two_samples
#>      [,1] [,2]  [,3]  [,4] [,5] [,6]  [,7]  [,8] [,9] [,10] [,11] [,12]
#> [1,]  257  258 65795 65796  261  262 65799 65800    9    10 65547 65548
#> [2,]   17   18    19    20   21   22    23    24   25    26    27    28
#>      [,13] [,14] [,15] [,16]
#> [1,]    13    14 65551 65552
#> [2,]    29    30    31    32

Здесь каждая строка представляет собой один образец, и я хотел бы представить каждый образец, как если бы это было цветное изображение.И я хотел бы расположить данные так, чтобы их можно было использовать с Keras / Tensorflow для обучения CNN.

Генерация данных RGB из десятичных чисел выполняется с помощью функций bitwAnd() и bitwShiftR().Я запускаю команды ниже, чтобы сгенерировать RGB из матрицы.Впоследствии я использовал dim() для массива и aperm() для изменения формы массива:

mat_r <- bitwAnd(bitwShiftR(t(two_samples),16), 255)
mat_g <- bitwAnd(bitwShiftR(t(two_samples),8), 255)
mat_b <- bitwAnd(t(two_samples),255)
two_samples_flat <- array(c(mat_r, mat_g, mat_b))
arr <- array(two_samples_flat, dim=c(4,4,3,2))
data <- aperm(arr, c(4,1,2,3))
data[1,,,]
#> , , 1
#> 
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    0    0
#> [2,]    0    0    0    0
#> [3,]    1    1    1    1
#> [4,]    1    1    1    1
#> 
#> , , 2
#> 
#>      [,1] [,2] [,3] [,4]
#> [1,]    0    0    0    0
#> [2,]    0    0    0    0
#> [3,]    0    0    0    0
#> [4,]    0    0    0    0
#> 
#> , , 3
#> 
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    1    0    0
#> [2,]    1    1    0    0
#> [3,]    1    1    0    0
#> [4,]    1    1    0    0

Однако битовые функции возвращают плоские векторы, и последующее изменение размера не позволяет корректно нарезать многомерный массив.Мое ожидаемое измерение и выходные данные (показан один пример) показаны ниже

> dim(data)
2 4 4 3

> data[1,,,]
, , 1

      [,1] [,2] [,3] [,4] 
 [1,]  0    0    1    1
 [2,]  0    0    1    1 
 [3,]  0    0    1    1
 [4,]  0    0    1    1

, , 2

      [,1] [,2] [,3] [,4] 
 [1,]  1    1    1    1
 [2,]  1    1    1    1
 [3,]  0    0    0    0
 [4,]  0    0    0    0

, , 3

      [,1] [,2] [,3] [,4] 
 [1,]  1    2    3    4
 [2,]  5    6    7    8
 [3,]  9    10   11   12
 [4,]  13   14   15   16

Итак, мой вопрос: как мне подготовить многомерный массив из матрицы, чтобы я мог использовать ее с CNN.Если я правильно понял, я могу использовать array_reshape, чтобы изменить его для использования в сети с плотным слоем: array_reshape(data, c(num_of_samples, width*height*3))

...