R - mxnet RNN "Несовместимый атрибут в узле на 0-м выходе" - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над многослойной RNN для языковой модели на уровне слов. Он имеет конфигурацию «один-к-одному», так что для каждого шага в обучающем наборе прогноз проверяется на основе набора из тех же измерений. Модель почти полностью заимствована из примера, выложенного здесь , но адаптированного для моделирования на уровне слов. Мой вариант здесь .

Другое различие между приведенным выше примером сценария состоит в том, что данные, с которыми я работаю, имеют несколько сегментов. Я полагаю, что я правильно сконцентрировал данные, но когда они передаются в mx.model.buckets, я получаю некоторую вариацию этой ошибки:

Start training with 1 devices
Error in exec$update.arg.arrays(arg.arrays, match.name, skip.null) : 
  [17:25:59] `c:\jenkins\workspace\mxnet\mxnet\src\operator\tensor\../elemwise_op_common.h:123: Check failed: assign(&dattr, (*vec)[i]) Incompatible attr in node  at 0-th output: expected [32,7], got [32,8]`

Проблема заключается в несоответствии фактических и ожидаемых входных размеров. Размер пакета равен 32, а значения 7 и 8 связаны с последовательными сегментами в bucket.plan.

train_data <- mx.io.bucket.iter(buckets = train_buckets$buckets,
                                batch.size = batch_size, 
                                data.mask.element = 0, shuffle = TRUE)

eval_data <- mx.io.bucket.iter(buckets = eval_buckets$buckets,
                               batch.size = batch_size,
                               data.mask.element = 0, shuffle = TRUE)

Из приведенных выше итераторов я могу получить данные пакета и корзины:

> head(train_data$bucket.plan, 10)
 8  9 10  3 22 10 10  8 15 21 
 1  1  1  1  1  2  3  2  1  1 
> train_data$batch
[1] 1
> train_data$bucketID
8 
1 

Значение train_data$batch используется в bucket.iter в качестве индекса для извлечения имени следующего сегмента из train_data$bucket.plan:

iter.next = function() {
        .self$batch <- .self$batch + 1
        .self$bucketID <- .self$bucket.plan[batch]

Имена блоков соответствуют длине назначенных им предложений минус 1. Таким образом, для блока 8 размер пакета должен быть [32, 7], чего ожидает обучающая функция. Но, как указано в ошибке, на самом деле выбираются входные размеры для bucket.plan[2].

В других случаях первая партия успешно обрабатывается только для того, чтобы сгенерировать ошибку во второй партии, в которой ожидаются входные размеры для корзины на bucket.plan[n], но вместо этого возвращаются размеры для bucket.plan[n-1]:

Start training with 1 devices
Error in exec$update.arg.arrays(arg.arrays, match.name, skip.null) : 
  [17:37:53] c:\jenkins\workspace\mxnet\mxnet\src\operator\tensor\../elemwise_op_common.h:123: Check failed: assign(&dattr, (*vec)[i]) Incompatible attr in node  at 0-th output: expected [32,42], got [32,10]
> head(train_data$bucket.plan, 10)
11 43  8  6  7  3  6 12 15 12 
 1  1  1  1  1  1  2  1  1  2 
> train_data$batch
[1] 2
> train_data$bucketID
43 
 1 

Кажется, что нет несоответствия между данными и метками:

> dim(train_data$buckets[[names(train_data$bucketID)]]$data)
[1]  42 186
> dim(train_data$buckets[[names(train_data$bucketID)]]$label)
[1]  42 186

Сценарии, которые, по моему мнению, являются предметом спора: инкубатор-mxnet / R-пакет / R / mx.io.bucket.iter.R и инкубатор-mxnet / R-пакет / R / executor.R . По какой-то причине индексы для итерации по bucket.plan не обновляются корректно.

Я нашел несколько других тем на эту тему, но ничего, что помогло бы мне устранить ошибку.

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...