Форматирование входных текстовых данных для CNN во Flux, в Julia - PullRequest
1 голос
/ 28 октября 2019

Я внедряю CNN Юна Кима (https://arxiv.org/abs/1408.5882) для классификации текста в Юлии, используя Flux в качестве основы глубокого обучения, с отдельными предложениями в качестве входных точек данных. Модель zoo (https://github.com/FluxML/model-zoo) оказалась полезнойдо некоторой степени, но у него нет примера NLP с CNN. Я хотел бы проверить, является ли мой формат входных данных правильным.

В Flux 1D Conv нет явной реализации, поэтомуЯ использую Conv, найденный в https://github.com/FluxML/Flux.jl/blob/master/src/layers/conv.jl Вот часть строки документации, которая объясняет формат входных данных:

Data should be stored in WHCN order (width, height, # channels, # batches).
In other words, a 100×100 RGB image would be a `100×100×3×1` array,
and a batch of 50 would be a `100×100×3×50` array.

Мой формат следующий:

1. width: since text in a sentence is 1D, the width is always 1 
2. height: this is the maximum number of tokens allowable in a sentence
3. \# of channels: this is the embedding size
4. \# of batches: the number of sentences in each batch

Следуя примеру MNIST в зоопарке модели, у меня есть

function make_minibatch(X, Y, idxs)
    X_batch = zeros(1, num_sentences, emb_dims, MAX_LEN)

    function get_sentence_matrix(sentence)
        embeddings = Vector{Array{Float64, 1}}()
        for word in sentence
            embedding = get_embedding(word)
            push!(embeddings, embedding)
        end
        embeddings = hcat(embeddings...)
        return embeddings
    end

    for i in 1:length(idxs)
        X_batch[1, i, :, :] = get_sentence_matrix(X[idxs[i]])
    end
    Y_batch = [Flux.onehot(label+1, 1:2) for label in Y[idxs]]
    return (X_batch, Y_batch)
end

, где X - это массив массивов слов, а функция get_embedding возвращает вложение в виде массива.

X_batchтогда Array{Float64,4}. Это правильный подход?

...