Я ужасно застрял при преобразовании матрицы в многомерный массив, который будет использоваться при обучении сверточной нейронной сети.
Вот пример матрицы 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))