Я работаю над многослойной 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
не обновляются корректно.
Я нашел несколько других тем на эту тему, но ничего, что помогло бы мне устранить ошибку.
Есть идеи?