Я внедряю 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}
. Это правильный подход?