У меня есть функция генератора, которая работает нормально. У меня есть большой список файлов .txt, в котором каждый файл также довольно длинный. Теперь задача будет написать функцию генератора, которая принимает:
- пакет файлов
- , а затем пакет размером 128 из одного файла
мой код сейчас:
data_files_generator <- function(train_set) {
files <- train_set
next_file <- 0
function() {
# move to the next file (note the <<- assignment operator)
next_file <<- next_file + 1
# if we've exhausted all of the files then start again at the
# beginning of the list (keras generators need to yield
# data infinitely -- termination is controlled by the epochs
# and steps_per_epoch arguments to fit_generator())
if (next_file > length(files))
{next_file <<- 1}
# determine the file name
file <- files[[next_file]]
text <- read_lines(paste(data_dir, file, sep = "" )) %>%
str_to_lower() %>%
str_c(collapse = "\n") %>%
removeNumbers() %>%
tokenize_characters(strip_non_alphanum = FALSE, simplify = TRUE)
text <- text[text %in% chars]
dataset <- map(
seq(1, length(text) - maxlen - 1, by = 3),
~list(sentece = text[.x:(.x + maxlen - 1)], next_char = text[.x + maxlen])
)
dataset <- transpose(dataset)
# Vectorization
x <- array(0, dim = c(length(dataset$sentece), maxlen, length(chars)))
y <- array(0, dim = c(length(dataset$sentece), length(chars)))
for(i in 1:length(dataset$sentece)){
x[i,,] <- sapply(chars, function(x){
as.integer(x == dataset$sentece[[i]])
})
y[i,] <- as.integer(chars == dataset$next_char[[i]])
}
rounded_dim <- floor(dim(x)[1]/mini_batch_size)
match_size_to_batch <- 128 * rounded_dim
x <- x[1:match_size_to_batch, 1:maxlen, 1:length(chars)]
y <- y_val[1:match_size_to_batch, 1:length(chars)]
return(list(x, y))
}
}
То, что приходит, приходит, это текстовый файл, который преобразуется в меньшие фрагменты текста (длиной maxlen
), а затем кодируется в горячем виде в матрицы 0 и 1.
Проблема в том, что из моего кода на выходе получается один куб данных размером maxlen x lenght(chars) x samples
, где количество выборок очень велико, и поэтому я хотел бы, чтобы моя функция генератора всегда выводила куб размера maxlen x lenght(chars) x samples(128)
, а затем выводить следующую партию размером maxlen x lenght(chars) x samples
, пока не будет прочитан весь текстовый файл, а затем перейти к следующему текстовому файлу ...
Вывод на данный момент является ошибкой:
Error in py_call_impl(callable, dots$args, dots$keywords) :
ValueError: Cannot feed value of shape (112512, 40, 43) for Tensor 'lstm_layer_input_1:0', which has shape '(128, 40, 43)'
надеюсь, я объяснил это достаточно хорошо, чтобы понять. Я думаю, что мне нужно ввести какой-то цикл for для итерации по длине выборки, но я понятия не имею, как включить это в ген. функция.