Изменение данных временных рядов с несколькими функциями для RNN

У меня есть набор данных временных рядов с 3 переменными измерения и примерно с 2000 образцами. Я хочу классифицировать образцы по 1 из 4 категорий, используя модель RNN или 1D CNN, используя Keras в R. Моя проблема в том, что я не могу успешно изменить модель с помощью функции k_reshape().

Я следую по гл. 6 из Глубокое обучение с R от Chollet & Allaire, но их примеры не настолько отличаются от моего набора данных, что я теперь запутался. Я безуспешно пытался имитировать код из этой главы книги. Вот ссылка на исходный код главы.

library(keras)

df <- data.frame()
for (i in c(1:20)) {
    time <- c(1:100)
    var1 <- runif (100)
    var2 <- runif (100)
    var3 <- runif (100)
    run <- data.frame(time, var1, var2, var3)
    run$sample <- i
    run$class <- sample(c(1:4), 1)
    df <- rbind(df, run)
}

head(df)

# time  feature1  feature2     feature3 sample class
#     1 0.4168828 0.1152874 0.0004415961      1     4
#     2 0.7872770 0.2869975 0.8809415097      1     4
#     3 0.7361959 0.5528836 0.7201276931      1     4
#     4 0.6991283 0.1019354 0.8873193581      1     4
#     5 0.8900918 0.6512922 0.3656302236      1     4
#     6 0.6262068 0.1773450 0.3722923032      1     4

k_reshape(df, shape(10, 100, 3))

# Error in py_call_impl(callable, dots$args, dots$keywords) : 
#   TypeError: Failed to convert object of type <class 'dict'> to Tensor. Contents: {'time': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 3 

Я очень новичок в изменении формы массивов, но я хотел бы иметь массив с формой: (samples, time, features). Я хотел бы услышать предложения о том, как правильно изменить форму этого массива, или рекомендации о том, как эти данные следует обрабатывать для модели DL, если я не прав в этом отношении.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
427
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел два решения моего вопроса. Мое замешательство возникло из-за сообщения об ошибке от k_reshape, которое я не понял, как интерпретировать.

  1. Используйте функцию array_reshape() из пакета reticulate.
  2. Используйте функцию k_reshape() из keras, но на этот раз используйте подходящую форму.

Вот код, который я успешно выполнил:

# generate data frame
dat <- data.frame()
for (i in c(1:20)) {
        time <- c(1:100)
        var1 <- runif (100)
        var2 <- runif (100)
        var3 <- runif (100)
        run <- data.frame(time, var1, var2, var3)
        run$sample <- i
        run$class <- sample(c(1:4), 1)
        dat <- rbind(df, run)
}

dat_m <- as.matrix(df) # convert data frame to matrix

# time  feature1  feature2     feature3 sample class
#     1 0.4168828 0.1152874 0.0004415961      1     4
#     2 0.7872770 0.2869975 0.8809415097      1     4
#     3 0.7361959 0.5528836 0.7201276931      1     4
#     4 0.6991283 0.1019354 0.8873193581      1     4
#     5 0.8900918 0.6512922 0.3656302236      1     4
#     6 0.6262068 0.1773450 0.3722923032      1     4

# solution with reticulate's array_reshape function
dat_array <- reticulate::array_reshape(x = dat_m[,c(2:4)], dim = c(20, 100, 3))

dim(dat_array)
# [1]  20 100   3

class(dat_array)

# [1] "array"


# solution with keras's k_reshape
dat_array_2 <- keras::k_reshape(x = dat_m[,c(2:4)], shape = c(20, 100, 3))

dim(dat_array)
# [1]  20 100   3

class(dat_array)

# [1]  20 100   3

class(dat_array_2)

# [1] "tensorflow.tensor"  "tensorflow.python.framework.ops.Tensor"     
# [3] "tensorflow.python.framework.ops._TensorLike" "python.builtin.object"   

Несколько заметок:

  • Концептуально, это изменение имеет для меня больше смысла как приведение или распространение данных на языке R.
  • Результатом array_reshape является класс массива, но k_reshape() выводит тензорный объект тензорного потока. Оба работали для меня в созданных сетях глубокого обучения, но я нахожу класс массива гораздо более интерпретируемым.

Другие вопросы по теме